怎么用
- 左边粘贴原来的版本,右边粘贴修改后的版本。
- 点开始对比(或按 Ctrl+Enter),上方会显示新增、删除和未改动的行数。
- 左右对照查看:删除的内容在左侧标红,新增的内容在右侧标绿;被修改的行里,具体改动的字词会用更深的颜色标出。切换到合并显示,就是代码审查里常见的单栏样式。
- 如果两份文字只是重新排版、缩进不同,勾选忽略空白差异;如果只是英文大小写不同,勾选忽略英文大小写,避免这些无关的差异淹没真正的修改。
- 点复制为 unified diff,可以把结果贴进邮件、工单或补丁文件。
大段没有变化的内容会折叠成一行「省略若干行未改动内容」,每处修改前后各保留三行上下文。
差异是怎么找出来的
比较两段文字,就是找出把一段变成另一段所需的最少的插入和删除操作,等价于找出两者最长的公共行序列。本工具使用 Eugene Myers 在 1986 年提出的 O(ND) 差异算法,和 git diff 默认算法的思路相同。它的耗时取决于文本长度乘以差异的多少,所以两份长文档只有几处不同时,几乎瞬间就能比完。
运行算法之前,会先把两段文字开头和结尾完全相同的行放到一边,因为它们不可能是修改的一部分。如果剩下的部分差异超过 2000 处,工具就不再细分,把剩余区域整体标为「替换」,以免两份完全不同的文档让页面卡住。
逐字高亮
当一行是被修改而不是整行新增或删除时,会对这一对行的字词再跑一次同样的算法,所以只改了一个词,就只高亮这个词,而不是整行。英文按单词和标点切分;中文和日文没有空格,按单个字切分,相邻的被修改的字会合并成一段显示。
unified diff 格式
复制出来的文字采用统一格式,git、patch 以及大多数代码审查工具都能识别。它先写两个文件名,然后是一个或多个区块。区块头 @@ -3,5 +3,5 @@ 的意思是「原文从第 3 行开始的 5 行,对应修改稿从第 3 行开始的 5 行」。以空格开头的行是未改动的上下文,以减号开头的是删除的行,以加号开头的是新增的行。
示例
把 a、b、c(每行一个)和 a、x、c 比较,结果是:a 未改动,b 删除,x 新增,c 未改动,也就是新增 1 行、删除 1 行、未改动 2 行。
逐字对比「我喜欢苹果」和「我喜欢香蕉」,只会把苹果标为删除、香蕉标为新增,「我喜欢」保持不变。英文同理,the quick brown fox 和 the slow brown fox 只会标出 quick 和 slow。
一个 8 行的文件,第 5 行从 e 改成了 X,保留两行上下文的 unified diff 是:
--- old.txt
+++ new.txt
@@ -3,5 +3,5 @@
c
d
-e
+X
f
g勾选忽略空白差异后,a b(两个空格)和 a b 视为同一行;勾选忽略英文大小写后,Hello 和 hello 视为同一行。Windows 和 Unix 的换行符差异始终被忽略。
典型用途:核对合同的两个版本改了哪些条款,检查同事改过的稿子,比较两份配置文件,或者确认翻译稿有没有漏掉段落。
局限
- 移动的段落会显示为「删除 + 新增」。 逐行对比无法识别某一段只是换了位置,你会看到它在一处被删掉,在另一处被加上。
- 只比较纯文本。 Word、PDF 里的格式(加粗、字体、修订记录)不参与比较,请先把文字复制出来。PDF 复制出来的文字,换行位置可能和你看到的不一样。
- 最短的差异不一定最符合直觉。 存在多个同样短的结果时,工具会选其中一个,偶尔会和人工判断的行对应关系不同。
- 差异很大的长文本超过 2000 处差异后,会整体标为替换,不再逐行分析。
常见问题
粘贴的内容会被上传吗?
不会。两个版本都在你的浏览器里比较,不会被保存或传输。合同、稿件这类敏感内容也可以放心对比。
能忽略空格、缩进的差异吗?
可以。勾选「忽略空白差异」后,行首行尾的空格会被忽略,连续的多个空格视为一个。
用的是什么算法?
Myers 的 O(ND) 差异算法,也就是 git diff 默认模式背后的思路;被修改的行还会再做一次逐字对比。
能比较两个 Word 文档吗?
把两个文档的文字分别复制出来粘贴到这里即可。格式上的差异不会被检测,只比较文字。
怎么把对比结果发给别人?
点「复制为 unified diff」,粘贴到任何地方都可以。这个格式 git、patch 和代码审查工具都认,直接当纯文本看也很清楚。