父分支完成rebase后,子分支如何正确变基同步?
解决方案
不用手动逐个cherry-pick,用Git rebase的--onto参数就能一步完成同步,全程只需要几行命令,不会漏提交也不会出错。
最快操作(无需手动查提交ID)
如果你刚完成Branch_A的rebase,还没有对Branch_A做过其他提交、重置类操作,直接执行:
git checkout branch_B git rebase --onto branch_A branch_A@{1}
执行完Branch_B就会自动把所有自身独有的提交,全部迁移到最新的Branch_A顶端,分叉问题直接解决。
通用操作(任何状态下都能用)
如果做完Branch_A的rebase之后已经做过其他操作,branch_A@{1}指向的不是rebase前的旧Branch_A头,就按以下步骤操作:
- 执行
git reflog branch_A,在输出里找到你给Branch_A执行rebase操作之前,Branch_A对应的提交哈希(记为old_A_head,reflog里一般会直接标注rebase (start): checkout xxx类提示,辨识度很高) - 执行以下命令完成迁移:
git checkout branch_B git rebase --onto branch_A old_A_head
命令原理
带--onto的rebase是三参数模式,逻辑非常清晰:
- 跟在
--onto后面的第一个参数,是提交要迁移到的目标基点,这里就是最新的branch_A - 第二个参数是要迁移的提交段的起点边界,Git会自动截取这个边界点之后、当前Branch_B上的所有独有提交,不会把已经被rebase替换掉的旧Branch_A提交重复搬过来
- 操作完成后的分支拓扑会直接回到预期的线性结构:
最新master -> 最新branch_A -> 最新branch_B,没有多余分叉。
操作提示
- 迁移过程如果遇到代码冲突,和普通rebase处理逻辑完全一致:解决冲突文件后执行
git add <冲突文件路径>,再跑git rebase --continue即可 - 操作前可以先切个备份分支防失误:
git branch branch_B_bak,就算操作出错随时能切回备份分支重来,零风险 - 如果之前已经把Branch_B推到远程仓库,rebase完提交哈希会发生变化,推送时用
git push --force-with-lease即可,不要用裸--force,避免误覆盖协作者的提交
内容的提问来源于stack exchange,提问作者user38643
相关产品推荐
相关产品推荐

