
什么是文本差异比较?
文本差异比较(differencing)是比较两个文本版本以识别它们之间变化的过程。该术语源自 Unix diff 命令,自 1974 年以来一直是开发者基础工具。
文本差异比较用于版本控制系统(git diff)、代码审查工具、Wiki 页面、文档协作以及任何需要随时间跟踪变化的场景。

差异算法的工作原理
最长公共子序列(LCS)
大多数差异算法的基础是寻找最长公共子序列(LCS)——在两个文本中以相同相对顺序出现(但不一定连续)的最长元素序列。
对于字符串 "ABCDE" 和 "ACBDE":
- LCS 是 "ABDE"(长度 4)
- 差异显示:A 相同,C 被插入,B 相同,C 被删除,D 和 E 相同
Myers 差异算法
Myers 差异算法(1986)被 Git 和许多其他工具使用,它能高效地找到将一段文本转换为另一段文本的最短编辑脚本(最少的插入和删除次数)。其时间复杂度为 O(ND),其中 N 是文本长度,D 是差异数量。
词级 vs. 行级 vs. 字符级
不同的粒度服务于不同的目的:
行级差异:源代码的标准(显示整个修改行)。最适合代码审查。
词级差异:显示一行中哪些具体单词发生了变化。更适合散文编辑。
字符级差异:显示具体哪些字符发生了变化。最适合检测拼写错误或微小修改。

统一差异格式
标准统一差异格式(由 git diff 使用):
--- a/original.txt
+++ b/modified.txt
@@ -10,7 +10,8 @@
Context line (unchanged)
Context line (unchanged)
-Deleted line
+New replacement line
+Another added line
Context line (unchanged)
行指示符:
(空格):未更改的上下文行-:在新版本中被删除+:在新版本中被添加@@:显示行号的块头
三方合并
当合并两个分支的更改时,三方合并会比较:
- 原始基础版本
- 版本 A(你的更改)
- 版本 B(他人的更改)
更改分类为:
- 无冲突:只有一方修改了文本——自动合并
- 冲突:双方修改了同一区域——需要手动解决
Git 标记冲突如下: ``` <<<<<<< HEAD Your version of the code
Their version of the code
feature-branch
## 实际应用
### 代码审查
在合并拉取请求之前,开发者审查差异以了解更改了什么、为什么更改以及是否存在任何问题。

### 文档
Wiki 和文档管理系统(Confluence、Google Docs 修订历史)显示版本之间的差异。
### 配置管理
基础设施团队在部署更改到生产环境之前比较配置文件。
### 法律与学术
合同修订和论文修订跟踪版本之间的确切更改。
## 使用差异工具
**命令行:**
```bash
diff original.txt modified.txt
diff -u original.txt modified.txt # 统一格式
git diff HEAD~1 # 自上次提交以来的更改
git diff main feature-branch # 分支之间的更改
代码编辑器: VS Code、Sublime、IntelliJ 都内置了差异查看器。
在线工具: 无需安装软件即可快速比较。
使用此工具
在左侧和右侧面板中粘贴两个文本版本。该工具会高亮显示新增内容(绿色)、删除内容(红色)和未更改文本,并提供可配置的比较模式(字符、单词或行)。
-> 尝试 文本差异工具