正在加载,请稍候…

文本差异工具:如何比较两段文本并找出差异

并排比较两段文本并高亮显示所有差异。了解差异算法及其实际应用。

文本差异工具:如何比较两段文本并找出差异

什么是文本差异比较?

文本差异比较(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)

行指示符:

  • (空格):未更改的上下文行
  • -:在新版本中被删除
  • +:在新版本中被添加
  • @@:显示行号的块头

三方合并

当合并两个分支的更改时,三方合并会比较:

  1. 原始基础版本
  2. 版本 A(你的更改)
  3. 版本 B(他人的更改)

更改分类为:

  • 无冲突:只有一方修改了文本——自动合并
  • 冲突:双方修改了同一区域——需要手动解决

Git 标记冲突如下: ``` <<<<<<< HEAD Your version of the code

Their version of the code

feature-branch


## 实际应用

### 代码审查
在合并拉取请求之前,开发者审查差异以了解更改了什么、为什么更改以及是否存在任何问题。

![文本差异工具:如何比较两段文本并找出差异 插图](https://images.pexels.com/photos/33732497/pexels-photo-33732497.jpeg?auto=compress&cs=tinysrgb&h=650&w=940)

### 文档
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 都内置了差异查看器。

在线工具: 无需安装软件即可快速比较。

使用此工具

在左侧和右侧面板中粘贴两个文本版本。该工具会高亮显示新增内容(绿色)、删除内容(红色)和未更改文本,并提供可配置的比较模式(字符、单词或行)。

-> 尝试 文本差异工具