文本差异(Diff)比较
按行比较两段文本,用颜色标出新增的行和删除的行。适用于检查配置文件的改动、校对文档、或在不使用Git的情况下进行代码审查。所有比较都在浏览器内完成,输入内容不会发送到服务器。
使用技巧
- 将配置文件(.env、YAML、JSON等)修改前后的内容粘贴进来,即可一眼看出哪些行被新增或删除。
- 即使没有安装Git,只需复制粘贴两个版本,也能进行简易的代码审查或文档校对。
- 行的位置调换会被识别为"删除+新增",而不是"移动"。当同一内容的行只是换了位置时,仍会显示为差异,请留意这一点。
- 空格、换行符和大小写都会被严格逐字符比较,因此仅缩进发生变化的行也会被判定为"已变更"。
- 比较长篇文章时,先将每个段落整理成一行再粘贴,能让差异结果按段落一目了然。
常见问题
适用于比较配置文件或文档修改前后的内容、在不使用Git的环境下进行代码审查、确认合同或条款的修订之处等,任何需要按行掌握纯文本变化的场景都可以使用。
CSV差异比较工具针对具有列结构的表格数据,通过键列匹配后逐单元格比较;而本工具比较的是不具备列结构的自由格式文本,按行比较。适合配置文件、文章等非表格数据。
JSON差异比较工具会解析JSON的结构(对象和数组的层级)并按键比较;本工具不解析任何结构,只是将每一行作为字符串进行比较,因此除了JSON之外的任意文本也能使用。
行的调换不会被识别为"移动",而是显示为原位置的删除和新位置的新增的组合。这与Git的diff命令等常见的按行比较算法的行为是一致的。
不会。差异计算完全在浏览器内的JavaScript中完成,输入的文本不会被发送到服务器,即使包含机密信息的文档也可以放心使用。
闲话 ― 用LCS(最长公共子序列)求差异的原理
检测两段文本差异的算法中,1970年代由IBM计算机科学家尤金·迈尔斯(Eugene Myers)发表的"Myers差分算法"广为人知。Git、SVN等主流版本控制系统的`diff`命令都采用了这一系列算法,能高效检测按行的新增和删除。本工具也基于同样的思路,通过求出最长公共子序列(LCS)将变化范围缩小到最小。
最长公共子序列(LCS)是指两个序列(这里指行的排列)中都按顺序出现的、最长的公共部分序列。两段文本的差异,就是把不属于这个LCS的行判定为"删除"或"新增"求出来的,LCS越长,屏幕上显示的变化就越少。借助动态规划(DP)这一算法技巧,即使是行数很多的文本,也能在现实的时间内完成计算。
diff算法也有其弱点。当某一行只是移动到了别的位置时,多数实现都不会将其识别为"移动",而是显示为"删除"和"新增"的组合。这就是为什么行顺序被大幅打乱的文本进行比较时,差异看起来会比实际变化更多的原因。了解这一特性,有助于在解读差异结果时减少误解。