Cómo comparar dos archivos YAML sin sufrir con la indentación
La forma más rápida de comparar dos archivos YAML es pegar ambos en una herramienta de diff lado a lado, normalizar la indentación y leer las líneas que resalta. La comparación es la parte fácil. Con YAML el ruido es más traicionero de lo habitual: una tabulación perdida, una clave reordenada o un valor que alguien envolvió en comillas pueden hacer que dos archivos que cargan los mismos datos parezcan no tener nada en común.
Esta guía explica cómo obtener un diff de YAML limpio y confiable. Veremos por qué dos archivos equivalentes se distancian en papel, qué métodos vale la pena conocer, y un ejemplo práctico que puedes seguir. Si solo quieres la herramienta, nuestra página de comparación YAML hace todo esto en el navegador.
Por qué los archivos YAML son engañosamente difíciles de comparar
YAML es un formato sensible a los espacios en blanco (consulta la especificación YAML 1.2.2), y eso es justo lo que hace que los diffs sean complicados. La indentación tiene significado, pero la cantidad de indentación no, siempre que sea consistente. Así que un archivo indentado con dos espacios y otro con cuatro pueden cargar la estructura idéntica mientras cada línea se ve diferente para un diff de texto.
Aquí está el dato clave que debes retener: un mapping de YAML es un conjunto de pares clave/valor y, como los objetos JSON, el orden de esas claves no cambia los datos. Así que esto:
name: Ada Lovelace
role: editor
y esto:
role: editor
name: Ada Lovelace
cargan el mismo mapping, aunque un diff de líneas los pinte de rojo y verde. Los elementos de una secuencia, en cambio, están ordenados, así que reordenar una lista sí es un cambio real.
| Lo que ves en el diff | ¿Es un cambio real? | Qué hacer |
|---|---|---|
| Indentación de 2 vs 4 espacios | No, solo importa la consistencia | Reformatea ambos al mismo ancho |
| Claves de mapping en orden diferente | No, los mappings no tienen orden | Ordena las claves en ambos lados |
true vs "true" | Sí, boolean vs cadena | Investígalo, es real |
name: Ada vs name: "Ada" | No, mismo valor de cadena | Normaliza las comillas |
Estilo flow [a, b] vs lista en bloque | No, misma secuencia | Elige un estilo para ambos |
| Elementos de secuencia en orden diferente | Sí, las secuencias están ordenadas | Investígalo, es real |
Dos filas ahí son trampas genuinas. true sin comillas es un boolean;
con comillas es la cadena "true", y esa distinción ha causado caídas reales. Pero
name: Ada y name: "Ada" son la misma cadena. Si quieres
el detalle técnico sobre cómo un parser resuelve esto, la sección de la
especificación sobre
el core schema
es la referencia.
Cuatro formas de comparar YAML y cuándo usar cada una
No existe un único método mejor. Depende de dónde estén los archivos y qué quieres descubrir. Así se comparan las opciones más comunes.
| Método | Mejor para | Esfuerzo | ¿Entiende YAML? |
|---|---|---|---|
| Revisión visual | Archivos pequeños, una o dos claves | Bajo | No, tú eres el parser |
| Herramienta diff online | Verificaciones rápidas, pegar desde cualquier lugar | Bajo | Con reformateo, sí |
Línea de comandos (yq) | Archivos en disco, scripting, ordenar claves | Medio | Sí, cuando ordenas primero |
IDE o git diff | Archivos ya en un repositorio | Bajo si está confirmado | Basado en líneas por defecto |
Para la mayoría de las personas, una herramienta de navegador gana en velocidad: no hay nada que instalar y puedes pegar un fragmento directamente desde un manifiesto de Kubernetes o una config de CI. El problema es el ruido de formato, que manejamos a continuación. Si vives en la terminal, yq es la herramienta que debes aprender, y puede ordenar claves de la misma forma que jq lo hace para JSON.
La comparación limpia más rápida, paso a paso
Esta es la rutina que uso cuando alguien me da dos manifiestos y pregunta "¿qué es diferente?" Tarda unos quince segundos.
- Abre la herramienta de comparación YAML.
- Pega el original a la izquierda y la nueva versión a la derecha.
- Haz clic en Formato en ambos lados para que compartan la misma indentación.
- Activa ordenar claves para que las claves de mapping reordenadas dejen de aparecer como cambios.
- Lee el resultado. El verde es añadido, el rojo es eliminado, y un valor modificado aparece como uno de cada color.
Los pasos tres y cuatro son todo el truco. Una vez que ambos archivos usan la misma indentación y sus claves están ordenadas, lo único que queda por resaltar es lo que realmente cambió. Nuestro motor de diff está construido sobre el diff-match-patch de Google, que compara línea por línea primero para que sea rápido incluso en archivos largos.
Un ejemplo práctico
Supón que estás revisando un cambio en un registro de usuario. Aquí está el antes:
name: Ada Lovelace
role: editor
active: true
seats: 3
Y aquí está el después, tal como te lo entregó un compañero:
active: true
name: Ada Lovelace
role: admin
seats: 5
team: platform
Mete esos en un diff de líneas crudo y parece que casi todas las líneas se movieron, porque las claves están en orden diferente. Reformatea y ordena ambos, y la historia real es breve:
| Clave | Antes | Después | Cambio |
|---|---|---|---|
role | editor | admin | Modificado |
seats | 3 | 5 | Modificado |
team | — | platform | Añadido |
name | Ada Lovelace | Ada Lovelace | Sin cambios |
active | true | true | Sin cambios (solo se movió) |
Tres ediciones reales: un cambio de rol, un conteo de asientos y una nueva clave de
equipo. El reordenamiento era ruido. Ese ascenso de editor a
admin es exactamente el tipo de cosa que quieres detectar en revisión,
y es fácil perdérselo cuando está enterrado bajo falsos positivos.
Eliminar el ruido de formato en la línea de comandos
Si tus archivos ya están en disco, la misma idea de "reformatear y ordenar" funciona
con dos comandos cortos. yq puede ordenar claves y reemitir una forma
canónica, así que un diff simple después es honesto:
yq -P 'sort_keys(..)' old.yaml > old.sorted.yaml
yq -P 'sort_keys(..)' new.yaml > new.sorted.yaml
diff old.sorted.yaml new.sorted.yaml
Ahora diff solo reporta valores que realmente cambiaron, porque ambos
archivos tienen la misma indentación y el mismo orden de claves. Este es el
equivalente en terminal de hacer clic en Formato y ordenar claves en el navegador.
Las trampas que son exclusivas de YAML
Algunas características de YAML causan diffs que sorprenden a la gente. Los anchors y
aliases (&name y *name) permiten que un archivo repita
un valor por referencia mientras otro lo escribe completo; ambos cargan los mismos
datos pero se leen de forma totalmente distinta. El infame "problema de Noruega" es
otro: no, off y yes sin comillas pueden
parsearse como booleans en los parsers antiguos de YAML 1.1, así que
country: NO podría convertirse en false. YAML 1.2 corrigió
el schema, pero muchas herramientas todavía traen el comportamiento de 1.1. Cuando un
valor parece haber cambiado de tipo, eso es lo primero que hay que revisar.
Errores comunes que debes vigilar
| Error | Por qué duele | Solución |
|---|---|---|
| Tabulaciones para indentación | YAML prohíbe las tabulaciones para indentación; el archivo puede que ni siquiera se parsee | Convierte las tabulaciones a espacios primero |
| Escalares con o sin comillas | "true" es una cadena, true es un boolean | Esto puede ser un cambio real, no lo descartes |
| Anchors y aliases | Un archivo pone el valor en línea, el otro lo referencia | Resuelve los anchors y luego compara la forma expandida |
| El problema de Noruega | no puede parsearse como false en YAML 1.1 | Pon comillas en las cadenas ambiguas; revisa la versión de tu parser |
| Espacios al final de línea | Espacios invisibles después de un valor aparecen como cambio | Elimina los espacios finales antes de comparar |
YAML y JSON están más cerca de lo que parece
Todo documento JSON es YAML válido, porque YAML 1.2 es un superconjunto de JSON. Eso es útil para comparar: si la indentación o los anchors te dan guerra, convierte ambos archivos a JSON, dales el mismo formato y haz el diff de eso. Muchos parsers, incluido PyYAML, hacen round-trip de YAML a una estructura de datos plana que puedes reemitir como JSON, lo que elimina las diferencias de estilo y deja solo los datos.
Herramientas relacionadas
YAML rara vez viaja solo. Si estás comparando la forma JSON de los mismos datos,
comparar JSON aplica la misma idea. Los ajustes de
entorno y los archivos .env encajan bien en la página de
comparar configuración, y revisar cambios entre
dos llamadas de API es para lo que está hecho
el diff de respuestas de API.
Preguntas frecuentes
- ¿Comparar archivos YAML online los sube a algún servidor?
- En comparetext.org el diff se ejecuta en tu navegador. Los dos archivos YAML son comparados por JavaScript en tu propia máquina, así que nada se envía a un servidor a menos que hagas clic explícitamente en Guardar o Compartir. Esto lo hace seguro para manifiestos de Kubernetes, configs de CI y otros datos que no querrías pegar en un sitio que sube todo en cada pulsación de tecla.
- ¿Por qué mis dos archivos YAML muestran cada línea como diferente?
- Casi siempre es el formato, no cambios reales. Un archivo está indentado con dos espacios, el otro con cuatro, o las claves del mapping están en orden diferente, o uno usa comillas y el otro no. Reformatea ambos lados a la misma indentación y ordena las claves para que el orden deje de importar. Después de eso el diff generalmente se reduce al puñado de valores que realmente cambiaron.
- ¿Importa el ancho de indentación al comparar YAML?
- No para el significado, solo para la consistencia. YAML usa la indentación para mostrar la estructura, pero no le importa si usas dos espacios o cuatro, siempre que cada nivel sea consistente dentro del archivo. Así que un archivo de dos espacios y uno de cuatro pueden contener datos idénticos mientras se ven completamente distintos para un diff de texto. Reformatear ambos al mismo ancho elimina esa falsa diferencia. Las tabulaciones, sin embargo, no se permiten para indentación en absoluto.
- ¿Cómo comparo YAML ignorando el orden de las claves?
- Las claves de mapping de YAML no tienen orden, así que dos archivos con las mismas claves en orden diferente contienen los mismos datos. Para que un diff de texto lo reconozca, ordena las claves en ambos lados antes de comparar. En el navegador, usa la opción de ordenar claves (canonicalizar). En la línea de comandos, yq lo hace con sort_keys. Una vez que ambos archivos tienen las claves en el mismo orden ordenado, solo aparecen los cambios de valores reales. Los elementos de secuencia mantienen su orden, así que no los ordenes.
- ¿Qué es el problema de Noruega en YAML?
- Es un clásico tropiezo de YAML donde el valor sin comillas NO se parsea como el boolean false en lugar de la cadena "NO", así que un código de país para Noruega se convierte en false. Ocurre en los parsers de YAML 1.1, que tratan yes, no, on y off como booleans. YAML 1.2 estrechó las reglas, pero muchas herramientas todavía traen el comportamiento de 1.1. Si un valor parece haber pasado de una palabra a true o false en tu diff, una cadena con aspecto de boolean sin comillas es la causa probable. Poner comillas al valor lo arregla.
- ¿Puedo comparar archivos YAML grandes sin que la página se congele?
- Sí, hasta cierto punto. Un diff en modo de líneas se mantiene rápido en archivos con miles de líneas porque compara líneas completas primero en lugar de cada carácter. Los archivos muy grandes (varios megabytes) se manejan mejor con una herramienta de línea de comandos como yq o git diff, que transmite los datos. Para cualquier cosa que puedas desplazarte cómodamente en un navegador, un diff online es la opción más rápida.
¿Listo para probarlo? Pega tus archivos en la herramienta de comparación YAML y ve qué cambió.