两段文本逐行对比:看清新增和删除了哪几行
把旧版贴左边、新版贴右边,点「对比」,工具会逐行找出差异,用 + 标出新增、- 标出删除,未改动的行保持灰色,行号分别对应两侧原文。对比用最长公共子序列(LCS)匹配,全部在浏览器里完成。
什么时候需要逐行对比
改配置、改文案、改合同条款之后,最怕的不是改错,而是顺手删掉了一整段却没发现。逐行对比能把「这一版到底动了哪里」摊开在眼前。
接手别人的文件、核对翻译有没有漏段、确认两份导出配置的差异,都属于同一类需求。人眼在两份长文档之间来回扫,很难保证不漏行。
- 对比两份配置文件,确认只改了预期的字段
- 核对文案或合同条款的修改,防止误删段落
- 检查译文是否漏译或重复
- 接手项目时快速看出这一版新增了什么
算法口径和两个勾选项
对比以整行为单位,用 LCS 找最长公共子序列,所以会尽量找出「最少的改动」,而不是按行号硬对齐。也正因为按行匹配,同一行里只改一个词,这行就不算公共部分,会同时出现在删除侧和新增侧——整行标红加整行标绿。
勾选「忽略首尾空白」会先把每行首尾的空白去掉再比较;勾选「忽略大小写」会先转成小写再比较,显示出来的也是小写后的内容。Windows 的 CRLF 和 Unix 的 LF 按同一种换行处理,不会因为换行符不同就整篇标成差异。
- 只想看词级改动:这里做不到,需要支持行内高亮的工具
- 缩进有变化会被算作修改,空白只在勾选后才忽略
- 忽略大小写后,输出显示的是小写内容,行号仍是原文行号
- 两边行数越多,LCS 的表格越大,内存占用越高
替代方案和规模限制
两段文本各几百到几千行时,浏览器里跑很轻松。再多就要小心:LCS 需要一张「左侧行数 × 右侧行数」的表,行数翻倍,内存和耗时大约翻四倍,几万行的文件容易让标签页卡死。
这种规模应该换命令行:git diff --no-index 对比任意两个文件,diff -u 输出标准补丁格式,diff -y 并排显示。需要词级高亮时用支持 inline diff 的编辑器或 git diff --word-diff。
- 大文件:git diff --no-index a.txt b.txt
- 标准补丁:diff -u old.txt new.txt
- 词级对比:git diff --word-diff 或编辑器内置 diff
- 三方合并:git merge / git mergetool
常见问题
只改了一个词,为什么整行都被标成删除加新增?
因为对比以整行为单位,只有完全相同的行才算「未改动」。一行里改了一个词,这行就不再属于公共子序列,于是同时出现在删除侧和新增侧。本工具不做字符级 diff;需要词级高亮时,用支持行内对比的编辑器或 git diff --word-diff。
多大的文本会卡住?
取决于两边行数的乘积。LCS 要建一张左侧行数 × 右侧行数的表,两边各一千行时是百万级,通常很快;各一万行就是上亿级,内存会明显吃紧,标签页可能失去响应。两边各控制在几千行以内比较稳妥,更大的文件请用命令行工具。
勾了「忽略首尾空白」,为什么还是有差异?
这个选项只影响每行开头和结尾的空白:比较前会去掉首尾空白,所以纯缩进或行尾空格的变化不会造成差异。仍有差异说明行内还有别的改动,或者行本身被增删。需要完全排除格式噪音时,先用同一个格式化工具处理两边,再对比。
相关工具:文本对比