9

I rebased my branch version2 against master using:

git rebase --onto master version1 version2

How can I undo this?

To undo it I did git reflog

Currently, git status (on version2) gives me :

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

I want to undo this rebase.

4

2 回答 2

17

撤消 a 的一种非常快速简便的方法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

aa4e140HEAD分支所在的位置。这也适用于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 ...

但是该方法更通用(无论您在这之间做了什么,都可以在 rebase 后reflog大约一个月1工作)。

1此处的时间段是可配置的;请参阅git reflog文档。默认的 30 天到期适用于“无法从分支的当前尖端访问”的 reflog 条目,这通常是在变基之前的旧提交的情况。)


理解为什么这样有效的关键很简单:git rebase 保留你的旧提交。它只是将新的提交添加到提交图,然后移动标签。随着标签的移动,更难看到你的旧提交——它们默认不显示,它们只在“reflog”中——但它们仍然在那里。把标签放回去,的提交是没有出现的,旧的都回来了!

于 2013-09-24T05:27:40.607 回答
8

假设您在重新设置分支后没有修改version2分支,您需要做的就是使用<reference>@{n}语法将分支硬重置到它的第一个先前位置,其中n是引用的第 N 个先前位置:

git checkout version2
git reset --hard version2@{1}
于 2013-09-24T05:06:35.227 回答