悦省

文本对比

改配置、改文案、改代码——先看看到底改了哪几行。

算法

用最长公共子序列(LCS)做逐行比较,所以会尽量找到「最少的改动」,而不是简单按行号对齐。几千行的文本也很快。

什么时候用

  • 两份配置或两份文案只改了几行,要确认到底改了哪几行、有没有手滑删掉一整段时。
  • 接手别人的文件,想快速看出对方这一版加了什么,同时忽略只是大小写或行尾空格的改动时。

什么时候不用

  • 只想看某个词改成了什么:这里按行比较,一个词的修改会显示成整行删除加整行新增。
  • 两边都是几万行的文件(压缩后的 JS、数据库导出):LCS 的表是行数相乘,页面很容易卡死,用命令行的 git diff --no-index 或 diff 更稳。
限制与隐私

对比全在本地完成,两段文本都不上传。限制:只按行比较,无字符级 diff;忽略空白只处理行尾,行首缩进仍算差异;LCS 用 n×m 表格,几万行会占大量内存并卡住页面;不做语法或编码检查,CRLF 与 LF 会按同一换行处理。

常见问题

多大的文本会卡住?

算法要建一张「左侧行数 × 右侧行数」的表。实测各 1,000 行约 100 万格、几十毫秒;各 8,000 行约 6,400 万格,需要半秒到一秒并占几百 MB;各 16,000 行约 2.56 亿格,实测 1 GB 堆内存就直接溢出。浏览器标签页通常更早变卡,两边各控制在几千行以内比较安全。

只差一个词,为什么整行被标成删除加新增?

LCS 以整行为单位匹配,只有完全相等的行才算「未改动」。同一行里改了一个词,这行就不属于公共子序列,于是同时出现在删除侧和新增侧。本页不做字符级 diff,想看词级改动请用支持行内高亮的工具。

「忽略首尾空白」到底忽略了什么?

只去掉每行末尾的空白(空格、Tab、Windows 的 ),行首缩进仍参与比较;把 4 空格缩进改成 2 空格,会被判为改动。勾选「忽略大小写」是先把两侧转成小写再匹配,显示出来的也是小写后的行内容,但行号仍是各自原文的行号。