HandyTools Hub

差异对比

即时比较两份文本并高亮显示差异。

原始文本

修改后文本

Diff Checker 比较两段文本,精确显示发生了哪些变化——新增、删除和行内编辑——并提供并排与统一两种视图。它适合审阅合同修订、查看两个配置文件之间改了什么、把编辑过的段落与原稿对照,或者确认两份导出是否真的完全一致。粘贴两个版本,差异立刻被标记出来,两个版本都不会被上传。

使用方法

  1. 把原始版本粘贴到左侧面板,把修改后的版本粘贴到右侧面板。任何纯文本内容都可以:代码、CSV、JSON、Markdown 或普通文章。
  2. 选择比较粒度——行、词或字符——取决于你正在审阅的内容。
  3. 在分栏视图(左右并排)和统一视图(单列,带 +/− 标记)之间切换视图,以匹配你阅读改动的习惯。
  4. 如果需要把变化分享给别人,可复制或导出结果。

解读差异结果

每次比较会同时显示三样东西。已删除的内容在原版一侧标记;新增的内容在修改版一侧标记;未改动的上下文在两者之间保持未标记,方便看出每处改动落在哪里。当一行是被编辑而不是整行替换时,工具会高亮行内真正不同的词或字符——这正是「有用的差异」与「一片红绿噪音」之间的区别。

在统一视图中,行首前缀说明了含义:以 − 开头的行只存在于原版,以 + 开头的行只存在于修改版,以空格开头的行是未改动的上下文。如果你读过 git diff 的输出,这个格式会很熟悉。

实操示例

示例 1——一处配置改动。 两份 nginx.conf 只差一条指令。在行级别下,被改动的 proxy_read_timeout 行被标出,周围几十行仍然是上下文。审阅者几秒内就能批准这次改动,而不必滚动两个文件来对照。

示例 2——一个被修改的段落。 一段 400 词的文章里有一句话被改写。行级比较会把整段都标为已改动;切换到词级别,就能隔离出真正变动的六个词——在合同审阅中,这就是「整段被重写」和「这一条款变了」的区别。

示例 3——核对一次导出。 一次数据结构微调后重新生成了数据导出。对比新旧 CSV 文件,可以确认恰好新增了一列,且没有任何行发生位移——这是只看行数无法发现的检查。

如何选择比较粒度

  • 行——源代码、配置和结构化数据的默认选择。它对应版本控制记录改动的方式,因此审阅意见能与提交对齐。
  • 词——最适合文章、文档和法律文本;在这些场景里,一句被改写的措辞才是重点,行的其余部分只是噪音。
  • 字符——最精确的选项,适合找出序列号里变动的一位数字、一个不可见字符,或译文里一个标点的差别。

如果某处差异似乎怎么都找不到,就降到更细的粒度:改动通常比粗粒度视图显示的要小。如果两行「一模一样」却被标为不同,先怀疑空白字符或行尾,而不是真正的内容变化。

常见误解

  • 移动不是移动。 差异算法把移动的代码块表示成一次删除加一次新增,所以即便逻辑几乎没变,大规模重构也会产生很嘈杂的差异。
  • 重新格式化会喧宾夺主。 比较前先跑一遍格式化,会让每一行被动过的代码都看起来变了。当你只关心逻辑时,请比较两侧都已格式化的版本,或者忽略空白。
  • 行尾很重要。 用 Windows CRLF 保存的文件,和用 Unix LF 保存的同一文件,可能显得完全不同。比较来自不同操作系统的文件前,先统一行尾。
  • 「没有差异」也是一个结果。 当工具报告无变化时,这是一次有用的确认——在比较单位上,两份拷贝完全一致。

同一种比较方式支撑着版本控制。当你运行 git diff 或生成补丁文件时,输出就是统一格式的行级差异:未改动的行以空格开头,删除以 − 开头,新增以 + 开头,形如 @@ -12,7 +12,9 @@ 的标头标明代码块所在的位置以及它跨越多少行。在这里用统一视图多加练习,会让你读真实补丁和合并冲突轻松得多,因为结构完全相同——变的只是外围工具。

功能

  • 并排与统一两种比较视图
  • 行、词、字符三种粒度,可随时切换
  • 行内高亮精确标出变动的词或字符
  • 对新增、删除和未改动上下文有清晰的配色
  • 适用于代码、配置、CSV、JSON、Markdown 和文章
  • 100% 客户端运行——两个版本都不会被上传

相关工具

常见问题

为什么我移动过的代码会显示成删除加新增?

基于行的差异算法没有「移动」这个概念。它报告的是把一版变成另一版所需的最少行编辑,而一次移动只能表达成在旧位置的删除加上在新位置的新增。有些工具会用启发式方法检测被移动的代码块,但底层算法无法把「移动」当作一种独立操作来表示。

分栏视图和统一视图哪个更好?

分栏视图把原版和修改版左右并排,适合长度相近、分叉点很多的两份文档。统一视图把两个版本交错在同一列里,用 + 和 − 标记,读起来更像一份补丁,审阅一小批改动时通常更省力。

应该在词级别还是行级别比较?

代码、配置以及任何「一行就是一个有意义单位」的结构化文件用行级别——这与版本控制的思维方式一致。文章正文用词级别或字符级别,否则在长段落里改写一句话会把整行都标为已改动,把真正的编辑埋掉。

为什么两行看起来一模一样却被标为不同?

通常是不可见差异:行尾多出的空格、制表符与空格之差、不同的换行方式(LF 与 CRLF),或者是用不换行空格代替了普通空格。打开工具里的空白字符显示,或把两个版本分别放进字符级别比较,就能看出到底差在哪里。

最多能比较多大的文本?

几百 KB 的文本可以瞬间完成;非常大的输入(数 MB)可能让浏览器变慢,因为算法的开销随差异数量增长,而不仅仅是文件大小。遇到超大文件,改用版本控制系统或专门的 diff 工具来比较。

我比较的两个版本会留在本地设备上吗?

会。比较完全在浏览器里用 JavaScript 运行,原版和修改版都不会被传输到服务器,因此保密草稿、合同和源代码永远不会离开你的机器。

由 HandyTools Hub 团队审校 · 最后更新