我使用以下方法将我的分支重新version2对抗大师
git rebase --onto master version1 version2
Run Code Online (Sandbox Code Playgroud)
我该怎么撤消这个?
为了撤消它,我做到了 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)
Run Code Online (Sandbox Code Playgroud)
我想撤消这个rebase.
tor*_*rek 14
撤消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
Run Code Online (Sandbox Code Playgroud)
这aa4e140是HEAD分支的所在.这也可用于ORIG_HEAD:
$ git log -1 --oneline ORIG_HEAD
aa4e140 some commit msg...
Run Code Online (Sandbox Code Playgroud)
(如果需要,请使用更多日志,以确保您到达正确的位置.)
如果你做了一些其他的git事情,因为rebase 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
Run Code Online (Sandbox Code Playgroud)
瞧,事情已经恢复到你跑步前的样子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 ...
Run Code Online (Sandbox Code Playgroud)
但是这种reflog方法更为通用(无论你在中间做了什么,在rebase之后工作大约一个月1).
(1此处的时间段是可配置的;请参阅git reflog文档.默认的30天到期是针对"从分支的当前提示无法访问"的reflog条目",这通常是在rebase之前的旧提交的情况.)
理解的关键,为什么这个原理很简单:git rebase 让你的旧的提交.它只是向commit-graph添加了新的提交,然后移动了标签.随着标签移动,很难看到你的旧提交 - 它们默认情况下不显示,它们只在"reflog"中 - 但它们仍在那里.把标签放回去,新的提交是那些没有出现的,旧的提交都回来了!
小智 8
假设你没有修改version2分支,因为你重新设置它,你需要做的就是使用<reference>@{n}语法将分支硬重置到其第一个先前位置,其中n是引用的第N个先前位置:
git checkout version2
git reset --hard version2@{1}
Run Code Online (Sandbox Code Playgroud)