Git Internals

重命名检测与差异算法

理解 Git 的 rename 检测与 diff 算法有助于解释“为何这个改动显示为删除+新增或重命名”,并优化评审可读性。

适合谁看
  • 想建立稳定 Git 心智模型的学习者
  • 经常遇到历史、引用、恢复问题的开发者
前置知识
  • 会看基础命令输出
  • 知道提交、分支、HEAD 这些名词
常见风险
  • 只背底层术语却不连接到实际命令
  • 把对象、引用、工作区混成一层理解

Git 并不在对象层“记录文件被重命名”,重命名通常是 diff 阶段推断出来的。

重命名是如何推断的

Git 会基于内容相似度把“删除 + 新增”匹配为 rename。

重命名检测与 Diff 算法Git 通过内容相似度推断重命名,diff 算法决定了合并时如何匹配行级差异。
输入
旧文件路径新文件路径内容相似度
输出
重命名检测行级 diff算法选择
重命名检测不是存储层的真实记录,而是 diff 时的推断。

为什么有时看起来像删了再新建

  • 相似度阈值没达到
  • 改动量太大
  • 参数配置不同(例如是否启用重命名检测)

diff 算法影响什么

不同算法会影响 hunk 切分和可读性,进而影响 review 成本。

实战建议

在大规模重构中,先做“纯重命名提交”再做逻辑改动,通常能显著提升差异可读性。

不要把 diff 结果当对象事实

diff 是展示与比较策略,不是对象数据库里的原生“事件日志”。

接下来建议继续看什么

  1. tree objects and snapshots
  2. git-diff
  3. small batch review