含子模块冲突的多Git提交合并差异原因及实现方案咨询
Git子模块多提交合并差异原因及解决方案
差异原因
- 合并2个提交时,Git默认使用递归合并策略,该策略允许在遇到子模块冲突时进入冲突状态,保留现场让你手动修复冲突后完成合并。
- 合并3个及以上提交时,Git会自动切换为章鱼合并策略,这个策略仅适用于无冲突的多分支合并场景,一旦遇到子模块这类无法自动调和的冲突,会直接终止合并流程,不会留下可修复的冲突状态——报错中的"Should not be doing an octopus"就是这个逻辑的体现。
多提交合并的实现方法
方法1:分步合并(兼容所有Git版本)
这是最稳妥的方式,通过多次双提交合并完成多分支整合:
- 切换到基础提交P:
git checkout P - 先合并A和B,修复子模块冲突后提交:
修复冲突后执行git merge A Bgit commit完成合并,得到中间合并提交M。 - 再将中间提交M与C合并,如有冲突继续修复后提交:
最终就能得到包含A、B、C所有变更的合并提交。git merge C
方法2:强制使用递归合并策略(Git 2.34+可用)
Git 2.34版本开始支持对多提交合并强制使用递归策略,这样遇到子模块冲突时会进入可修复的冲突状态:
git checkout P git merge --strategy=recursive A B C
修复子模块冲突后,执行git commit即可完成合并。
内容的提问来源于stack exchange,提问作者Luc Touraille
相关产品推荐
相关产品推荐

