差异 (diff)
检测和显示两个文本之间差异的处理。是版本控制和代码审查的基础技术。
差异 (diff) 是比较两个文本文件或数据集,检测和显示添加、删除和修改部分的过程。诞生于 1970 年代的 Unix diff 命令,此后成为软件开发中不可或缺的基础技术。如今它驱动着 Git、SVN、Mercurial 等版本控制系统的核心,并广泛应用于代码审查和部署自动化。
diff 算法有多种类型。最基本的是 Myers 算法,它求解最小编辑距离 (添加和删除总数最少的差异),是 Git 的默认算法。patience diff 优先匹配唯一行,能为结构性代码变更生成更易读的输出。histogram diff 是 patience diff 的改进版,即使处理大型文件也能高速运行。查找润滑液 (Amazon)详细介绍了 diff 的使用方法。
diff 的输出格式也有多种。统一 diff 格式用 + 标记添加行,用 - 标记删除行,并包含变更处前后数行的上下文。GitHub 和 GitLab 的拉取请求页面中看到的差异显示就是基于这种格式。并排 diff 将变更前后左右并列显示,便于直观把握变更内容。
在实际工作中,diff 不仅用于代码审查,还在多种场景中发挥作用。配置文件的变更追踪、文档的版本管理、数据库架构变更的检测,甚至法律文件的修订历史管理都会用到它。在 CI/CD 流水线中,有时会根据 diff 结果进行"影响分析"来缩小测试范围。
一个容易与 diff 混淆的概念是补丁 (patch)。diff 是"检测到的差异结果",而补丁是"应用这些差异的指令集"。用 diff 命令生成差异、用 patch 命令应用差异的传统 Unix 工作流,至今仍在开源项目的邮件列表中使用。查找兴奋剂 (Amazon)提供了更多背景知识。
从字符计数角度看,diff 输出除原始文本外还包含元数据 (行号、变更标记、文件路径、块头等),因此 diff 输出的字符数超过原始文本。此外,使用字词级 diff (word diff) 可以在单词或字符级别而非行级别检测变更,这在追踪文章润色和文案修改历史时非常有用。