使用on撤消git rebase

时间:2013-09-24 04:33:14

标签: git rebase

我使用以下方法将我的分支version2重新对抗主人:

git rebase --onto master version1 version2

如何撤消此操作?

要撤消它,我做了git reflog

目前,git status(在version2上)给了我:

Your branch and 'origin/version2' have diverged,
and have 2563 and 222 different commits each, respectively.
nothing to commit (working directory clean)

我想撤消这个rebase。

2 个答案:

答案 0 :(得分:14)

撤消git rebase的一种非常快速简便的方法是将分支标签放回去。

如果您确定要放弃当前的version2分支提示,则可以从git reflog开始(与您一样)。我也会在这里添加rebase步骤,我将留下一些“真正的”缩写参考:

$ git checkout branch
$ git rebase --onto master start-after branch
... rebase output ...
# oops! dag-nab-it! didn't mean to do that!

$ git reflog
<rev..> HEAD@{0}: rebase finished: returning to refs/heads/branch
<rev..> HEAD@{1}: rebase: some commit msg...
05f7dc8 HEAD@{2}: rebase: checkout master
aa4e140 HEAD@{3}: checkout: moving from master to branch

此处aa4e140是分支的HEAD所在的位置。这也可以在ORIG_HEAD中找到:

$ git log -1 --oneline ORIG_HEAD
aa4e140 some commit msg...

(如果需要,请使用更多日志,以确保您到达正确的位置。)

如果你在rebase之后做了一些其他的git事情,ORIG_HEAD可能已经移动了,但是reflog将具有正确的值。如果ORIG_HEAD和您在reflog中看到的内容一致,那么您肯定拥有正确的价值。无论哪种方式,请确保您拥有正确的值(并且您没有未保存的更改,git status是干净的 - 如果需要,您可以使用git stash)。

同时尝试git reflog version2,它会显示标签version2的历史记录。

现在只需强制当前分支 - 确保仍然是您想要更改的那个 - 到目标提交:

$ git branch
... see that you're still on "branch" or "version2" or whatever
$ git reset --hard aa4e140

瞧,事情已经恢复到你跑git rebase之前的状态。

如果你没有做任何改变ORIG_HEAD的事情,那就比这更容易了:

$ git log ORIG_HEAD # make sure that's what you want
...
$ git branch        # make sure you're on `version2`
...
$ git reset --hard ORIG_HEAD
HEAD is now at ...

但是reflog方法更通用(在rebase之后大约一个月 1 ,无论你做了什么)。

1 这里的时间段是可配置的;请参阅git reflog文档。默认的30天到期是针对reflog条目“无法从分支的当前提示”,这是通常情况下,旧的提交从一个rebase之前。)


理解为什么这一作用的关键很简单:git rebase 保留旧提交。它只是向commit-graph添加新提交,然后移动标签。随着标签移动,很难看到你的旧提交 - 它们默认情况下不显示,它们只在“reflog”中 - 但它们仍在那里。把标签放回去, new 提交是那些没有显示的提交,而旧的提交都回来了!

答案 1 :(得分:8)

假设您已经修改了version2分支,那么您需要做的就是使用<reference>@{n}语法将分支硬重置到其第一个位置,其中n是参考的第N个先前位置:

git checkout version2
git reset --hard version2@{1}