如何比较文本并找出差异

· 5 分钟阅读

查找文档、配置文件或代码两个版本之间的变化是一项常见任务。手动阅读两个版本并发现差异既缓慢又不可靠,尤其是对于长文本。差异检查器即时完成此操作并突出显示每一处变化。驱动 Git 提交历史、GitHub 拉取请求审查界面和 Unix diff 命令的相同算法是您曾经使用过的每个可视化差异工具的基础。

如何比较文本

  1. 粘贴两个版本:在左侧输入原始文本,在右侧输入修改后的文本。
  2. 查看突出显示:添加的行以绿色显示,删除的行以红色显示。修改的行同时显示旧版本和新版本。
  3. 导出或复制:复制差异结果或下载报告。

两个面板都有文本时比较立即发生。没有要单击的比较按钮;任一侧的编辑都会实时重新运行差异,这在您迭代修复并希望立即看到效果时很有用。

阅读差异

差异输出使用简单的颜色系统:

这是 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 年引入,现在是按文本共享更改的事实标准。

差异检查何时有用

基于行 vs 基于字符的 diff

差异检查器使用基于行的比较,这意味着它将每一行视为最小的差异单位。如果您更改行上的单个单词,整行将显示为已更改(旧行为红色,新行为绿色),您必须自己发现单词级别的差异。

基于行的 diff 是代码和配置文件的标准,因为它们通常是面向行的(每行一个语句,每行一个配置选项)。它快速、可预测,并匹配 Git 和每个代码审查工具的工作方式。

对于行级更改太粗糙的散文比较,某些工具提供单词级或字符级 diff,仅突出显示行内已更改的单词。这更精确但对于代码更难阅读。如果您需要单词级 diff,请查找专门标记为"word diff"或"intra-line diff"的工具。

隐私和机密内容

差异检查器完全在您的浏览器中运行。两段文本都留在您的设备上;没有任何东西被上传。这很重要,因为您最想要比较的文本通常是机密的:正在谈判的合同、新闻稿草稿、内部政策文档、NDA 下的源代码。云差异工具(DiffChecker.com、JsonDiff.com、在线合并工具)需要将两段文本上传到第三方服务器,这正是您希望避免敏感内容的情况。基于浏览器的差异没有这些暴露。

会话也是无状态的:关闭选项卡后,没有任何东西保留。如果您需要保留差异的记录,请在导航离开之前复制输出或截屏。

常见陷阱

提示

常见问题

diff 是按字符比较的吗?

它按行比较,与 Git 和大多数专业 diff 工具的做法相同。如果某行中只更改了一个字符,整行仍会被高亮为已更改。

有大小限制吗?

没有硬性限制,但非常大的文本(超过 10,000 行)可能需要一点时间处理,因为比较完全在您的浏览器中进行。

可以比较代码文件吗?

可以。diff 适用于任何文本,包括源代码。语法高亮能让代码 diff 更容易阅读。

我的文本会发送到服务器吗?

不会。比较在您的浏览器中完成。您的文本从不离开您的设备。