撤消 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
这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 ...
但是该方法更通用(无论您在这之间做了什么,都可以在 rebase 后reflog
大约一个月1工作)。
(1此处的时间段是可配置的;请参阅git reflog文档。默认的 30 天到期适用于“无法从分支的当前尖端访问”的 reflog 条目,这通常是在变基之前的旧提交的情况。)
理解为什么这样有效的关键很简单:git rebase
保留你的旧提交。它只是将新的提交添加到提交图,然后移动标签。随着标签的移动,更难看到你的旧提交——它们默认不显示,它们只在“reflog”中——但它们仍然在那里。把标签放回去,新的提交是没有出现的,旧的都回来了!