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

Posted

技术标签:

【中文标题】如何回滚之前的两个提交?【英文标题】:How to rollback the two previous commits? 【发布时间】:2011-06-13 08:53:48 【问题描述】:

考虑这种情况:

    开发者 A 提交:#n 开发。 B 确实提交了 #n+1 开发。 A 确实提交了 #n+2 并提交 #n+3

然后发现在他的提交 #n+2 中他引入了一个缺陷。

如何开发。回滚他的最后 2 次提交并继续开发提交 #n+1

试过git reset --hard HEAD~2*,但它又回到了开发者A的提交#n

【问题讨论】:

git reset HEAD~2 应该重置为 #n+1 提交,如果你当时已经拉了 B 次提交。你拉他们了吗? ...不是在 #n+2 提交之前。它是:[0] B 推 commit #n+1, [1] A committed #n+2, [2] 不成功 push, [3] pull, [4] push .所以现在在 github 上有一个提交 (#n+2) 和一个合并分支“master”(#n+3)。 如果你已经发布了提交,你不应该使用reset来回滚它。 (如果你不知道的其他开发人员拉了,这将导致痛苦。)相反,使用 revert 并进行新的提交,将你带到你想要的状态。切勿更改已发布的历史记录。见book.git-scm.com/… How to undo last commit(s) in Git?的可能重复 【参考方案1】:

它应该回到 n+1 提交。您可能在那里也有一个合并提交。你也可以git reset --hard <sha1_of_where_you_want_to_be>

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

【讨论】:

如何获得远程提交的 sha1(不是我做的)?我尝试使用git reflog,但我只能访问我的本地 reflog 信息,例如,提交 #n、#n+2、#n+3... 但不能 #n+1 我从git log 得到了我想要的sha1,但还需要git push -f,所以修改会反映在github上。 是的,但我不知道你也想更新遥控器 :) 警告!! --hard 表示您当前拥有的任何未提交的更改都将被永久丢弃。要回滚到之前的提交而不丢弃您的工作,请使用--soft 请解释使用--hard而不是--soft【参考方案2】:

我建议改用这样的东西:

git reset --soft <commit_hash>

除非您希望它删除该点之前的所有更改,否则在这种情况下使用--hard 而不是--soft,它将带您到达树中所需的点,而不会删除所有更改提交。

当我阅读时,我尝试使用 --HARD 并且不幸的是,它删除了我到那时为止的所有更改。因此,请注意是否要删除它们。

所以,如果你像我一样不走运,试试这个! :git revert &lt;commit_hash&gt;

【讨论】:

以上是关于如何回滚之前的两个提交?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SQL Server 中回滚或提交事务

如何使用 codeigniter 中的事务进行基于数据更改的提交和回滚?

github上测试服出现bug,如何回滚并获得合并之前的分支

ROLLBACK语句只能针对未提交的事务进行回滚操作,已提交的事务是不能回滚的?

搞懂spring事务

Git 回滚到某个历史节点(sourcetree操作)