原始 YAML
修改后的 YAML

YAML Diff:在线比较两个 YAML 文件

粘贴并并排比较两个 YAML 文档。YAML 语法高亮、tab 警告和实时验证内置其中。

什么是 YAML diff 工具?

一个免费的浏览器内工具,用于比较两个 YAML 文档。将旧版本粘贴到左侧,新版本粘贴到右侧,差异会逐行高亮显示。数据不会离开您的机器。

该工具理解 YAML 的结构:缩进、锚点、别名和多文档流。实时验证会检测常见的陷阱——意外的 tab 字符、尾随空白和解析错误——并在您输入时发出警告。

如果您曾在 GitHub PR 中盯着一个 Kubernetes Deployment,试图找出导致滚动更新失败的那个字段,这个工具能在几秒内帮您定位。对于 JSON 格式,JSON diff 处理键重排更干净。对于纯文本,我们的文本 diff 工具是更好的选择。

diff 的实际工作原理

diff 在字符级别运行,然后通过语义后处理清理,使高亮落在有意义的 YAML 块上,而不是随机字节上。插入内容在右侧窗格以绿色显示,删除内容在左侧以红色显示。

YAML 有一些容易让人犯错的特性。键顺序在 YAML 映射中是未定义的,因此重新排列键在技术上不改变语义——但文本 diff 会将其标记为变更。在 diff 前格式化两侧以规范化顺序。此外,YAML 1.2 规范规定缩进必须使用空格,不能使用 tab。

YAML 的另一个微妙之处是布尔值解析。在 YAML 1.1 中,YESNOONOFF 被解析为布尔值。在 YAML 1.2 中,只有 truefalse 是布尔值。如果您在两种规范的 YAML 之间进行 diff,这可能会导致意外的差异出现。

三步比较 YAML

两个文本窗格,一个 diff。无需注册,无需上传,无需服务器往返。

  1. 1

    粘贴或上传您的 YAML

    将旧 YAML 粘贴到左侧,新 YAML 粘贴到右侧。或者点击任意一侧的上传直接加载 .yaml.yml 文件。点击示例按钮,两个窗格都会填充一个 Kubernetes Deployment 示例。

  2. 2

    检查警告

    如果任一侧有 tab 字符或尾随空白,验证条会在顶部标记出来。YAML 对此很挑剔:tab 字符作为缩进是规范明确禁止的,会导致大多数解析器出错。在 diff 前解决这些警告。

  3. 3

    查看 diff

    删除内容在左侧以红色高亮显示,插入内容在右侧以绿色高亮显示。滚动任意一侧,另一侧随之跟随。每个标题中的变更计数会告诉您 diff 找到了多少个不同的编辑。

YAML diff 适合的场景

审查 Kubernetes 清单变更

将旧的 Deployment、Service 或 ConfigMap YAML 粘贴到左侧,新版本粘贴到右侧,立即看到哪些字段发生了变化。副本数、镜像标签、资源限制——这些通常在 PR 中更改,很容易被忽略。在此 diff 可以让这些变化一目了然。

比较 CI/CD 流水线配置

GitHub Actions 工作流、GitLab CI 配置和 CircleCI 流水线都是 YAML。当流水线意外中断时,将当前配置与上次有效版本进行 diff,通常可以立即找到罪魁祸首:一个被修改的触发器条件,或一个被删除的密钥引用。

审计 Helm chart values 变更

在 Helm 升级前,将旧的 values.yaml 与新版本进行 diff。这会显示哪些默认值发生了变化,以及您的自定义覆盖是否仍然适用。在升级大型 chart 时,这可以防止意外的配置漂移。

比较 Ansible playbook 或 role 变更

将两个版本的 Ansible task 列表或变量文件粘贴到这里,精确查看哪些 task 被添加、删除或修改。这比在 Git 中滚动大型 diff 要快得多,尤其是当变更分散在深层嵌套的 YAML 结构中时。

验证 Terraform 变量文件

Terraform 的 .tfvars 文件通常是 YAML 格式。在将变量推送到生产环境之前,在此比较 staging 和 prod 的变量文件,捕获意外的差异,例如不同的区域端点或功能标志设置。

检查 Docker Compose 文件变更

将旧的 docker-compose.yml 粘贴到左侧,新版本粘贴到右侧,查看服务定义、环境变量或挂载是否发生了变化。这对于在部署到生产环境之前捕获意外的配置更改特别有用。

