如何在git中撤销一个提交?

86

我对git的工作原理不太熟悉。我不小心推了一个提交并想要撤销它。我执行了

git reset --hard HEAD~1

注意,同行的谷歌用户们: 这不仅会撤销提交,还会丢弃所有文件更改!

现在,该项目在我的机器上已经回滚了,但在 GitHub 上没有。如果我尝试推送此代码,将会得到错误提示“Your branch is behind 'origin/master' by 1 commit, and can be fast-forwarded.” 那么我如何从 GitHub 中删除这次提交?


git push -f 解决了问题。谢谢。 - David Mulder
快进消息只是一个提示,不是真正的错误。如果您在每次提交后没有进行“push”,那么这是您会收到的正常消息。 - eckes
5个回答

80

这个文章非常好地解释了如何处理不同的场景(包括提交和推送之前已经完成提交或仅是提交):

从文章中,我看到最简单的撤销先前提交的命令是通过 commit id:

git revert dd61ab32

1
这会丢弃更改。 - Merlin

47

您可以使用git push --force,但请注意,这会重写历史记录,正在使用该代码库的任何人都会遇到问题。

如果您想要避免此问题,不要使用reset,而是使用git revert


5
通常情况下,我认为改写历史不是一个好主意,特别是在共享的环境中。选择使用“git revert”命令。 - trimbletodd
5
注意:git revert <commit id>会从磁盘中删除新添加的文件。幸运的是我在vscode中打开了它们并使用了cmd+s保存。 - valem

20

14

无法对他人的回答进行评论,我将提供一些额外的信息。

如果要撤销上一次提交,可以使用git revert head命令。head指的是您分支中最近的提交。

在使用reset时,您使用head~1的原因是告诉Git“从head之前的提交”(head~1)“删除所有提交后的更改”(reset --hard)。

reset是针对一个提交进行操作,而revert是对一个提交进行操作。

正如AmpT所指出的,您还可以使用提交SHA来标识它,而不是计算距离head有多远。这个SHA可以在日志(git log)和其他许多地方找到。

您也可以随时使用Git中的任何其他指针。例如,标签或分支。并且还可以使用所有这些有趣的其他引用提交的方式:https://www.kernel.org/pub/software/scm/git/docs/git-rev-parse.html#_specifying_revisions


“重置是回到提交状态,还原是在某个提交状态下进行的。” <= 谢谢这句话,我恍然大悟。 - brichins

3

我认为你需要推送一个撤销提交。所以再次从Github上进行pull,包括您想要撤销的提交,然后使用git revert并推送结果。

如果您不关心其他人克隆您的Github存储库时出现问题,可以在reset之后删除并重新创建Github上的主分支:git push origin :master


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