文本 Diff 比对
纯前端:粘贴两段文本,逐行比对,新增/删除/相同行着色标记。数据不出浏览器,不联网、不记录。
怎么用
左边粘「旧文本」,右边粘「新文本」,点 比对,下方按行列出结果:红色为旧文本独有(被删),绿色为新文本独有(新增),灰色为两边相同。顶部显示差异条数统计。
Diff 到底在比什么
本工具按行做 LCS(最长公共子序列)对齐:先找出两段文本里都有的、顺序一致的行作为「相同」,剩下的就是各自独有行,分别标成删除或新增。这种对齐让改动看起来像「旧行被替换成新行」,而不是乱成一团。
为什么按行而不是按字?因为运维最常比的是配置文件、日志、脚本——它们的结构就是一行一条。一行里只改了一个参数,整行标成「删 + 增」比逐字标红更直观。
最适合用的场景
- 配置漂移核对:两份
nginx.conf、两份k8s manifest,改了哪几行参数一目了然。 - 日志片段对比:同一接口正常时和报错时的访问日志,逐行比出多出来或少了的那条请求。
- 脚本两个版本:自己改过的脚本前后贴进来,确认改动范围和有没有误删。
- 上线前 sanity check:把预发配置和生产配置比一遍,避免带着差异上线。
三个最容易踩的坑
看不见的换行差异:Linux 用 LF(\n),Windows 用 CRLF(\r\n)。同一行内容,行尾差一个 \r,Diff 就判为不同。跨平台粘贴尤其常见。比对前统一换行(编辑器「转换为 LF」),或在工具里先做一次「去首尾空白 + 统一换行」预处理。
行末空格与全角半角:行尾多一个空格、中文逗号, 和英文逗号,、全角括号和半角括号,肉眼几乎分辨不出,但 Diff 会如实标红。配置文件里这类差异有时是真问题(YAML 缩进、参数值),有时纯属手误,需结合上下文判断。
编码不同:UTF-8 和 GBK 下同样的中文字节不同,整行被判为不同。确认两端都是 UTF-8 再比。
行级 vs 字符级
行级 Diff 的局限:一行里只改了一个字,整行变成「删 + 增」,你还得自己盯着那一行找不同。如果任务是确认「这一行到底哪几个字变了」,需要字符级(word/char diff)的工具,比如编辑器的内联 diff 或 git diff --word-diff。本工具定位是快速看改动范围,精确到字符交给专业工具。
和 git diff 的关系
git diff 是版本控制系统基于两次提交做的比对,除了行级差异还能做字符级、识别重命名、标出合并冲突。本工具不依赖 git、不记录历史,是「随手比两段文本」的轻量替代品。两者互补:日常版本回溯用 git,临时核对两段内容用本工具。
一个配置漂移示例
假设旧配置 B 和新配置 A 是这样两段 Nginx upstream:
# A(旧)
upstream api { server 10.0.0.1:8080; server 10.0.0.2:8080; }
# B(新)
upstream api { server 10.0.0.1:8080; server 10.0.0.3:8080; }
比对后你会看到:第一行相同,第二行里 10.0.0.2 被标红删除、10.0.0.3 被标绿新增——一下就定位到「后端节点从 .2 换成了 .3」。这种改动用肉眼翻两份长配置很容易漏,Diff 一比就显形。
LCS 是怎么对齐的(通俗版)
不用管数学细节,记住一句话:它先找两边「最长的相同顺序」作为锚点,剩下的就是差异。比如两边都有的第 1、3、5 行先对齐,中间第 2、4 行的不同就被孤立出来标记。所以它不是「逐行等号比较」,而是允许中间插入/删除后仍能对齐,这正是它比「两文件逐行 ==」聪明的地方。代价是计算量随行数平方增长,所以大文件要小心。
还能比什么
除了配置,这些也常比:
- DNS 区域文件:新增/删除了哪条记录、TTL 改没改,逐行比最直观。
- 防火墙 / 安全组规则:规则按顺序匹配,增删一条可能改变整条链的行为,比对能确认「到底动了哪条」。
- cron 表达式清单:哪个任务的调度时间被改了,一行一个任务时一比就出。
- 环境变量文件(.env):哪些键被加、哪些值被改,但注意 .env 含机密,比对完别把内容留在浏览器或截图外传。
比对前的预处理建议
为了少看「假差异」,比对前可以做两件事:
- 统一换行与去首尾空白:编辑器里把两端都转成 LF、去掉行末空格,能消掉绝大多数「看起来一样其实不同」。
- 排序后再比:如果两份是「集合」性质(如 IP 名单、域名列表),先各自按行排序再比,差异会更聚焦在「真正多/少的项」,而不是被顺序打乱带出的大片假改动。
这两步都能在本工具之外用编辑器或 sort 命令先做好,再粘进来比,结果干净得多。
比对方向要搞清楚
把 A 放左边、B 放右边,红色表示「A 有 B 没有」(从 A 的视角是删除),绿色表示「B 有 A 没有」(新增)。左右互换,红绿语义也跟着反过来。汇报差异时先说清「以谁为基准」,免得对方理解反了——尤其是「这是相对生产环境新增了什么」还是「相对生产环境删掉了什么」,结论完全相反。
一个小提醒:Diff 只负责把差异「呈现」出来,不负责解释它。看到红绿行之后,仍要结合业务判断这次改动该不该上线,比如被删的那行是不是某个服务还在依赖的路由。工具是眼睛,决策在你手里。
相关教程
- GitOps 基础设施 — 配置即代码、版本比对与回滚思路
- Nginx 配置校验 — 改完配置先校验再比对
- CDN 原理 — 边缘配置下发前后的差异核对