如何在branch1被Rebase后,将branch2重新Rebase到branch1上?
如何将branch2重新Rebase到Rebase后的branch1上
场景回顾
初始分支结构:
master: A - B - C - D \ branch1: E - F \ branch2: G - H
将branch1 Rebase到master后,branch1的提交哈希被重写,branch2与branch1失去关联,结构变为:
master: A - B - C - D \ branch1: E' - F' # 注:E'、F'是Rebase后生成的新提交,哈希与原E、F不同 branch2: G - H # 仍基于原branch1的旧提交F
解决方法
可以通过git rebase的--onto参数,将branch2上的提交(G、H)重新移植到新的branch1上,步骤如下:
切换到branch2
git checkout branch2定位branch2原本依赖的旧branch1提交
你需要找到原branch1中被Rebase覆盖的最后一个提交(也就是旧的F),可以通过以下方式获取:- 查看branch1的reflog记录,找到Rebase前的branch1位置:
输出里会有类似git reflog branch1abc123 branch1@{0}: rebase finished: ...的记录,上一条就是Rebase前的branch1位置(对应旧F的哈希),比如def456 branch1@{1}: commit: F,这里的def456就是旧F的哈希。 - 或者直接通过branch2的提交反向推导:因为G是基于旧F的提交,所以旧F是branch2的第2个父提交,用以下命令获取:
git rev-parse branch2~2
- 查看branch1的reflog记录,找到Rebase前的branch1位置:
执行带--onto的Rebase命令
把branch2中从旧F之后的提交(G、H)移植到新的branch1上:git rebase --onto branch1 <旧F的哈希> branch2替换
<旧F的哈希>为你找到的实际哈希值即可。
简化操作(如果能确认reflog记录)
如果刚完成branch1的Rebase,还能通过reflog的相对引用直接指定旧branch1的位置,无需手动找哈希:
git rebase --onto branch1 branch1@{1} branch2
branch1@{1}代表branch1上一次的状态,也就是Rebase前指向旧F的位置。
注意事项
- 操作要尽量及时,如果旧提交被Git的垃圾回收机制清理掉,就无法再找回了。
- Rebase过程中如果出现冲突,需要逐个提交解决冲突,解决后用
git add标记冲突文件,再执行git rebase --continue继续,直到完成。
内容的提问来源于stack exchange,提问作者C.Tale
相关产品推荐
相关产品推荐

