Git Internals
重命名检测与差异算法
理解 Git 的 rename 检测与 diff 算法有助于解释“为何这个改动显示为删除+新增或重命名”,并优化评审可读性。
- 想建立稳定 Git 心智模型的学习者
- 经常遇到历史、引用、恢复问题的开发者
- 会看基础命令输出
- 知道提交、分支、HEAD 这些名词
- 只背底层术语却不连接到实际命令
- 把对象、引用、工作区混成一层理解
Git 并不在对象层“记录文件被重命名”,重命名通常是 diff 阶段推断出来的。
重命名是如何推断的
Git 会基于内容相似度把“删除 + 新增”匹配为 rename。
旧文件路径新文件路径内容相似度
重命名检测行级 diff算法选择
重命名检测不是存储层的真实记录,而是 diff 时的推断。
为什么有时看起来像删了再新建
- 相似度阈值没达到
- 改动量太大
- 参数配置不同(例如是否启用重命名检测)
diff 算法影响什么
不同算法会影响 hunk 切分和可读性,进而影响 review 成本。
实战建议
在大规模重构中,先做“纯重命名提交”再做逻辑改动,通常能显著提升差异可读性。
diff 是展示与比较策略,不是对象数据库里的原生“事件日志”。
接下来建议继续看什么
tree objects and snapshotsgit-diffsmall batch review