文本差异(Diff)比较
按行比较两段文本,用颜色标出新增的行和删除的行。适用于检查配置文件的改动、校对文档、或在不使用Git的情况下进行代码审查。所有比较都在浏览器内完成,输入内容不会发送到服务器。
逐行比对两段文本
想弄清配置文件改了什么,或某篇文字在何处动过笔,这便是该取来用的工具。它把两段文本逐行对照,以不同颜色标出新增与删去的行。一切都在浏览器内算完,贴入的东西不会被送往任何地方。
**读结果时值得知道的是:差异算法寻的是「最短的编辑步骤」。** 因此,**人眼看作「这一段挪到了下面」的事,机器却表述为一处删去配上一处新增。** 它并没有表示「移动」的记号。另一点是:比对以行为单位,**故而只差一个字的行,也会被整行报作已改。** 此处最令人困惑的,是换行符或行尾空白的不同——明明看着一样,却可能整篇的行都被标成改过。差异大得离谱时,头一个该疑的便是这个。
使用方法
- 把原文贴进 A 放入改动之前的内容。
- 把修订稿贴进 B 放入改动之后的内容。
- 阅读着色的差异 **新增与删去的行以不同颜色标出。**
- 差异过大时疑心行尾 **单是换行符或行尾空白不同,便会把每一行都标成改过。**
用好本工具的小技巧
- 将配置文件(.env、YAML、JSON等)修改前后的内容粘贴进来,即可一眼看出哪些行被新增或删除。
- 即使没有安装Git,只需复制粘贴两个版本,也能进行简易的代码审查或文档校对。
- 行的位置调换会被识别为"删除+新增",而不是"移动"。当同一内容的行只是换了位置时,仍会显示为差异,请留意这一点。
- 空格、换行符和大小写都会被严格逐字符比较,因此仅缩进发生变化的行也会被判定为"已变更"。
- 比较长篇文章时,先将每个段落整理成一行再粘贴,能让差异结果按段落一目了然。
这些场景会用到
核对配置文件的改动
在推上生产之前,可以看出是否只改了您本想改的地方。
对照文字的校订结果
**把初稿与改稿并置,何处动过笔便一目了然。**
不用 Git 也能评审
从未纳入版本管理的文件,照样贴上便可比对。
确认输出可否复现
把同一处理跑两遍的结果拿来比较,确认并无出入。
差异的术语
- 新增的行
- 只出现在 B 中的行。
- 删去的行
- 只出现在 A 中的行。**仅仅挪了位置的行,同样会以删去配新增的形式浮现。**
- 逐行比对
- 把每一行当作一个整体来比。**只差一个字,整行便被标作已改。**
- 换行符
- 标示行尾的字符:Windows 用 CRLF,类 Unix 系统用 LF。**此处之别可能显现为每一行都不同。**
- 区块
- 差异中改动聚在一处的那一整块。
- 上下文
- 列在改动行上下的那些未变之行,纳入其中是为了便于判断位置。
常见问题
闲话 ― 用LCS(最长公共子序列)求差异的原理
检测两段文本差异的算法中,1970年代由IBM计算机科学家尤金·迈尔斯(Eugene Myers)发表的"Myers差分算法"广为人知。Git、SVN等主流版本控制系统的`diff`命令都采用了这一系列算法,能高效检测按行的新增和删除。本工具也基于同样的思路,通过求出最长公共子序列(LCS)将变化范围缩小到最小。
最长公共子序列(LCS)是指两个序列(这里指行的排列)中都按顺序出现的、最长的公共部分序列。两段文本的差异,就是把不属于这个LCS的行判定为"删除"或"新增"求出来的,LCS越长,屏幕上显示的变化就越少。借助动态规划(DP)这一算法技巧,即使是行数很多的文本,也能在现实的时间内完成计算。
diff算法也有其弱点。当某一行只是移动到了别的位置时,多数实现都不会将其识别为"移动",而是显示为"删除"和"新增"的组合。这就是为什么行顺序被大幅打乱的文本进行比较时,差异看起来会比实际变化更多的原因。了解这一特性,有助于在解读差异结果时减少误解。