Git分支合并冲突判定规则及异常场景咨询
Git冲突判定逻辑详解
Git的冲突判定不依赖最终分支的行号,核心是基于共同祖先版本对比两个分支的变更范围:
- 先找到两个分支最近的共同祖先文件版本
- 分别计算当前分支("我们的分支")和待合并分支("他们的分支")相对于祖先的变更内容
- 只有当两组变更修改了祖先版本中同一/重叠区域的内容,且无法自动合并时,才会触发冲突。
针对你提到的几种情况:
- 第36行vs36行、第49行vs49行未触发冲突:
看起来是两个分支的最终行号一致,但实际在共同祖先版本中,这两处修改对应的是不同的内容区域。比如其中一个分支在修改目标行之前,已经对文件做了增删行操作,导致最终行号巧合对齐,但修改的是祖先版本里的不同行;或者其中一个分支的修改内容和祖先版本完全一致,只有另一个分支做了变更(这种情况Git会直接采纳变更,不会冲突)。 - 第65行vs69行未触发冲突:
行号差异说明至少一个分支在目标行之前有增删行操作,导致行号偏移。这两处修改在共同祖先版本中属于完全不重叠的内容区域,Git判定为独立变更,因此自动合并,不触发冲突。 - 第110行vs114行触发冲突:
虽然两个分支的最终行号不同,但这两处修改对应的是共同祖先版本中的同一行/重叠区域。比如分支A修改了祖先的某行后删除了部分行,分支B修改了同一行后又添加了部分行,导致最终行号偏移,但Git能识别到两组变更针对的是祖先版本的同一内容,且修改内容无法自动合并(比如两边对同一行的修改完全不同),因此触发冲突。
内容的提问来源于stack exchange,提问作者zackOverflow
相关产品推荐
相关产品推荐

