Comparador de Texto

Compara dos textos y ve las líneas añadidas, borradas y cambiadas

Introduce ambos textos y pulsa Comparar.

Acerca de Comparador de Texto

La herramienta divide ambos textos en líneas y los compara con un algoritmo de subsecuencia común más larga (LCS): conserva el mayor número posible de líneas comunes, marca como eliminadas (-) las que solo están a la izquierda y como añadidas (+) las que solo están a la derecha. No resalta qué caracteres cambiaron dentro de una línea.

Si alguna vez un diff te ha parecido «equivocado», es porque los algoritmos de diferencias buscan la descripción más corta del cambio, no el cambio que tú hiciste. Aquí se explica por qué y cómo obtener resultados más legibles.

De dónde viene diff

Calcular un diff equivale a buscar la lista más corta de inserciones y borrados que transforma el texto A en el B. El diff original de Unix (1976) usaba el algoritmo de Hunt y McIlroy. En 1986 Eugene Myers publicó en Algorithmica «An O(ND) Difference Algorithm and Its Variations», donde N es la longitud total de ambas entradas y D el tamaño de la edición mínima. Como el tiempo depende de D, es rápido cuando los archivos se parecen mucho, que es lo habitual. Git sigue usándolo por defecto.

Esta herramienta también usa el algoritmo de Myers, en su versión de espacio lineal que divide el problema por la mitad. La memoria crece con el número de líneas, no con su producto, y dos archivos de 20.000 líneas que difieren en un 1 % se comparan en menos de un segundo. Si los textos son distintos en casi todas las líneas, el tiempo crece con la diferencia y decenas de miles de líneas pueden tardar unos segundos. El número de cambios siempre es el mínimo, pero cuando hay varias soluciones mínimas puede elegir otra distinta de la de Git. Dentro de un bloque cambiado, muestra primero los borrados.

Por qué un diff parece incorrecto

El caso típico es el código: añades una función justo encima de otra parecida y el diff empareja las llaves de cierre «al revés», como si hubieras insertado el final de la nueva y el principio de la vieja. No hay error: existen varias ediciones igual de cortas y el algoritmo eligió una. Por eso Git ofrece --diff-algorithm=patience e histogram, que primero anclan las líneas que aparecen una sola vez en cada archivo y suelen coincidir mejor con la intención humana.

diff no conoce el concepto de «mover». Si intercambias dos párrafos, verás un borrado y una inserción.

Cambiar una letra marca la línea entera como eliminada y añadida. Esa es la diferencia entre diff por líneas y diff por palabras. Para código y configuración, la línea es la unidad adecuada. Para prosa, donde un párrafo suele ser una sola línea larga, cualquier corrección reemplaza el párrafo completo. Poner una oración por línea antes de comparar hace el resultado mucho más legible.

Diferencias invisibles

Si dos líneas parecen idénticas y la herramienta dice que no lo son, casi seguro hay un carácter invisible. El espacio de no separación (U+00A0) aparece a menudo al copiar desde páginas web, Word o PDF. La opción de ignorar espacios al inicio y al final recorta ambos extremos, y el trim de JavaScript considera U+00A0 como espacio; pero si está en medio de la línea, la diferencia sigue.

Los finales de línea se normalizan antes de comparar: CRLF de Windows, CR y LF se tratan igual. Si Git dice que cambió cada línea de un archivo y aquí aparecen idénticos, la causa probable son los finales de línea.

  • Ignorar mayúsculas: se comparan en minúsculas, pero se muestra el texto original.
  • Ignorar líneas vacías: se eliminan en ambos lados antes de comparar; la numeración sigue siendo la original.
  • Un salto de línea final extra aparece como una línea vacía añadida.

Ejemplos

Editaste un bloque y añadiste otro

Entrada
Izquierda: if (a) { x(); } Derecha: if (a) { y(); } if (b) { x(); }
Resultado
if (a) { + y(); + } + if (b) { x(); } (3 añadidas, 0 eliminadas, 3 iguales)

Lo que hiciste son 1 borrado y 4 inserciones. El algoritmo encuentra una explicación de 3 líneas insertadas en medio: más corta, aunque no es lo que hiciste.

Parecen iguales, pero no

Entrada
Izquierda: a[NBSP]b Derecha: a b
Resultado
- a b + a b (1 añadida, 1 eliminada)

Los espacios son U+00A0 y U+0020.

Finales de línea de Windows y Unix

Entrada
Izquierda: line1\r\nline2 Derecha: line1\nline2
Resultado
line1 line2 (2 iguales)

Se normalizan antes de comparar.

Cómo se usa

  1. Pega el original a la izquierda y la versión revisada a la derecha.
  2. Activa ignorar mayúsculas, espacios o líneas vacías si esas diferencias no importan.
  3. Revisa las líneas verdes (añadidas) y rojas (eliminadas) y copia el resultado si lo necesitas.

Preguntas frecuentes

Cambié una palabra y se marca la línea entera.

La unidad de comparación es la línea. En textos largos, pon una oración por línea antes de comparar.

¿Por qué Git muestra otro diff?

Puede haber varias soluciones mínimas y cada implementación elige distinto. Además, Git distingue CRLF de LF y esta herramienta no.

¿Puedo aplicar el resultado con patch?

Sí. «Copiar diff unificado» genera un parche estándar con cabeceras de archivo (--- a/text.txt, +++ b/text.txt), cabeceras @@ -inicio,líneas +inicio,líneas @@ y tres líneas de contexto, así que patch -p1 o git apply lo aplican al archivo original. Cambia el nombre de archivo de las cabeceras por el real. Para que se aplique con exactitud, el parche compara los textos carácter por carácter, sin tener en cuenta las opciones de ignorar mayúsculas, espacios o líneas vacías.

¿Detecta la diferencia entre «á» precompuesta y a + tilde combinable?

Sí: son secuencias de caracteres distintas aunque se vean iguales, y la herramienta no normaliza Unicode.

Fuentes

Revisado el:

Privacidad y tratamiento de datos