Diff Checker: compara dos textos
Cómo funciona
Pega el texto original en Texto A y la versión modificada en Texto B. La herramienta los alinea línea a línea e imprime un único resultado unificado: las líneas que están en A y faltan en B salen en rojo y con un signo menos delante (eliminaciones), las líneas añadidas en B salen en verde y con un signo más (adiciones) y las líneas sin cambios quedan neutras. Un contador sobre el resultado da los totales. La comparación es a nivel de línea, así que una línea con una palabra cambiada aparece como una eliminación seguida de una adición, no como un resaltado dentro de la línea.
La comparación es un diff de subsecuencia común más larga (LCS), calculado con la clásica tabla de programación dinámica. Produce el mismo conjunto mínimo de cambios que `git diff`, `diff -u` y la vista de pull requests de GitHub, que llegan a él por el camino más rápido de Myers, así que si cambias una palabra en medio de un párrafo, solo cambia esa línea y el contexto que la rodea se queda quieto.
Funciona igual de bien con: • Código fuente: ve qué ha cambiado entre dos versiones de una función antes de hacer commit • Configuración en JSON, YAML o TOML: localiza la única clave que difiere entre preproducción y producción • Prosa: compara dos borradores de un artículo, un contrato o un correo • Logs: compara dos fragmentos de log para encontrar la marca de tiempo en la que el comportamiento divergió • CSV / TSV: comprueba qué filas han cambiado en una exportación de una hoja de cálculo
Cómo trata los casos límite más comunes: • Las diferencias de espacios al final de línea y de CRLF/LF se marcan, porque cambian el contenido en bytes. No hay un interruptor para ignorar espacios, así que si solo te importan los cambios reales, recorta el texto antes de pegarlo. • Las líneas largas se ajustan visualmente, pero el diff trata cada una como una línea lógica; por dentro sigue siendo preciso carácter a carácter. • La sangría mezclada (tabulaciones frente a espacios) aparece como una diferencia. Convierte un lado para que coincida con el otro si solo quieres cambios semánticos. • El salto de línea al final de la última línea: si un archivo tiene salto final y el otro no, la última línea aparece como una diferencia. Coincide con el comportamiento de `diff -u`.
Toda la comparación se ejecuta en tu navegador, en JavaScript. Dos archivos de 5000 líneas se comparan en bastante menos de un segundo en un portátil actual; en un teléfono la misma comparación tarda de 1 a 3 segundos.
Preguntas frecuentes
¿Qué algoritmo de diff usa?
- Un diff de subsecuencia común más larga, calculado con la clásica tabla de programación dinámica. Devuelve el conjunto mínimo de cambios entre dos entradas, el mismo resultado que producen `git diff`, `diff -u` de GNU y la vista de pull requests de GitHub con el algoritmo de Myers, así que lo que ves aquí coincide con lo que verías en local.
¿Puedo comparar archivos de código?
- Sí. La herramienta no distingue tipos de texto: pega dos versiones de un archivo de JavaScript, Python, Go o SQL y las compara línea a línea como lo hace `git diff`. No hay un diff que conozca la sintaxis (no sabe que una línea es JSON y otra HTML), pero para la gran mayoría de las revisiones de código lo que necesitas es justo la comparación línea a línea.
¿Cómo ignoro las diferencias de espacios en blanco?
- Prepara antes el texto: quita los espacios al final de cada línea, unifica las tabulaciones en espacios (o al revés) y deja los saltos de línea en LF o en CRLF, uno u otro. Pasar cada lado por el convertidor de mayúsculas y minúsculas o por cualquier utilidad de recorte antes de pegar es una forma rápida de hacerlo. No hay un interruptor para ignorar espacios: el diff siempre compara los caracteres exactos de cada línea.
¿Qué diferencia hay entre un diff por líneas y uno por palabras?
- Un diff por líneas trata cada línea como una unidad, así que un solo carácter cambiado marca la línea entera como cambiada. Un diff por palabras (o por caracteres) resalta solo los fragmentos distintos dentro de la línea. Esta herramienta hace un diff por líneas: cambia un carácter y la línea entera se muestra como una eliminación más una adición. No hay resaltado a nivel de palabra dentro de una línea.
¿Por qué aparecen como distintas las líneas en blanco?
- Porque lo son. Una línea vacía en la posición 5 del original, donde la misma posición del modificado tiene contenido o no existe, ES una diferencia, y la herramienta la muestra. A mucha gente le sorprende la primera vez, pero es el comportamiento correcto: los caracteres invisibles tienen significado en la sangría de Python, en la estructura de YAML y en los mensajes de commit de Git.
¿Cuál es el tamaño máximo de archivo que puedo comparar?
- No hay un límite fijo, porque todo se ejecuta en tu navegador. La tabla LCS es O(N×M) para entradas de longitud N y M, así que dos entradas de 100 000 líneas tardan un tiempo apreciable (de 30 a 60 segundos aproximadamente en un portátil actual). Para archivos muy grandes, por ejemplo dos volcados de log de 50 MB, usa una herramienta de escritorio: una pestaña del navegador no es el sitio para esa escala.
¿Se envían mis datos a algún sitio?
- No. El algoritmo de diff se ejecuta por completo en tu navegador, y la pestaña Red de las herramientas para desarrolladores confirma que no sale ninguna petición cuando pegas y comparas. Importa cuando comparas archivos de configuración con credenciales, contratos, código fuente sujeto a confidencialidad o cualquier cosa que prefieras no pegar en una página web cualquiera.
Modos de diff: qué responde cada tipo de comparación
Distintas formas de comparar dos textos. El diff por líneas que implementa esta herramienta es el más habitual, pero conocer las alternativas ayuda a elegir la herramienta adecuada para cada pregunta.
| Modo | Granularidad | Ideal para | Caso de uso de ejemplo |
|---|---|---|---|
| Diff por líneas (esta herramienta) | Una línea cada vez | Código fuente, configuración, logs estructurados | Revisar un commit o un pull request de Git |
| Diff por palabras | Fragmentos dentro de una línea | Prosa, cambios en un párrafo | Comparar dos versiones de un párrafo |
| Diff por caracteres | Cada carácter | Cadenas muy cortas, nombres, identificadores | Detectar erratas de una letra |
| Diff en paralelo | Vista de líneas en dos columnas | Revisión visual de código con todo el contexto | git diff --side-by-side |
| Diff unificado | Una sola columna con marcadores @@ | Archivos de parche, revisión en el terminal | git diff (por defecto), patch -p1 |
| Diff semántico | Conoce la estructura del lenguaje | Refactorizar sin el ruido de los espacios | diff-so-fancy, difftastic, herramientas de diff semántico |
| Fusión a tres bandas | Original y dos modificaciones | Resolver conflictos entre ramas | Resolución de conflictos de git merge |
| Diff binario | Byte a byte | Comparar ejecutables, imágenes, archivos comprimidos | bsdiff, xdelta (no basado en texto) |
Todos los modos de diff basados en texto se apoyan, en último término, en el algoritmo de Myers (1986) o en el de Hunt-McIlroy (1976, el diff original de Unix). El git moderno usa el de Myers con las heurísticas patience y histogram para obtener un resultado más limpio en código muy editado.