如何保留合并提交,将互相关联的两个Git分支变基到目标分支?
Git变基保留合并提交的分支同步解决方案
问题背景
原提交历史
A - B - C - D - E [master] |\ | I - J - m1 - K - L - m2 - O [topic-a] \ / / P - R - S ------- T - U [topic-b]
工作流:topic-b定期合并到topic-a分支。
需求
将topic-a和topic-b变基到master的E提交,保留所有合并提交(无需手动重新应用合并,自动复用原有合并结果),后续可继续维持topic-b合并到topic-a的工作流,且合并记录可追溯。预期结果:
A - B - C - D - E [master] |\ | I' - J' - m1' - K' - L' - m2' - O' [topic-a] \ / / P' - R' - S' -------- T' - U' [topic-b]
后续还需将分支变基到独立的master-2分支,计划用git rebase --onto完成。
已尝试方法
试过git rebase --rebase-merges、merge、cherry-pick、apply、am等命令,未找到合适的解决组合。
解决方案步骤
1. 先变基topic-b到master的E提交
topic-b的起始提交是C,直接将C之后的提交重放至E上:
git checkout topic-b git rebase --onto master C
执行后topic-b会变为P' - R' - S' - T' - U',基于E提交。
2. 变基topic-a并保留合并拓扑
使用--rebase-merges参数保留原分支的合并结构,同时指定重放范围:
git checkout topic-a git rebase --rebase-merges --onto master C
--rebase-merges会自动保留原有的合并提交(m1、m2),无需手动编辑合并脚本;- 由于你确认合并无文件冲突,Git会直接复用原合并结果,自动关联变基后的
topic-b提交,生成符合预期的I' - J' - m1' - K' - L' - m2' - O'序列。
3. 验证结果
执行以下命令查看提交拓扑,确认和预期一致:
git log --graph --oneline --branches=topic-a,topic-b,master
4. 后续变基到master-2分支
重复类似逻辑,先处理依赖分支:
# 变基topic-b到master-2 git checkout topic-b git rebase --onto master-2 E topic-b # 变基topic-a到master-2并保留合并结构 git checkout topic-a git rebase --rebase-merges --onto master-2 E topic-a
关键注意事项
- 确保Git版本≥2.22,
--rebase-merges参数从该版本开始支持; - 先处理
topic-b再处理topic-a,能保证合并提交的父引用正确指向变基后的分支,避免拓扑混乱; - 若后续合并出现冲突,需手动解决,但本次变基因无文件修改可自动完成。
内容的提问来源于stack exchange,提问作者mcpiroman
相关产品推荐
相关产品推荐

