如何比较文本并找出差异
查找文档、配置文件或代码两个版本之间的变化是一项常见任务。手动阅读两个版本并发现差异既缓慢又不可靠,尤其是对于长文本。差异检查器即时完成此操作并突出显示每一处变化。驱动 Git 提交历史、GitHub 拉取请求审查界面和 Unix diff 命令的相同算法是您曾经使用过的每个可视化差异工具的基础。
如何比较文本
- 粘贴两个版本:在左侧输入原始文本,在右侧输入修改后的文本。
- 查看突出显示:添加的行以绿色显示,删除的行以红色显示。修改的行同时显示旧版本和新版本。
- 导出或复制:复制差异结果或下载报告。
两个面板都有文本时比较立即发生。没有要单击的比较按钮;任一侧的编辑都会实时重新运行差异,这在您迭代修复并希望立即看到效果时很有用。
阅读差异
差异输出使用简单的颜色系统:
- 绿色(添加):存在于新版本但不在旧版本中的行
- 红色(删除):存在于旧版本但已从新版本中消失的行
- 未更改:两个版本中相同的行
这是 Git、GitHub、GitLab、Bitbucket 和每个主要版本控制系统使用的相同约定。颜色不是任意的:用于添加的绿色和用于删除的红色自 1970 年代第一批视觉差异工具(如 sdiff 命令)在 Unix 上发布以来一直是标准。现代工具有时为"已更改"(在两个中都存在但不同的行)添加黄色或橙色,但红色和绿色仍然是通用的添加/删除。
diff 简史
Douglas McIlroy 于 1976 年在贝尔实验室首次发布了 diff 算法,建立在 Eugene Myers 后来的细化(O(ND) 算法,1986)基础之上,使 diff 快到足以进行交互使用。McIlroy 的原始算法随 1979 年 Unix V7 发布而发布,从此成为每个类 Unix 操作系统的一部分。Myers 算法是驱动现代 diff 实现的:Git 的 diff、GitHub 的 Web 界面、从 Beyond Compare 到 VS Code 的每个 diff GUI。
可视化并排 diff 格式早于该算法:它可以追溯到出版中的手动校对约定(显示两列文本,更改在边缘标记)。1970 年代的软件只是自动化了编辑们在纸上做了几个世纪的事情。"统一 diff"格式(您在补丁文件中看到的带有 --- 和 +++ 标题的格式)由 GNU diff 于 1990 年引入,现在是按文本共享更改的事实标准。
差异检查何时有用
- 代码审查:在提交之前将您的更改与原始版本进行比较,以查看您究竟修改了什么
- 文档修订:查找合同、文章或政策两个版本之间的变化
- 配置调试:将工作的配置文件与损坏的配置文件进行比较以发现差异
- 数据验证:检查两个数据导出是否相同或找出它们的分歧
- 合并冲突:在解决冲突之前了解冲突的双方
- 翻译审查:将原始文档与翻译进行比较,以确保没有遗漏任何部分
- 电子邮件或消息比较:当有人说"我已经发送了更正版本"时,比较两条消息以查看实际更改了什么
- 数据库导出验证:比较数据库的两个 CSV 导出,以确认 ETL 运行产生了相同的输出
基于行 vs 基于字符的 diff
差异检查器使用基于行的比较,这意味着它将每一行视为最小的差异单位。如果您更改行上的单个单词,整行将显示为已更改(旧行为红色,新行为绿色),您必须自己发现单词级别的差异。
基于行的 diff 是代码和配置文件的标准,因为它们通常是面向行的(每行一个语句,每行一个配置选项)。它快速、可预测,并匹配 Git 和每个代码审查工具的工作方式。
对于行级更改太粗糙的散文比较,某些工具提供单词级或字符级 diff,仅突出显示行内已更改的单词。这更精确但对于代码更难阅读。如果您需要单词级 diff,请查找专门标记为"word diff"或"intra-line diff"的工具。
隐私和机密内容
差异检查器完全在您的浏览器中运行。两段文本都留在您的设备上;没有任何东西被上传。这很重要,因为您最想要比较的文本通常是机密的:正在谈判的合同、新闻稿草稿、内部政策文档、NDA 下的源代码。云差异工具(DiffChecker.com、JsonDiff.com、在线合并工具)需要将两段文本上传到第三方服务器,这正是您希望避免敏感内容的情况。基于浏览器的差异没有这些暴露。
会话也是无状态的:关闭选项卡后,没有任何东西保留。如果您需要保留差异的记录,请在导航离开之前复制输出或截屏。
常见陷阱
- 空白噪音:尾随空格、混合制表符和空格以及不同的行结尾(Unix 上的 LF 与 Windows 上的 CRLF)经常显示为"更改",即使可见文本相同。大多数差异工具都有用于此情况的"忽略空白"切换。
- 行结尾不匹配:Windows 行结尾 (CRLF) 与 Unix 行结尾 (LF) 使每一行看起来都已更改。如果您正在比较来自不同操作系统的文件,请先规范化行结尾。
- 编码差异:UTF-8 vs UTF-16 vs Windows-1252 中的文本可能看起来相同但比较为完全不同。在差异之前将编码规范化为 UTF-8。
- 重新排列的相同内容:如果您从第 3 页剪切一个段落并粘贴到第 1 页,差异显示段落为从-第-3-页-删除和添加-到-第-1-页,即使内容未更改。某些工具提供"移动块检测"来处理这个;基本 diff 不支持。
- 大文件性能:比较超过 10,000 行的文件可能会减慢浏览器。对于非常大的差异,请使用命令行
diff或桌面工具如 Beyond Compare。
提示
- 粘贴干净的文本:删除您不想比较的标题、页脚或元数据。额外的噪音使真正的差异更难发现。
- 使用并排视图:使用对齐的行号将两个版本并排查看比内联视图更容易追踪差异。
- 检查空白:有时"相同"的文本有不可见的差异,如尾随空格、不同的行结尾 (LF vs CRLF) 或制表符 vs 空格。差异检查器会捕获这些。
- 对于散文先规范化:对于自然语言比较,在差异之前通过空白规范化器运行两个文本或粘贴到普通编辑器中。这避免了从 Word 或 PDF 带过来的格式产生的虚假差异。
- 如果需要记录请保存差异:复制突出显示的输出或截屏。差异不会自动保留。
- 离线工作:一旦页面加载,比较将在您的浏览器中本地运行,无需互联网。
常见问题
diff 是按字符比较的吗?
它按行比较,与 Git 和大多数专业 diff 工具的做法相同。如果某行中只更改了一个字符,整行仍会被高亮为已更改。
有大小限制吗?
没有硬性限制,但非常大的文本(超过 10,000 行)可能需要一点时间处理,因为比较完全在您的浏览器中进行。
可以比较代码文件吗?
可以。diff 适用于任何文本,包括源代码。语法高亮能让代码 diff 更容易阅读。
我的文本会发送到服务器吗?
不会。比较在您的浏览器中完成。您的文本从不离开您的设备。