如何回滚之前的两次提交?

112

考虑以下情况:

  1. 开发者 A 提交了一个代码变更: #n
  2. 开发者 B 提交了一个代码变更:#n+1
  3. 开发者 A 提交了代码变更:#n+2
  4. 并提交了代码变更:#n+3

之后,开发者 A 发现他在提交 #n+2 中引入了一个缺陷。

开发者 A 怎样回滚他最近的 2 次提交并继续基于提交 #n+1 进行开发?

尝试使用git reset --hard HEAD~2*,但它会回到开发者 A 的提交 #n


5
如果你在那个时刻已经拉取了B次提交,那么 "git reset HEAD~2" 应该重置到第n+1个提交。你有拉取过它们吗? - Snowbear
1
不要在 #n+2 提交之前提交。它是这样的:[0] B 推送了 commit #n+1,[1] A 提交了 #n+2,[2] 不成功的 push,[3] pull,[4] push。因此现在在 GitHub 上有一个提交 (#n+2) 和一个合并分支 'master' (#n+3)。 - Marius Butuc
3
如果您已经发布了提交,就不应该使用reset来撤销它(如果其他开发者拉取了这个提交,这会带来麻烦)。相反,应该使用revert并创建一个新的提交来使代码回到您想要的状态。不要更改已发布的历史记录。请参考http://book.git-scm.com/4_undoing_in_git_-_reset,_checkout_and_revert.html。 - William Pursell
2
可能是如何在Git中撤消最后一次提交?的重复问题。 - Jim Fell
2个回答

163

它应该回到第n+1次提交。你可能还有一个合并提交。你也可以使用 git reset --hard <sha1_of_where_you_want_to_be>

警告!!--hard 表示您当前拥有的任何未提交的更改将被永久丢弃。


4
我如何获取远程提交的sha1值(不是我所做的)? 我尝试使用 git reflog 命令,但我只能访问我的本地 reflog 信息,例如提交 #n、#n+2、#n+3... 而不是 #n+1。 - Marius Butuc
18
我从 git log 得到了想要的 sha1,但还需要进行 git push -f,以便在 Github 上反映出修改。 - Marius Butuc
1
是的,但我不知道你也想更新远程的 :) - Adam Dymitruk
33
警告!--hard 表示你当前未提交的更改将被永久丢弃。如果要回滚到以前的提交但不丢弃您的工作,请使用 --soft - Ken M. Haggerty
4
请解释使用--hard而不是--soft的用途。 请使用“--hard”选项而不是“--soft”选项可以强制执行所做更改,并永久地应用它们,这意味着如果出现问题,将难以撤消更改。相比之下,“--soft”选项更为灵活,因为它只会暂时应用更改,并且可以轻松地回滚到之前的状态。 - iuridiniz
显示剩余4条评论

26

我建议使用类似这样的东西:

git reset --soft <commit_hash>

如果您不想撤销到该点之前的所有更改,那么请使用“--hard”而不是“--soft”,这样可以在不丢弃提交中所做的所有更改的情况下让您到达树中所需的点。

当我阅读时,我尝试了“--HARD”,但不幸的是,它删除了我在该点之前的所有更改。因此,请注意您是否希望删除它们。

如果您像我一样不走运,请尝试这个!:git revert <commit_hash>


这个答案比被采纳的答案更有帮助,因为当我撤销更改时,通常是因为我在错误的分支上提交了工作。使用“--soft”更好,因为如果需要,我总是可以删除文件。 - Dave Thompson
同意。如果您使用 --soft,则可以切换分支并保留工作目录更改,因此您可以随意处理它们。 - Andy Keith
这个答案正是我所需要的。我撤销了本地提交并且也拿回了我的文件。即使这个答案与问题不同,我还是点了赞。 - Mashmoom

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