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 es un cambio real.

Parece un cambio, pero casi nunca lo es
Lo que ves en el diff¿Es un cambio real?Qué hacer
Indentación de 2 vs 4 espaciosNo, solo importa la consistenciaReformatea ambos al mismo ancho
Claves de mapping en orden diferenteNo, los mappings no tienen ordenOrdena las claves en ambos lados
true vs "true"Sí, boolean vs cadenaInvestígalo, es real
name: Ada vs name: "Ada"No, mismo valor de cadenaNormaliza las comillas
Estilo flow [a, b] vs lista en bloqueNo, misma secuenciaElige un estilo para ambos
Elementos de secuencia en orden diferenteSí, las secuencias están ordenadasInvestí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étodoMejor paraEsfuerzo¿Entiende YAML?
Revisión visualArchivos pequeños, una o dos clavesBajoNo, tú eres el parser
Herramienta diff onlineVerificaciones rápidas, pegar desde cualquier lugarBajoCon reformateo, sí
Línea de comandos (yq)Archivos en disco, scripting, ordenar clavesMedioSí, cuando ordenas primero
IDE o git diffArchivos ya en un repositorioBajo si está confirmadoBasado 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.

  1. Abre la herramienta de comparación YAML.
  2. Pega el original a la izquierda y la nueva versión a la derecha.
  3. Haz clic en Formato en ambos lados para que compartan la misma indentación.
  4. Activa ordenar claves para que las claves de mapping reordenadas dejen de aparecer como cambios.
  5. 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:

Lo que realmente cambió
ClaveAntesDespuésCambio
roleeditoradminModificado
seats35Modificado
teamplatformAñadido
nameAda LovelaceAda LovelaceSin cambios
activetruetrueSin 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

ErrorPor qué dueleSolución
Tabulaciones para indentaciónYAML prohíbe las tabulaciones para indentación; el archivo puede que ni siquiera se parseeConvierte las tabulaciones a espacios primero
Escalares con o sin comillas"true" es una cadena, true es un booleanEsto puede ser un cambio real, no lo descartes
Anchors y aliasesUn archivo pone el valor en línea, el otro lo referenciaResuelve los anchors y luego compara la forma expandida
El problema de Noruegano puede parsearse como false en YAML 1.1Pon comillas en las cadenas ambiguas; revisa la versión de tu parser
Espacios al final de líneaEspacios invisibles después de un valor aparecen como cambioElimina 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ó.