文本与正则表达式
只查看文本或配置文件的修改处
使用工具
凭眼睛扫描长配置容易漏掉修改,而满屏新增和删除又会让小修改显得巨大。找到差异与判断意义是两件事。先选比较单位,再把注意力集中到要理解的变化。
文本差异比较两个原始字符串,不执行配置,也不判断语义等价。固定左侧为修改前、右侧为修改后,从小例子理解显示,避免把新增说成删除。
30 改成 60,为什么出现两项变化?
host=example.invalid
timeout=30
retries=3
host=example.invalid
timeout=60
retries=3
行模式会显示删除 timeout=30、增加 timeout=60。人眼的一处修改,可以表示为删旧行、插新行。新增一行加删除一行,不等于修改了两个配置项;数量描述比较单位,不是需求或操作次数。
左右互换会反转新增与删除。分享结果时应标明哪个是旧版本。只保留变化片段可能丢失上下文或单位,评审时还要能看到附近行和说明。
长行变化,再按字符细看
切换字符模式,会看到删除 3、增加 6。行模式找哪一行,字符模式找行内哪里。长 URL、CSV 一行或说明中的数字发生变化时,先按行缩小范围,再看字符更易读。
越细不一定越清楚。整段重写可能留下分散的相同字符和碎片差异。这是计算出的对齐,不是作者实际编辑历史。大幅改写时,应读完整段理解意图。
忽略空白后,消失的是什么差异?
timeout=30
timeout=30行模式忽略空白可隐藏行首和行尾空白差异。把示例两行分开输入,再切换设置。它不会删除所有内部空格,hello world 与 helloworld 仍不同。报告相同时,应说明忽略了什么。
对空白有意义的格式,差异消失本身可能是警讯。YAML 缩进、对齐表格和定宽记录都可能因空格变化而改变含义。可暂时忽略以减少噪声,但最后应关闭该选项再检查;它不证明修改正确。
看似每行都变了,先检查换行
文字没变却有大量差异,可能来自换行格式或末尾换行。A 与 A 后跟换行是不同字符串。编辑器或粘贴过程可能统一换行,所以浏览器中相同不证明原文件逐字节一致。
排查时不要用格式化副本覆盖原文。保留两份原始版本,逐项改变末尾换行、缩进或行序。多项同时变化会掩盖差异消失的原因。应区分显示更干净与确实没有变化。
移动一行,可能显示为删除加新增
只是重排列表,即使各行都还在,文本比较也会产生变化。工具不一定把重定位概括成一次移动。重复文本的对齐还可能不同于想象中的编辑顺序,不应只凭差异形状断定操作过程。
如果关心成员而不是顺序,可用列表集合运算;比较 JSON 键顺序之外的值,可用结构比较。但步骤和优先规则的顺序本身有意义。应按问题选工具,不要为了减少差异先排序。
目标是解释差异,而不是差异归零
评审时固定前后方向,先扫行,再检查重要行中的字符。用过空白过滤,就在最后关闭复查。能说明“timeout 从 30 变为 60,其余值相同”,比只看彩色片段更有用。
没有差异时也要检查范围是否足够:漏贴行、其他配置文件或环境变量若未输入,就无法检查。有差异也不自动等于缺陷。意图与运行影响仍需规范和相应测试确认。
格式与内容一起修改,会让审查更困难
整个配置重缩进时又把 timeout 从 30 改 60,大量变化会淹没关键值。先比较原文,再观察空白选项消除了什么。本工具不删除所有行内空白,因此仍有差异未必是错误,应明确忽略设置的范围。
忽略后差异消失,不代表空白没有意义。YAML 缩进、字符串内容和 Markdown 换行可能改变行为。比较选项只是换一个审查角度,不是安全认证。条件允许时,将纯格式修改与值修改分阶段检查,意图更清楚。
分享差异时注明哪边是修改前后、忽略了哪些内容。左右交换会颠倒增删。写 timeout 从 30 改 60,缩进已另行检查,比仅说一处差异更有用。目标是核对意图与实际修改,而不是减少红绿高亮。