如何撤销feature-branch-2到feature-branch-1的Git变基操作?
恢复feature-branch-2到rebase前的初始状态
别担心,这种rebase之后发现问题想反悔的情况太常见了,咱们可以通过Git的reflog工具或者直接重置到已知提交来恢复,具体步骤如下:
方法1:用reflog找历史状态(最推荐,记不清原提交也能用)
- 先切回feature-branch-2:
git checkout feature-branch-2 - 查看所有HEAD的变更记录——Git的reflog会记下你所有的分支切换、提交、rebase操作,哪怕是修改历史的操作也留痕:
你会看到类似这样的输出(每条记录对应一次操作):git reflog
找到rebase开始之前的那条记录,也就是你在feature-branch-2上最后一次正常提交的那条(比如上面的a1b2c3 HEAD@{0}: rebase finished: returning to refs/heads/feature-branch-2 d4e5f6 HEAD@{1}: rebase: d: 这里是你feature-branch-2原提交d的信息 g7h8i9 HEAD@{2}: checkout: moving from feature-branch-1 to feature-branch-2 j0k1l2 HEAD@{3}: commit: d: 这里是你feature-branch-2原提交d的信息j0k1l2 HEAD@{3}: commit: d:...)。 - 硬重置到这个状态,彻底抹掉rebase带来的所有变更:
git reset --hard j0k1l2 # 或者直接用HEAD@{3}这种标记,根据你reflog里的实际编号来 git reset --hard HEAD@{3}
方法2:直接重置到已知的原提交哈希
如果你还记得feature-branch-2在rebase前的顶端提交是d,并且知道它的哈希值(可以通过git log --oneline develop查看,因为d是从b分支出来的),那可以更直接:
git checkout feature-branch-2 git reset --hard <提交d的哈希值>
重要提醒
git reset --hard会直接丢弃当前分支上所有未提交的修改,以及rebase带来的新提交,所以执行前一定要确认没有未保存的工作——如果有,可以先用git stash暂存起来,之后再用git stash pop恢复。- 完成操作后,feature-branch-2就会回到初始的
b -> c -> d状态,这时候你就可以安全地把它合并到develop分支了。
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

