如何在Git中撤销最近的本地提交?

26051
我不小心提交了错误的文件到Git,但还没有将提交推送到服务器。
我该如何从本地仓库撤销这些提交?

684
你知道git需要什么?就是"git undo",这样一来,git对于我们这些凡人所犯下的错误的处理名声就消失了。实现的方法是在执行任何"git"命令之前将当前状态推送到git堆栈上。这会影响性能,所以最好增加一个配置标志来决定是否启用它。 - Yimin Rong
57
可以使用Git的“alias”功能来完成这个操作:https://git-scm.com/book/zh/v2/Git-基础-Git-别名 - Edric
134
针对VsCode用户,只需按下ctrl+shift+G,然后单击三个点,即“更多选项”,接着再点击“撤销上一次提交”。请注意,翻译过程中不会添加解释或其他任何额外信息。 - ashad
29
您要撤销的是什么?有很多不同的功能用例,其中“撤销”意味着完全不同的事情。我敢打赌,添加一个新的花哨的“魔法棒”只会更加混淆事情。 - Romain Valeri
50
不太相信,人们仍然会弄乱并撤销不应该撤销的事情。但更重要的是,git reflog 已经接近你所描述的内容,但它给用户更多的控制权来确定需要(撤销)做的事情。但是请注意,“撤销”在各个地方的工作方式不同,人们会期望这个功能实现许多不同的事情。撤销上一个提交?撤销上一个操作?如果最后一个操作是推送,如何撤销,(重置并推送)还是(撤销并推送)? - Romain Valeri
显示剩余10条评论
107个回答

23

HEAD:

在重置提交之前,我们应该了解 HEAD... HEAD 就是你当前工作目录中的状态。它由一个提交号表示。

Git 提交:

每个更改都被分配给一个提交,用一个唯一的标签表示。提交不能被删除。所以如果你想要回到上一个提交,可以简单地使用 git reset

有两种方法可以进入最后一个提交:

方法 1:(如果你不知道提交号码,但想要移动到第一个提交)

git reset HEAD~1  # It will move your head to last commit

方法2:(如果您知道要重置到的提交,请直接重置到已知提交)

git reset 0xab3#提交编号

注意:如果您想了解最近的提交,请尝试git log -p -1

这是图形表示:

输入图像说明


21

只需使用 git reset --hard <上一个正确的 SHA 值> 来撤销您的更改并创建新的提交。您也可以使用 git checkout -- <错误的文件名>


20
git reset --soft HEAD~1

git status

输出

在主分支上
您的分支领先于'origin/master' 1个提交
(使用"git push"将本地提交发布)

要提交的更改:
(使用"git restore --staged ..."取消暂存)
新文件: file1

git log --oneline --graph

输出

  • 90f8bb1 (HEAD -> master) 第二次提交 \
  • 7083e29 初始存储库提交 \

20

在选择具体工具(命令)之前,请先确定您需要什么,而不是盲目运行命令。

修改提交

  • 如果您想要编辑您的最后一次提交,有一个命令可以使用。

  • 优点:它允许您更正最后一次提交的消息,并添加更多的更改。

    git commit --amend
    

重置提交

  • 真的想要撤销最后一次提交(因为有大量更改或者您想要全部丢弃)。

  • 优点:重置命令将返回到当前版本之前的版本,有效地撤消了最后一次提交。

A. 软重置

优点:软标记。它保证了在撤消版本中所做的修改的保存。运行该命令后,更改将出现在您的工作副本中,作为未提交的本地修改。

git reset --soft HEAD~1

B. 强制重置

优点:如果您不想保留这些更改,只需使用--hard标志。请确保仅在确信不再需要这些更改时执行此操作。

git reset --hard HEAD~1

撤销上次提交但保留文件更改

优点:

这个命令会告诉 Git 将 HEAD 指针向后移动一个提交。但是,文件的修改不会受到影响。现在,如果你运行 git status,应该仍然能够看到本地文件的更改。

git reset HEAD~1

根据您的需求使用。


20

如果您想要删除错误文件,您应该执行以下操作:

git reset --soft <您最后一个正确的提交哈希值>

在这里,如果您执行git status,您将会在暂存区中看到这些文件。您可以选择错误的文件并将它们从暂存区中移除,如下所示:

git reset 错误文件1 错误文件2 错误文件3

现在您只需添加需要推送的文件:

git add 正确文件1 正确文件2

提交更改:

git commit -vgit commit -am "信息"

然后推送:

git push origin master

但是,如果您不关心更改的文件,您可以硬重置为以前正确的提交,并将所有内容推送到服务器上。方法如下:

git reset --hard <your_last_good_commit_hash_here>

git push origin master

如果您已经将错误的文件发布到服务器上,您可以使用--force标志向服务器推送并编辑历史记录。

git push --force origin master


18

在IntelliJ IDEA中,您只需按下Alt+9,右键单击提交列表中的某个标记,并选择:"Reset Current Branch to Here..."即可打开Git存储库日志。


18

每次需要撤销一个或多个提交时,我所做的是:

  1. git reset HEAD~<n> // 撤销最近的 n 个提交

  2. git status // 可选。现在所有文件都是红色的(未暂存)。

  3. 现在,我可以仅添加和提交我需要的文件:

  • git add <file names> & git commit -m "message" -m "details"
  1. 可选:如果需要还原其余文件的更改到以前的状态,则可以使用checkout:
  • git checkout <filename>
  1. 如果之前已将其推送到远程原始版本库:
  • git push origin <branch name> -f // 使用-f参数来强制推送。

18

当您想保持历史记录干净时,变基和删除提交是最好的选择, 在向公共分支提供补丁时非常有用。

如果您必须删除最上面的提交,则可以使用以下一行命令:

git rebase --onto HEAD~1 HEAD

但是如果你想要撤销你所做的多个提交中的其中一个,比如:

a -> b -> c -> d -> 主分支

而你想要撤销提交 'c'

git rebase --onto b c

这将把'b'作为'd'的新基础,消除'c'


17

enter image description here

假设您在使用Visual Studio进行工作,如果您进入分支历史并查看所有提交记录,只需选择要撤消的提交之前的事件,右键单击它,然后选择还原。 就这么简单。


16

为了撤销最近的本地提交,但不丢弃其更改,我在 ~/.gitconfig 中设置了这个方便的别名。

[alias]
  undo = reset --soft HEAD^

然后我只需使用git undo,这非常容易记忆。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接