文章
在不上传的情况下比较代码片段
每次将两个文件粘贴到在线 diff 工具,这些代码就会离开您的设备。配置文件、数据库查询、藏在 .env 片段中的 API 密钥, 所有内容都会传输到您无法控制的服务器。本文介绍 diff 算法的工作原理、粒度选项在实践中的含义,以及将比较操作保持在本地的重要性。
diff 计算的内容
diff 工具接受两段文本,找出将一段转换为另一段所需的最小变更集合。核心思想是最长公共子序列(LCS):在两段文本中以相同顺序出现的最长行(或词元)序列,即使不相邻也算。不在这个公共子序列中的内容,要么是新版本中的添加,要么是旧版本中的删除。 实现这一思想的经典算法来自 Myers(1986),该算法以 O((N+M)D) 的时间复杂度找到最短编辑脚本,其中 N 和 M 是两段文本的长度,D 是编辑次数。在实践中,大多数工具会添加预处理步骤以忽略开头和结尾的公共行,将问题缩小到变更区域。 结果是一个补丁(patch):由多个块(hunk)组成的序列,每个块描述一段连续的上下文行、删除和添加。这是 Unix diff、Git 和大多数代码审查工具使用的格式。

行、词和字符粒度
diff 的粒度决定了比较的基本单元。基于行的 diff 是大多数工具的默认模式:每行被视为单个词元。这种方式速度快,输出结果在上下文中易于阅读,但即使某行只有一个单词不同,整行也会被标记为已更改。 词级 diff 在运行 LCS 之前将每行拆分为单词。这能更细致地呈现行内的变化,对散文、配置值或 JSON 尤为有用。字符级 diff 更进一步,可以高亮显示长标识符中单个被更改的字母。 空白字符的处理会引入噪音。以 CRLF 结尾的行与以 LF 结尾的相同行在严格字节比较下会显示为不同。大多数工具提供在 diff 前规范化行尾的选项。类似地,尾部空格、制表符与空格混用的缩进以及空行都可能产生误报差异。在比较来自不同编辑器或操作系统的代码时,通常应启用空白字符规范化。
在线 diff 工具的隐私风险
在线 diff 和 pastebin 服务很方便:打开一个 URL,粘贴两段代码,获得彩色输出。问题在于您粘贴的文本会被传输到第三方服务器。根据服务商的不同,这些文本可能被记录、索引、无限期存储,或与分析服务提供商共享。 当代码包含敏感内容时,这一点尤为重要。硬编码的凭证、内部主机名、专有业务逻辑或个人可识别数据都可能出现在粘贴内容中。即使没有明显的密钥,内部代码的结构也可能暴露您希望保密的架构决策。 这种风险并非假设。安全研究人员已多次在公开粘贴内容中发现凭证和内部令牌。有些服务即使在用户删除后仍保留粘贴内容,因为缓存或备份中存在副本。一旦文本到达远程服务器,您就无法验证该服务如何处理它。 唯一可靠的缓解措施是将 diff 保持在本地,即使用从不通过网络发送文本的工具运行 diff。

本地 diff 的实际应用场景
diff 不仅用于代码审查。以下是本地 diff 实用的几种常见场景: 在提交前审查对文档或配置文件的修改。比较 Dockerfile、Nginx 配置或 Kubernetes 清单的两个版本,以准确了解部署之间发生了哪些变化。 检查不同环境之间的配置漂移。如果生产和预发布配置本应除主机名和密钥外完全相同,diff 可以立即显示任何意外的差异。 在调试时比较 API 响应。将来自 REST 或 GraphQL API 的两个 JSON 载荷粘贴,运行词级 diff,可以精确定位新增字段、更改的值或删除的键,而无需手动阅读数百行内容。 审查 LLM 生成的代码与基准版本的差异。当模型重写某个函数时,行级 diff 可以清楚地显示哪些逻辑发生了变化、哪些保持不变,比独立阅读两个版本更快。 在所有这些场景中,涉及的文本可能是敏感的,将其保留在远程服务器之外是最直接的选择。
在浏览器中完成,无需上传
本站的 text-diff 工具使用 JavaScript 在浏览器中运行全部 diff 计算。您将两段文本粘贴到两个面板中,diff 结果会立即逐行呈现,每侧最多支持 3000 行。不向服务器发送任何内容,文本不会离开您的设备。 该实现使用基于标准 LCS 的算法按行处理:每一行是一个词元,工具通过在两个版本之间寻找最长公共子序列来判断每一行是未改动、新增还是删除。未改动的行不做高亮,新增的行显示为绿色,删除的行显示为红色,旁边附有新增和删除的实时计数。目前没有词级或字符级模式,也没有空白字符规范化开关,因此只有尾随空白或换行符风格不同的两行仍会显示为已更改。 由于计算在客户端运行,因此可以离线使用。无需账户、无历史记录、无数据保留。您可以将本地配置文件与模板进行比较、在应用补丁前审查补丁,或比较两个 API 响应,而这些文本不会到达任何第三方。
本文涉及的工具
常见问题
行级 diff 还是词级 diff 更适合代码?
对于大多数代码审查任务,行级 diff 是标准选择,也是最易读的,因为代码按行组织。当行较长且只有小部分发生了变化时,例如单行 JSON 值,词级 diff 本可以更有用,但本工具只按行比较;遇到这种情况,可以把高亮的那一行当作定位线索,再自行用肉眼找出其中的细微差异。
为什么即使在线 diff 工具使用 HTTPS,也仍然存在隐私风险?
HTTPS 在传输过程中保护文本不被窃听,但一旦文本到达服务器就无法保护它了。服务运营者对粘贴的内容拥有完全访问权限,可以记录、存储或共享它。TLS 关注的是传输安全,而不是接收方如何使用数据。
text-diff 工具会存储过去比较的历史记录吗?
不会。该工具没有后端,也不发出任何网络请求。关闭或刷新标签页后,文本即消失。没有账户、没有保存的历史记录、没有服务器端日志。