Git 如何回滚 rebase

在 Git 中,如果对 rebase 不满意,如何回滚它?

Git 没有对 rebase 的演练。如果我做了一个 rebase 并且还没有推它,我如何回滚到之前,就好像它从来没有发生过?

120839 次浏览

您可以使用 重新测试来查找 rebase 开始之前的第一个操作,然后重新设置——很难回到它。例如:。

$ git reflog


b710729 HEAD@{0}: rebase: some commit
5ad7c1c HEAD@{1}: rebase: another commit
deafcbf HEAD@{2}: checkout: moving from master to my-branch
...


$ git reset HEAD@{2} --hard

现在您应该回到 rebase 开始之前。

为了找到合适的重置位置,您只需选择最靠近 没有以“ rebase”开始的顶部的条目。

更新: 正如在评论和其他答案中提到的,您也可以使用 ORIG_HEAD作为一种更容易的方法来找到在哪里重置到: git reset ORIG_HEAD --hard

另一种方法

如果 rebase 是您在分支上执行的 只有一件事,也就是说,您没有未推送的提交/更改——那么您可以使用 git branch -D删除本地分支,然后再次检查它:

$ git checkout my-branch
$ git rebase master
// not happy with the result
$ git checkout master
$ git branch -D my-branch
$ git checkout my-branch

或者为了达到同样的效果,你可以重置——很难到原点分支:

$ git reset --hard origin/my-branch

如果您在其他未推送的提交期间执行了此操作,那么您将失去它们。在这种情况下,只需使用上面的 reflog 方法就可以跳回到进行提交的 reflog 条目。

Rebase 将旧状态的备份保留为 ORIG_HEAD
因此,可以通过运行以下命令恢复最后一个 rebase:

git reset --hard ORIG_HEAD