Git分支存在合并提交时,如何压缩指定提交并复用原有合并结果?
解决方案:复用原有合并提交的树
当你使用git rebase -i A --rebase-merges时,默认Git会重新执行合并操作——即便压缩U、V后的提交树与原提交完全一致。要让Git直接复用M1、M2的合并结果,无需重新解决冲突,可以通过以下两种方法实现:
方法一:修改Rebase Todo文件指定复用合并提交
- 执行基础Rebase命令:
git rebase -i A --rebase-merges - 在弹出的todo编辑界面中做两处修改:
- 将U的操作设为
pick,V的操作设为fixup(若需要调整提交信息,可改为squash); - 找到对应M1、M2合并提交的行,默认格式类似:
将行中的merge -C <临时提交ID> refs/heads/master # Merge branch 'master' into feature<临时提交ID>替换为原M1、M2的提交ID,修改后示例:merge -C M1 refs/heads/master # Merge branch 'master' into feature merge -C M2 refs/heads/master # Merge branch 'master' into feature
- 将U的操作设为
- 保存并退出编辑器,Git会直接复用M1、M2原有的合并结果完成Rebase,无需重新处理冲突。
原理说明
-C <commit-id>参数告诉Git:创建新合并提交时,直接复用指定提交的文件树和提交信息,而非重新执行合并计算。由于你压缩U、V后的提交树与原V的树完全一致,原M1合并master分支C与V的结果,和合并C与压缩后提交的结果完全相同,因此Git可以安全跳过冲突检测步骤。
方法二:手动创建压缩提交后嫁接分支
如果觉得修改todo文件麻烦,也可以手动构建分支:
- 先创建U、V的压缩提交:
git checkout V git reset --soft U^ git commit -m "合并U和V的提交信息" # 此步骤生成新提交U' - 将原feature分支中M1及之后的提交嫁接到U'上,保留合并结构:
由于U'的文件树与原V完全一致,Git会自动识别合并结果与原M1、M2匹配,无需重新解决冲突。git rebase --onto U' V feature --rebase-merges
内容的提问来源于stack exchange,提问作者pintoch
相关产品推荐
相关产品推荐

