Git如何回滚一个rebase操作

167

在Git中,如果你不满意之前的变更,并想要回滚rebase(变基),该怎么做?

Git没有用于rebase的dry-run(干运行)功能。如果我已经进行了rebase操作并且还没有推送到远程仓库,我应该如何回滚到之前的状态,就好像从未发生过一样?


4
git rebase --abort - olibiaz
2
你说的“失败”是什么意思?是指你完成了变基操作,但不满意结果吗?还是在变基过程中遇到冲突,想要停止变基操作?我猜应该是前者,因为有冲突的未完成的变基操作是无法推送的,但我还是问一下,因为这是两个不同的问题。 - Edward Thomson
是的,前者。谢谢。 - user1615666
3
可能是 撤销 git rebase 的重复问题。 - Jon Schneider
2个回答

329

你可以使用reflog来查找重置操作之前的第一个动作,然后使用reset --hard命令回到该动作。例如:

$ 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

或者为了达到相同的效果,您可以将 --hard 重置到原始分支:

$ git reset --hard origin/my-branch

如果在有其他未推送的提交时执行了此操作,则这些提交将会丢失。在这种情况下,只需使用上面介绍的reflog方法跳转回你做这些提交的reflog条目。


13
另一个方便的快捷方式:rebase 命令会将 ORIG_HEAD 设置为正在进行变基操作的分支的原始哈希值。因此,您可以直接使用 ORIG_HEAD 而不必查找 HEAD@{2} 中的数字 2...但是,前提是 ORIG_HEAD 仍然没有被修改。一些 Git 命令(在各种情况下)会设置它,包括变基、应用、重置和合并。 - torek
1
谢谢您,先生!这真的帮了我很多 :) - heyitsalec
1
感谢您归还我的源代码....在使用 $ git reset HEAD@{2} --hard 后。 - reza rahmad
建议只需删除本地分支并重新拉取即可,我会点赞的! - quicklikerabbit
1
@Robbie,我多么希望能够给你一个赏金。谢谢。 - Samuel
显示剩余2条评论

73

Rebase会把旧状态备份为ORIG_HEAD,因此你可以通过运行以下命令来还原最后的rebase:

git reset --hard ORIG_HEAD

2
你知道那个标签在哪里有文档吗? - Ben S
这是否有什么缺点或是一个新功能?这似乎比筛选 reflog 要容易得多。 - 1252748
1
这并不是新东西。但通常在rebase之后使用它,不能在几次rebase之后回溯。对于这些复杂情况,你需要寻找relog的东西,但对于只是“哎呀,我刚才做了什么?现在怎么还原?”这种情况,它完全可以胜任。 - Meligy
1
这对我来说是最简单、最有效、最直接的回滚方法! - Jordan
1
这绝对是迄今为止最简单的方法! - Godwin Mathias

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