文本差异(Diff)比较

按行比较两段文本,用颜色标出新增的行和删除的行。适用于检查配置文件的改动、校对文档、或在不使用Git的情况下进行代码审查。所有比较都在浏览器内完成,输入内容不会发送到服务器。

逐行比对两段文本

想弄清配置文件改了什么,或某篇文字在何处动过笔,这便是该取来用的工具。它把两段文本逐行对照,以不同颜色标出新增与删去的行。一切都在浏览器内算完,贴入的东西不会被送往任何地方。

**读结果时值得知道的是:差异算法寻的是「最短的编辑步骤」。** 因此,**人眼看作「这一段挪到了下面」的事,机器却表述为一处删去配上一处新增。** 它并没有表示「移动」的记号。另一点是:比对以行为单位,**故而只差一个字的行,也会被整行报作已改。** 此处最令人困惑的,是换行符或行尾空白的不同——明明看着一样,却可能整篇的行都被标成改过。差异大得离谱时,头一个该疑的便是这个。

使用方法

  1. 把原文贴进 A 放入改动之前的内容。
  2. 把修订稿贴进 B 放入改动之后的内容。
  3. 阅读着色的差异 **新增与删去的行以不同颜色标出。**
  4. 差异过大时疑心行尾 **单是换行符或行尾空白不同,便会把每一行都标成改过。**

用好本工具的小技巧

  • 将配置文件(.env、YAML、JSON等)修改前后的内容粘贴进来,即可一眼看出哪些行被新增或删除。
  • 即使没有安装Git,只需复制粘贴两个版本,也能进行简易的代码审查或文档校对。
  • 行的位置调换会被识别为"删除+新增",而不是"移动"。当同一内容的行只是换了位置时,仍会显示为差异,请留意这一点。
  • 空格、换行符和大小写都会被严格逐字符比较,因此仅缩进发生变化的行也会被判定为"已变更"。
  • 比较长篇文章时,先将每个段落整理成一行再粘贴,能让差异结果按段落一目了然。

这些场景会用到

核对配置文件的改动

在推上生产之前,可以看出是否只改了您本想改的地方。

对照文字的校订结果

**把初稿与改稿并置,何处动过笔便一目了然。**

不用 Git 也能评审

从未纳入版本管理的文件,照样贴上便可比对。

确认输出可否复现

把同一处理跑两遍的结果拿来比较,确认并无出入。

差异的术语

新增的行
只出现在 B 中的行。
删去的行
只出现在 A 中的行。**仅仅挪了位置的行,同样会以删去配新增的形式浮现。**
逐行比对
把每一行当作一个整体来比。**只差一个字,整行便被标作已改。**
换行符
标示行尾的字符:Windows 用 CRLF,类 Unix 系统用 LF。**此处之别可能显现为每一行都不同。**
区块
差异中改动聚在一处的那一整块。
上下文
列在改动行上下的那些未变之行,纳入其中是为了便于判断位置。

常见问题

适用于比较配置文件或文档修改前后的内容、在不使用Git的环境下进行代码审查、确认合同或条款的修订之处等,任何需要按行掌握纯文本变化的场景都可以使用。

CSV差异比较工具针对具有列结构的表格数据,通过键列匹配后逐单元格比较;而本工具比较的是不具备列结构的自由格式文本,按行比较。适合配置文件、文章等非表格数据。

JSON差异比较工具会解析JSON的结构(对象和数组的层级)并按键比较;本工具不解析任何结构,只是将每一行作为字符串进行比较,因此除了JSON之外的任意文本也能使用。

行的调换不会被识别为"移动",而是显示为原位置的删除和新位置的新增的组合。这与Git的diff命令等常见的按行比较算法的行为是一致的。

不会。差异计算完全在浏览器内的JavaScript中完成,输入的文本不会被发送到服务器,即使包含机密信息的文档也可以放心使用。
工具君

闲话 ― 用LCS(最长公共子序列)求差异的原理

检测两段文本差异的算法中,1970年代由IBM计算机科学家尤金·迈尔斯(Eugene Myers)发表的"Myers差分算法"广为人知。Git、SVN等主流版本控制系统的`diff`命令都采用了这一系列算法,能高效检测按行的新增和删除。本工具也基于同样的思路,通过求出最长公共子序列(LCS)将变化范围缩小到最小。

最长公共子序列(LCS)是指两个序列(这里指行的排列)中都按顺序出现的、最长的公共部分序列。两段文本的差异,就是把不属于这个LCS的行判定为"删除"或"新增"求出来的,LCS越长,屏幕上显示的变化就越少。借助动态规划(DP)这一算法技巧,即使是行数很多的文本,也能在现实的时间内完成计算。

diff算法也有其弱点。当某一行只是移动到了别的位置时,多数实现都不会将其识别为"移动",而是显示为"删除"和"新增"的组合。这就是为什么行顺序被大幅打乱的文本进行比较时,差异看起来会比实际变化更多的原因。了解这一特性,有助于在解读差异结果时减少误解。