Muchas veces, cuando dos archivos «tienen el mismo contenido» pero diff muestra montones de diferencias, la culpa es de los espacios: el editor borró los espacios al final de línea, convirtió tabuladores en espacios o cambió el ancho de la sangría. Las herramientas diff ofrecen opciones para ignorar estas diferencias, pero cada una ignora un alcance distinto, así que conviene saber exactamente qué hace cada una.
Opciones de GNU diff relacionadas con los espacios
| Opción | Nombre largo | Qué ignora |
|---|---|---|
-Z | --ignore-trailing-space | Los espacios al final de línea |
-E | --ignore-tab-expansion | Las diferencias debidas a expandir tabuladores en espacios |
-b | --ignore-space-change | Los cambios en la cantidad de espacios y los espacios al final de línea |
-w | --ignore-all-space | Todos los espacios |
-B | --ignore-blank-lines | Los cambios que solo añaden o eliminan líneas en blanco |
-i | --ignore-case | Las mayúsculas y minúsculas |
--strip-trailing-cr | El carácter CR al final de las líneas de entrada |
Opciones equivalentes de git diff
La documentación de git las describe así:
--ignore-cr-at-eol: ignora el retorno de carro (CR) al final de línea al comparar.--ignore-space-at-eol: ignora los cambios en los espacios al final de línea.-b,--ignore-space-change: ignora los cambios en la cantidad de espacios. Ignora los espacios al final de línea y considera equivalentes todas las secuencias de uno o más espacios.-w,--ignore-all-space: ignora los espacios al comparar líneas. Ignora las diferencias incluso cuando un lado tiene espacios y el otro no.--ignore-blank-lines: ignora los cambios cuyas líneas están todas en blanco.
La diferencia clave entre -b y -w
Es habitual confundir estas dos opciones. Lo esencial es si distinguen entre que haya o no haya espacio.
| Izquierda | Derecha | -b (ignorar cantidad de espacios) | -w (ignorar todos los espacios) |
|---|---|---|---|
a b | a b | Iguales | Iguales |
a b | ab | Distintas | Iguales |
x = 1 | x=1 | Distintas | Iguales |
if (a) + espacio al final | if (a) | Iguales | Iguales |
| Sangría con 1 tabulador | Sangría con 4 espacios | Iguales | Iguales |
-b reduce cada grupo de espacios a uno solo; -w elimina todos los espacios antes de comparar. Por eso -w considera iguales x = 1 y x=1, e incluso int a e inta.
El riesgo cuando la sangría tiene significado
En archivos donde la sangría forma parte de la sintaxis, como Python, YAML o Makefile, las opciones para ignorar espacios pueden ocultar cambios reales.
if ready:
start()
notify()
if ready:
start()
notify()
En el segundo, notify() ha salido del bloque if y el comportamiento cambia, pero si comparas con -w se eliminan todos los espacios y la diferencia desaparece. -b sí la detecta, porque el espacio al principio de la línea pasa de «existir» a «no existir». Sin embargo, si la sangría pasa de 4 a 8 espacios y el código entra en un bloque más interno, solo ha cambiado la cantidad de espacios, así que -b tampoco lo muestra.
Lo seguro es comparar sin opciones de espacios los archivos en los que la sangría importa. Usa las opciones de espacios para comprobar «si un cambio es solo de formato», y acostúmbrate a hacer la revisión final sin ellas.
Alcance de ignorar líneas en blanco (-B)
-B y la opción --ignore-blank-lines de git ocultan los cambios formados solo por líneas en blanco. Si una línea en blanco añadida está en el mismo hunk que otro cambio real, puede seguir mostrándose. Resulta útil en documentos en los que se cambió el número de líneas en blanco entre párrafos, o cuando un formateador de código ajustó las líneas en blanco entre funciones.
Equivalencias con las opciones de este sitio
| Este sitio | GNU diff más cercano | git diff más cercano |
|---|---|---|
| Espacios: comparar tal cual | (sin opción) | (sin opción) |
| Espacios: ignorar espacios al final de línea | -Z | --ignore-space-at-eol |
| Espacios: ignorar cantidad de espacios | -b | -b |
| Espacios: ignorar todos los espacios | -w | -w |
| Ignorar mayúsculas | -i | (no aplica) |
| Ignorar líneas en blanco | Similar a -B (excluye las líneas en blanco de la comparación) | Similar a --ignore-blank-lines |
| Normalizar fin de línea | --strip-trailing-cr + ignorar el salto de línea final | Similar a --ignore-cr-at-eol |
La opción «Ignorar líneas en blanco» de este sitio saca por completo las líneas en blanco de la comparación y solo las muestra atenuadas. Además, las opciones de ignorar también se aplican al resaltado dentro de la línea: con «ignorar cantidad de espacios» activada, no se resaltan las partes que solo difieren en el número de espacios.
Pruébalo en esta herramienta
Introduce los ejemplos de la tabla en el comparador de textos y cambia las opciones de espacios una a una: verás la diferencia al momento. Las «diferencias invisibles», como el CR al final de línea o el salto de línea al final del archivo, se tratan en Caracteres de fin de línea y diferencias invisibles, y cómo leer el resultado como patch, en Cómo leer un diff unificado.