审阅一次文件整理提交时,同事看到的是“重命名并修改”,你看到的却是一处删除、一处新增。遇到这种差异,可以先核对比较范围和重命名检测参数。Git 的重命名标记来自比较结果,单凭这个标记,不能证明开发者当时执行过哪条文件操作命令。

Git 官方 gitdiffcore 文档给出的过程是:比较结果中原本有一个删除文件和一个新增文件,如果两者内容足够相似,重命名检测可以把这两项合并成一条重命名记录。这里判断的是旧内容与新内容的对应关系,并非只要文件名像就算重命名;多个候选存在时,也不能脱离其他候选,保证某一对一定被配上。

-M50% 把重命名检测的相似度阈值设为 50%。官方 git-diff 文档说明,重命名检测默认采用的相似度阈值也是 50%。-M100% 则把检测限定为内容完全相同的重命名。后者适合回答一个较窄的问题:哪些候选只是路径改变,文件内容没有改变?它不会把“移动时也编辑了内容”的情况都合并展示。这里的默认阈值也不等于所有编辑器界面都采用同一配置。

假设只有一对待比较的删除与新增文件,Git 算出的相似度是 80%,其他比较条件保持一致。这对候选满足 -M50% 的相似度要求,却不满足 -M100% 的要求。这是假设示例,没有运行仓库测试,也不是把“改了二十行”直接换算成 80%。切换阈值改变的是如何识别和展示差异,不会因为选了更高阈值,就让已经发生的内容修改消失。

看输出时还要分清门槛和得分。门槛是传入的筛选条件;原始差异格式中,R 后面的数字表示源文件与目标文件的相似度分数。补丁扩展头中的 similarity index 则以百分数显示,文档说明其为向下取整的整数,100% 留给内容相同的文件。相似度不是“有多大概率发生了移动”,更不是作者意图的置信度。

参数简写有一个容易漏看的细节:-M5 等价于 -M50%,-M05 却等价于 -M5%。没有百分号时,数字按前置小数点的分数解释。团队交流或记录审阅条件时,写出 -M50% 或 -M100% 能减少这种歧义,尤其不要把 -M05 误读成五成。

实际审阅时,可以先确认双方比较的是相同修订和路径范围,再看各自阈值。需要连着阅读路径变化与内容修改时,重点核对配对后的正文差异;只想核查内容完全相同的候选时,再看 -M100% 的结果。没有 R 不能单独说明开发者没移动文件,出现 R 也不能替代对旧路径、新路径和具体改动的检查。本文依据 2026 年 10 月 12 日读取的 Git 官方文档作资料解释,不涉及修改文件或仓库历史。

信息来源

本文基于上述公开资料整理,未使用来源页面的图片、视频或嵌入媒体。