我使用以下方法将我的分支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。
答案 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}