YAML 快速参考

关于此工具最常暴露的 YAML 解析边缘情况的简短速查表。所有内容均基于 YAML 规范和真实解析器行为。

TopicWhat this tool does
缩进只能使用空格,数量是有意义的。两个和四个空格都很常见;在一个文件中选择一种并坚持使用。维基百科上的 YAML 概述有很好的历史背景介绍。
Tab规范禁止作为缩进使用。在标量值内部是允许的。如果您的编辑器在 .yaml.yml 文件中按 Enter 后插入 tab,请将其配置为使用空格。
锚点和别名&name 定义一个锚点;*name 引用它。对于重复大块内容(如容器环境变量或默认服务配置)非常方便,避免复制粘贴。
合并键<<: *base 将引用的映射合并到当前映射中。这是一个 YAML 1.1 特性。大多数解析器(包括 libyaml)仍然接受它;YAML 1.2 规范删除了它。
多文档文件三个连字符(---)分隔同一流中的文档。对于通过一个 kubectl apply -f 发送多个 Kubernetes 对象很方便。... 终止文档。
块标量| 保留换行符(字面量);> 将它们折叠为空格。修饰符 -+ 控制结尾换行符。对 shell 脚本使用 |,对长散文使用 >
Norway 问题未加引号的 NOYESONOFF 在 YAML 1.1 中被解析为布尔值。加引号或使用 1.2 解析器。请参阅 YAML 类型定义了解哪些字符串会被转换。
编码YAML 1.2 规范要求 UTF-8。允许带 BOM 的 UTF-16。实际上,工具期望不带 BOM 的 UTF-8,因此请以这种方式保存文件以避免意外。

YAML diff:常见问题

这个工具会保存或上传我的 YAML 吗?

不会。diff 完全在您的浏览器中运行。没有任何内容被发送到服务器、记录或存储。粘贴 Kubernetes 密钥或 CI 配置后关闭标签页,不会留下任何副本。打开 DevTools 并查看网络标签,在比较时没有出站请求。

YAML 键重排会显示为变更吗?

是的,文本 diff 会将其标记为差异,即使 YAML 规范规定映射是无序的。在 diff 前格式化两侧,格式化器会以一致的顺序输出键,最小化这种虚假差异。对于精确的语义等价性,您需要一个结构感知的 YAML 差异工具。

可以比较两个 YAML 文件而不是粘贴文本吗?

可以。点击任意窗格上的上传,从磁盘直接选择 .yaml.yml 文件,无需复制粘贴。文件在浏览器中本地读取,永远不会发送到任何地方。

YAML 中可以使用 tab 吗?

YAML 规范明确禁止在缩进中使用 tab 字符。Tab 在 YAML 中不是空白字符。如果您的文件使用 tab 进行缩进,大多数 YAML 解析器会报错。此工具会检测并警告 tab 字符。在粘贴之前,将 tab 转换为空格(通常是 2 或 4 个空格)。

免费吗?需要注册吗?

免费,无需注册。没有账户,没有试用期,比较次数也没有限制。粘贴两个 YAML 片段,diff 立即出现。复制和下载按钮会给您干净的输出,没有水印。

这与其他在线 YAML diff 工具有何不同?

比较完全在您的浏览器中运行,所以您的 YAML 永远不会被上传,包括含有密钥或密码的配置文件。高亮是字符级的,带有语义清理,还内置了 YAML 语法高亮、tab 警告和文件上传功能。

可以同时比较两个以上的 YAML 文件吗?

不能在一个视图中。工具为两侧设计:原始版和修改版。如果您有三个版本,请两两比较。对于跨多个文件的批量比较,考虑在命令行使用 diff 命令或 dyff(一个专门的 YAML 差异工具)。

如何处理含有锚点和别名的 YAML?

diff 工具保留锚点(&name)和别名(*name)原样。它们作为文本字符处理,所以如果锚点名称或别名引用发生变化,这些变化会在 diff 中高亮显示。工具不会解析或展开别名来进行语义比较。

隐私与工作原理

您的 YAML 不会离开您的浏览器。编辑器、语法高亮和 diff 都在您的机器上本地运行。没有对您输入的分析,没有日志,没有云端往返。我们遵循的格式是 YAML 1.2.2 规范。如需验证没有任何内容被上传,打开 DevTools 并在比较时查看网络标签。