为什么git diff在不同文件修改场景下会出现不一致的表现?
Git Diff 差异呈现逻辑说明
Git Diff 默认使用 Myers 差分算法,该算法的核心目标是找到两个版本文件之间的「最小编辑序列」(新增/删除操作的总次数最少),同时尽可能多保留相同的上下文内容,它的输出结果只和原始版本、最终版本的内容有关,和你实际修改操作的先后顺序、操作步骤没有任何关系。
先明确文件版本的字节构成(以换行符\n为行分隔标识)
- 原始版本内容(共3行,最后一行无末尾换行):
\n \n b
- 同时修改后的最终版本内容(共4行,最后一行带末尾换行):
a\n \n \n b\n
第三种场景的 Diff 输出逻辑解释
你观察到的「不是前两个场景Diff的叠加」是正常现象:
- 前两个场景的Diff是分别将「单次修改后的版本」和原始版本对比得到的局部最优差异表达
- 当两个修改同时存在时,算法会直接对比「原始版本」和「最终版本」,重新计算全局最优的最小编辑序列:
- 算法首先匹配到两个版本中间的连续两个空行为公共内容,不需要修改
- 只需要做三个编辑操作:开头新增带
a的行、删除原始版本末尾无换行的b行、新增带末尾换行的b行 - 这个编辑序列的总操作次数比「叠加两个单独场景的编辑操作」更少,所以算法选择了这种呈现方式
你理解的「先加a、再改b的换行、最后删多余空行」只是Diff呈现给你的编辑顺序,不是你实际操作的还原,这是Myers算法的正常表现。需要注意的是,Diff只是差异的可视化呈现方式,不管它怎么展示编辑顺序,都不会影响文件的最终内容,也不会影响Git的提交、合并等操作的结果。
内容的提问来源于stack exchange,提问作者tianzhich
相关产品推荐
相关产品推荐

