差异对比
即时比较两份文本并高亮显示差异。
即时比较两份文本并高亮显示差异。
Diff Checker 比较两段文本,精确显示发生了哪些变化——新增、删除和行内编辑——并提供并排与统一两种视图。它适合审阅合同修订、查看两个配置文件之间改了什么、把编辑过的段落与原稿对照,或者确认两份导出是否真的完全一致。粘贴两个版本,差异立刻被标记出来,两个版本都不会被上传。
每次比较会同时显示三样东西。已删除的内容在原版一侧标记;新增的内容在修改版一侧标记;未改动的上下文在两者之间保持未标记,方便看出每处改动落在哪里。当一行是被编辑而不是整行替换时,工具会高亮行内真正不同的词或字符——这正是「有用的差异」与「一片红绿噪音」之间的区别。
在统一视图中,行首前缀说明了含义:以 − 开头的行只存在于原版,以 + 开头的行只存在于修改版,以空格开头的行是未改动的上下文。如果你读过 git diff 的输出,这个格式会很熟悉。
示例 1——一处配置改动。 两份 nginx.conf 只差一条指令。在行级别下,被改动的 proxy_read_timeout 行被标出,周围几十行仍然是上下文。审阅者几秒内就能批准这次改动,而不必滚动两个文件来对照。
示例 2——一个被修改的段落。 一段 400 词的文章里有一句话被改写。行级比较会把整段都标为已改动;切换到词级别,就能隔离出真正变动的六个词——在合同审阅中,这就是「整段被重写」和「这一条款变了」的区别。
示例 3——核对一次导出。 一次数据结构微调后重新生成了数据导出。对比新旧 CSV 文件,可以确认恰好新增了一列,且没有任何行发生位移——这是只看行数无法发现的检查。
如果某处差异似乎怎么都找不到,就降到更细的粒度:改动通常比粗粒度视图显示的要小。如果两行「一模一样」却被标为不同,先怀疑空白字符或行尾,而不是真正的内容变化。
同一种比较方式支撑着版本控制。当你运行 git diff 或生成补丁文件时,输出就是统一格式的行级差异:未改动的行以空格开头,删除以 − 开头,新增以 + 开头,形如 @@ -12,7 +12,9 @@ 的标头标明代码块所在的位置以及它跨越多少行。在这里用统一视图多加练习,会让你读真实补丁和合并冲突轻松得多,因为结构完全相同——变的只是外围工具。
基于行的差异算法没有「移动」这个概念。它报告的是把一版变成另一版所需的最少行编辑,而一次移动只能表达成在旧位置的删除加上在新位置的新增。有些工具会用启发式方法检测被移动的代码块,但底层算法无法把「移动」当作一种独立操作来表示。
分栏视图把原版和修改版左右并排,适合长度相近、分叉点很多的两份文档。统一视图把两个版本交错在同一列里,用 + 和 − 标记,读起来更像一份补丁,审阅一小批改动时通常更省力。
代码、配置以及任何「一行就是一个有意义单位」的结构化文件用行级别——这与版本控制的思维方式一致。文章正文用词级别或字符级别,否则在长段落里改写一句话会把整行都标为已改动,把真正的编辑埋掉。
通常是不可见差异:行尾多出的空格、制表符与空格之差、不同的换行方式(LF 与 CRLF),或者是用不换行空格代替了普通空格。打开工具里的空白字符显示,或把两个版本分别放进字符级别比较,就能看出到底差在哪里。
几百 KB 的文本可以瞬间完成;非常大的输入(数 MB)可能让浏览器变慢,因为算法的开销随差异数量增长,而不仅仅是文件大小。遇到超大文件,改用版本控制系统或专门的 diff 工具来比较。
会。比较完全在浏览器里用 JavaScript 运行,原版和修改版都不会被传输到服务器,因此保密草稿、合同和源代码永远不会离开你的机器。
由 HandyTools Hub 团队审校 · 最后更新