Git diff显示分支完整差异,merge仅识别部分差异的原因及解决方法
问题原因
Git合并采用的是三路合并算法,核心逻辑是对比两个分支的当前版本与它们的共同祖先版本:
- 如果
addition()和subtraktion()是在共同祖先之后,分别在两个分支独立添加的,且这两个方法的代码没有重叠、也未修改同一行/相邻行代码,Git会自动完成这部分内容的合并,不会标记为冲突。 - 只有当两个分支修改了同一行或相邻区域的代码(比如你示例中的打印语句),Git无法自动判断保留哪部分时,才会标记为冲突。
- 而
git diff是直接对比两个分支的当前版本,会显示所有差异(不管是否能自动合并),所以看起来和merge的结果不一致。
解决方法
Git其实已经自动合并了两个方法,你只需要处理那处冲突的打印语句,就能得到包含所有方法的文件:
- 打开
Math.java,修改冲突块(比如保留需要的打印内容,或者调整成符合需求的代码),删除<<<<<<< HEAD、=======、>>>>>>>这些标记。 - 执行
git add Math.java标记冲突已解决。 - 执行
git commit完成合并操作。
删除重新复制文件没用,因为Git是基于版本历史的合并逻辑,不是单纯对比文件当前内容。
内容的提问来源于stack exchange,提问作者jwberlin
相关产品推荐
相关产品推荐

