文本对比(diff)工具究竟是怎么判断"改动"的

diff工具并不是字面意义上"找出你改了哪里",而是在计算把一段文本变成另一段文本所需要的最小编辑量。

按行对比是最常见的默认方式

大多数diff工具首先按行比较,把整行标记为新增或删除,速度快、便于阅读,但哪怕只改了一个词,也可能导致整行都被标记为"变更"。

按字符或单词对比能看到更细的差异

更细粒度的对比会在一行内部精确标出具体哪些字符或词发生了变化,更精确但视觉上更密集,适合在很长的一行里找出隐藏的小修改。

新增和删除的配色几乎是通用惯例

大多数工具用绿色系表示新增、红色系表示删除,这个惯例借鉴自Git等版本控制工具,使得换一个diff工具阅读起来也几乎没有学习成本。

算法追求的是最小的改动集合

diff算法的基本原理是先找出两段文本的最长公共子序列(LCS),再把不在这个公共序列里的部分标记为改动,目标是得到编辑操作数量最少的结果,而不一定是人类直觉上"最自然"的那种改法。

被移动的内容常常会显示成"删除+新增"

如果只是把一段文字挪到了别的位置而没有其他改动,大多数diff工具并不会把它识别成"移动",而是在原位置显示为删除、在新位置显示为新增,因为大多数diff算法本身并不把"移动"当作一种独立的操作类型来识别。

代码之外,diff对比还能用在哪些地方

版本控制是最常见的应用场景,但差异对比同样适合用来追踪合同草稿之间的改动、监测抓取下来的网页内容随时间发生的变化,或者在定稿前比较文档的两个版本。

为什么一个很小的改动看起来会像一大片差异

因为按行对比只要一行里有一个字符不同,就会把整行都标记为"变更",所以在一段很长的文字里改掉一个错别字,看起来可能像是整行都被重写了。切换到按词或按字符的对比视图,通常能更清楚地看出实际改动其实很小。

常见问题

明明只改了一个词,为什么那一行会同时显示为删除和新增?

这正是按行对比的表示方式——除非工具还支持行内的逐词高亮,否则它不会显示"部分改动",而是把旧的那一行标记为删除、新的那一行标记为新增。

diff工具只能比较纯文本吗?

很多工具也支持比较代码、JSON等结构化格式,但对比的底层逻辑通常仍然是基于文本的;也有一些专门的工具能理解特定格式的结构(比如忽略JSON里键的顺序),而不只是逐字符比较。