Git如何回滚一个rebase

use*_*666 70 git

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

Git没有干运行的rebase.如果我做了一个rebase并且尚未推送它,我怎么回滚到之前,好像从未发生过?

Rob*_*bie 160

您可以使用reflog在rebase启动之前找到第一个操作,然后重置--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
Run Code Online (Sandbox Code Playgroud)

现在你应该在rebase开始之前回来.

要找到要重置的正确位置,您只需选择最接近顶部且不以"rebase"开头的条目.

替代方法

如果rebase是你在分支上做的唯一的事情,即你没有未提交的提交/更改 - 那么你可以删除本地分支,git branch -D然后再次检查:

$ git checkout my-branch
$ git rebase master
// not happy with result
$ git checkout master
$ git branch -D my-branch
$ git checkout my-branch
Run Code Online (Sandbox Code Playgroud)

或者为了同样的效果,你可以重置--hard到origin分支:

$ git reset --hard origin/my-branch
Run Code Online (Sandbox Code Playgroud)

如果您在进行其他未提交的提交时执行了此操作,那么您将丢失它们.在这种情况下,只需使用上面的reflog方法跳转到您进行提交的reflog条目.

  • 另一个方便的快捷方式:rebase将`ORIG_HEAD`设置为正在重新分支的分支的原始哈希值.因此,不要找到`HEAD @ {2}`的数字2,你可以只使用`ORIG_HEAD` ...但*只有*如果`ORIG_HEAD`仍未受干扰.一堆Git命令设置它(在各种情况下rebase,am,reset和merge). (9认同)

Mel*_*igy 28

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

git reset --hard ORIG_HEAD
Run Code Online (Sandbox Code Playgroud)

  • 您知道该标签记录在哪里吗? (2认同)