DevToolBoxGRATIS
Blog

Diff Checker y Comparacion de Texto: Guia Completa con Ejemplos de Codigo

12 min de lecturapor DevToolBox

Un diff checker es una herramienta esencial para cada desarrollador, escritor y administrador de sistemas. Ya sea que necesites comparar dos archivos, revisar cambios de codigo o encontrar diferencias entre dos textos, comprender los algoritmos de diff te hara significativamente mas productivo. Esta guia completa cubre desde los algoritmos de text diff hasta ejemplos de codigo en Git, JavaScript, Python y Bash.

Prueba nuestra herramienta gratuita de comparacion de texto en linea.

Que es un Diff Checker?

Un diff checker (tambien conocido como herramienta de comparacion de texto) es un software que toma dos textos o archivos e identifica las diferencias entre ellos. La salida muestra que lineas fueron agregadas, eliminadas o modificadas. El concepto se origino con el comando diff de Unix creado por Douglas McIlroy en 1974.

Un diff checker resuelve el problema de responder eficientemente: "Que cambio entre la version A y la version B?" El algoritmo debe encontrar el conjunto minimo de ediciones que transforme el texto A en el texto B, basado en el algoritmo LCS (Subsecuencia Comun Mas Larga).

Las herramientas de diff en linea modernas ofrecen resaltado de sintaxis, deteccion de diferencias a nivel de caracteres, vistas lado a lado y en linea, y capacidades de diff semantico.

Como funcionan los algoritmos de diff

La base de cada diff checker es el algoritmo LCS (Subsecuencia Comun Mas Larga). Encuentra la secuencia mas larga de elementos que aparecen en el mismo orden en ambas entradas.

El algoritmo LCS clasico tiene complejidad O(n*m). El algoritmo de Myers (1986) encuentra el script de edicion mas corto en O(n*d), donde d es el numero de diferencias. Es el algoritmo usado por Git.

El algoritmo de Myers explora un grafo de operaciones de edicion y encuentra el camino mas corto de manera optima.

Diff linea por linea vs caracter por caracter: La mayoria de herramientas primero comparan a nivel de lineas y luego hacen un diff de caracteres dentro de las lineas modificadas.

Tipos de salida Diff

Existen varios formatos estandar para mostrar resultados de diff:

Diff unificado: El formato mas comun, usado por git diff. Muestra cambios con prefijos + y -, con marcadores @@.

Diff lado a lado: Muestra el texto original y modificado en dos columnas adyacentes con cambios resaltados.

Diff en linea: Muestra versiones antigua y nueva entrelazadas en una sola columna con codigo de colores.

Diff contextual: Un formato antiguo que usa ! para lineas modificadas con secciones *** y ---.

Diff por palabras: Compara palabras individuales en lugar de lineas completas. Git lo soporta con git diff --word-diff.

Casos de uso comunes

La verificacion de diff y la comparacion de texto son parte integral de muchos flujos de trabajo:

Revision de codigo: Cada pull request es fundamentalmente un diff. Los desarrolladores revisan el diff para entender cambios y verificar calidad.

Versionado de documentos: Escritores y profesionales legales frecuentemente comparan archivos para rastrear cambios entre revisiones.

Cambios en archivos de configuracion: Los administradores comparan archivos de configuracion antes y despues de los cambios para verificacion.

Comparacion de respuestas API: Los desarrolladores comparan respuestas JSON/XML entre entornos para identificar cambios inesperados.

Resolucion de conflictos de merge: Comprender el diff es esencial para resolver correctamente conflictos de Git.

Ejemplos de codigo Diff

Comandos Git Diff

Git tiene el diff checker integrado mas poderoso. Aqui estan los comandos git diff esenciales:

# ===== Basic git diff commands =====

# Compare working directory with staging area (unstaged changes)
git diff

# Compare staging area with last commit (staged changes)
git diff --staged
# or equivalently:
git diff --cached

# Compare working directory with last commit (all changes)
git diff HEAD

# Compare two specific commits
git diff abc1234 def5678

# Compare current branch with another branch
git diff main..feature-branch

# Compare a specific file between commits
git diff HEAD~3 HEAD -- src/app.js

# ===== Advanced git diff options =====

# Word-level diff (great for prose and documentation)
git diff --word-diff
# Output: [-old word-]{+new word+}

# Word diff with color only (no markers)
git diff --word-diff=color

# Show only file names that changed
git diff --name-only HEAD~5

# Show file names with change status (Added/Modified/Deleted)
git diff --name-status main..feature

# Show diff statistics (insertions/deletions per file)
git diff --stat
# Output:
#  src/app.js    | 15 +++++++++------
#  src/utils.js  |  8 +++++---
#  2 files changed, 14 insertions(+), 9 deletions(-)

# One-line summary of changes
git diff --shortstat
# Output: 2 files changed, 14 insertions(+), 9 deletions(-)

# Ignore whitespace changes
git diff -w
# or: git diff --ignore-all-space

# Ignore blank line changes
git diff --ignore-blank-lines

# Show diff with 10 lines of context (default is 3)
git diff -U10

# Generate a patch file
git diff > my-changes.patch

# Apply a patch file
git apply my-changes.patch

# Check if a patch applies cleanly (dry run)
git apply --check my-changes.patch

JavaScript Text Diff (paquete npm diff)

El paquete npm diff es la biblioteca JavaScript mas popular para calcular diferencias de texto:

// npm install diff
const Diff = require('diff');

const oldText = `function greet(name) {
  console.log("Hello, " + name);
  return true;
}`;

const newText = `function greet(name, greeting) {
  console.log(greeting + ", " + name + "!");
  return true;
}`;

// ===== Line-by-line diff =====
const lineDiff = Diff.diffLines(oldText, newText);
lineDiff.forEach(part => {
  const prefix = part.added ? '+' : part.removed ? '-' : ' ';
  const lines = part.value.split('\n').filter(l => l);
  lines.forEach(line => console.log(prefix + ' ' + line));
});
// Output:
// - function greet(name) {
// + function greet(name, greeting) {
// -   console.log("Hello, " + name);
// +   console.log(greeting + ", " + name + "!");
//     return true;
//   }

// ===== Character-level diff =====
const charDiff = Diff.diffChars('hello world', 'hello there');
charDiff.forEach(part => {
  const color = part.added ? '\x1b[32m' : part.removed ? '\x1b[31m' : '';
  process.stdout.write(color + part.value + '\x1b[0m');
});
// Highlights exact character changes

// ===== Word-level diff =====
const wordDiff = Diff.diffWords(
  'The quick brown fox jumps over the lazy dog',
  'The slow brown fox leaps over the tired dog'
);
wordDiff.forEach(part => {
  if (part.added) console.log('[+] ' + part.value);
  else if (part.removed) console.log('[-] ' + part.value);
});

// ===== Generate unified patch =====
const patch = Diff.createPatch(
  'greeting.js',  // filename
  oldText,         // old content
  newText,         // new content
  'original',      // old header
  'modified'       // new header
);
console.log(patch);
// Output: standard unified diff format

// ===== Apply a patch =====
const applied = Diff.applyPatch(oldText, patch);
console.log(applied === newText); // true

// ===== Structured patch for multiple files =====
const structuredPatch = Diff.structuredPatch(
  'old/file.js', 'new/file.js',
  oldText, newText, '', ''
);
console.log(JSON.stringify(structuredPatch.hunks, null, 2));

Python Diff (modulo difflib)

Python incluye el poderoso modulo difflib en su biblioteca estandar:

import difflib

old_text = """function greet(name) {
  console.log("Hello, " + name);
  return true;
}""".splitlines(keepends=True)

new_text = """function greet(name, greeting) {
  console.log(greeting + ", " + name + "!");
  return true;
}""".splitlines(keepends=True)

# ===== Unified diff (most common format) =====
diff = difflib.unified_diff(
    old_text, new_text,
    fromfile='greeting.js.orig',
    tofile='greeting.js',
    lineterm=''
)
print('\n'.join(diff))
# Output:
# --- greeting.js.orig
# +++ greeting.js
# @@ -1,4 +1,4 @@
# -function greet(name) {
# -  console.log("Hello, " + name);
# +function greet(name, greeting) {
# +  console.log(greeting + ", " + name + "!");
#    return true;
#  }

# ===== Context diff (older format) =====
ctx_diff = difflib.context_diff(
    old_text, new_text,
    fromfile='original', tofile='modified'
)
print('\n'.join(ctx_diff))

# ===== HTML visual diff report =====
d = difflib.HtmlDiff()
html = d.make_file(
    old_text, new_text,
    fromdesc='Original',
    todesc='Modified',
    context=True,  # show only changed sections
    numlines=3     # lines of context
)
with open('diff_report.html', 'w') as f:
    f.write(html)

# ===== SequenceMatcher for similarity ratio =====
seq = difflib.SequenceMatcher(None,
    ''.join(old_text), ''.join(new_text))
print(f"Similarity ratio: {seq.ratio():.2%}")
# Output: Similarity ratio: 72.41%

# ===== Get matching blocks =====
for block in seq.get_matching_blocks():
    print(f"  a[{block.a}:{block.a+block.size}] == "
          f"b[{block.b}:{block.b+block.size}] "
          f"(size={block.size})")

# ===== Get opcodes (edit operations) =====
for op, i1, i2, j1, j2 in seq.get_opcodes():
    print(f"  {op:8s} a[{i1}:{i2}] b[{j1}:{j2}]")
# Output:
#   equal    a[0:0] b[0:0]
#   replace  a[0:28] b[0:38]
#   equal    a[28:50] b[38:60]

# ===== Compare two files =====
with open('file1.txt') as f1, open('file2.txt') as f2:
    diff = difflib.unified_diff(
        f1.readlines(), f2.readlines(),
        fromfile='file1.txt', tofile='file2.txt'
    )
    print('\n'.join(diff))

Bash / Linux Diff

Linux y macOS proporcionan varias herramientas de linea de comandos para comparacion de texto:

# ===== Basic diff command =====

# Compare two files (default output format)
diff file1.txt file2.txt

# Unified diff format (most readable)
diff -u file1.txt file2.txt
# Output:
# --- file1.txt  2024-01-15 10:30:00
# +++ file2.txt  2024-01-15 11:45:00
# @@ -1,4 +1,4 @@
# -old line 1
# +new line 1
#  unchanged line

# Side-by-side comparison
diff -y file1.txt file2.txt
# or with specific width:
diff -y -W 120 file1.txt file2.txt

# Show only lines that differ (with side-by-side)
diff -y --suppress-common-lines file1.txt file2.txt

# Ignore case differences
diff -i file1.txt file2.txt

# Ignore all whitespace
diff -w file1.txt file2.txt

# Ignore blank lines
diff -B file1.txt file2.txt

# Recursive directory comparison
diff -r dir1/ dir2/

# Brief output (just report if files differ)
diff -q file1.txt file2.txt
# Output: Files file1.txt and file2.txt differ

# ===== Enhanced diff tools =====

# colordiff: colorized diff output
# Install: apt install colordiff / brew install colordiff
colordiff -u file1.txt file2.txt

# vimdiff: side-by-side in Vim editor
vimdiff file1.txt file2.txt

# sdiff: interactive side-by-side merge
sdiff file1.txt file2.txt

# ===== Practical examples =====

# Compare command output
diff <(ls dir1/) <(ls dir2/)

# Compare sorted files
diff <(sort file1.txt) <(sort file2.txt)

# Compare remote file with local file
diff <(curl -s https://example.com/config.yml) local-config.yml

# Generate a patch file
diff -u original.txt modified.txt > changes.patch

# Apply a patch
patch original.txt < changes.patch

# Dry run (check if patch applies cleanly)
patch --dry-run original.txt < changes.patch

# Reverse a patch
patch -R original.txt < changes.patch

# Compare two strings directly
diff <(echo "hello world") <(echo "hello there")

Como leer la salida Diff

Entender la salida diff es una habilidad fundamental. Aqui esta el formato diff unificado:

Encabezados de archivo: El diff comienza con --- a/file.txt (original) y +++ b/file.txt (modificado).

Encabezados de bloque: Las lineas @@ indican la ubicacion de los cambios con formato @@ -inicio,cantidad +inicio,cantidad @@.

Lineas modificadas: Las lineas - (rojo) fueron eliminadas, las lineas + (verde) fueron agregadas. Las lineas sin prefijo son contexto.

# Example: reading a unified diff

diff --git a/src/config.js b/src/config.js
index 8a3b5c1..f29d4e2 100644
--- a/src/config.js                    ← original file
+++ b/src/config.js                    ← modified file
@@ -12,8 +12,9 @@ const defaults = {      ← hunk header: line 12, 8→9 lines
   timeout: 3000,                       ← context (unchanged)
   retries: 3,                          ← context (unchanged)
-  baseUrl: 'http://localhost:3000',    ← REMOVED (red)
-  debug: false,                        ← REMOVED (red)
+  baseUrl: 'https://api.example.com', ← ADDED (green)
+  debug: true,                         ← ADDED (green)
+  verbose: true,                       ← ADDED (green, new line)
   headers: {                           ← context (unchanged)
     'Content-Type': 'application/json' ← context (unchanged)
   }                                    ← context (unchanged)

Archivos patch: Un diff puede guardarse como .patch y aplicarse con git apply o patch -p1.

Estadisticas: Use git diff --stat para un resumen de cambios por archivo.

# git diff --stat output example:
 src/config.js     | 5 +++--
 src/app.js        | 12 ++++++------
 tests/config.test | 28 ++++++++++++++++++++++++++++
 3 files changed, 37 insertions(+), 8 deletions(-)

# The bar shows the ratio of additions (+) to deletions (-)
# Longer bars = more changes in that file

Comparacion de las mejores herramientas Diff

Aqui estan las mejores herramientas diff disponibles:

ToolTypePricePlatformBest For
DevToolBoxWebFreeAny browserQuick online comparisons
VS CodeEditorFreeWin/Mac/LinuxCode review + editing
Beyond CompareDesktop$35-60Win/Mac/Linux3-way merge, folder sync
MeldDesktopFreeLinux/Mac/WinVisual diff + VCS integration
WinMergeDesktopFreeWindowsFile + folder comparison
diff (CLI)CLIFreeUnix/Linux/MacScripting + CI/CD pipelines
git diffCLIFreeAnyVersion control diffs

DevToolBox Text Diff (Online): Nuestra herramienta gratuita ofrece comparacion lado a lado instantanea con resaltado de sintaxis y diff a nivel de caracteres.

VS Code Diff integrado: VS Code incluye un excelente editor diff con vistas en linea y lado a lado.

Beyond Compare: Herramienta comercial con merge de tres vias y sincronizacion de carpetas.

Meld: Herramienta libre de diff visual para Linux, macOS y Windows.

WinMerge: Herramienta libre de diff para Windows con integracion shell.

Comando diff (Unix): La herramienta diff original de linea de comandos, rapida y scriptable.

Preguntas frecuentes

Como comparo dos archivos de texto en linea?

Pegue el contenido de cada archivo en una herramienta diff en linea como nuestro Text Diff Checker gratuito. La herramienta resaltara las lineas agregadas (verde), eliminadas (rojo) y contexto sin cambios. La mayoria soporta vistas lado a lado y en linea.

Que significan + y - en la salida diff?

En el formato diff unificado, las lineas con + indican contenido agregado y las lineas con - indican contenido eliminado. Las lineas sin prefijo son contexto sin cambios. Los marcadores @@ muestran los numeros de linea.

Como funciona git diff?

Git diff usa el algoritmo de Myers para encontrar el conjunto minimo de cambios entre dos versiones. Sin argumentos, compara el directorio de trabajo con el index. git diff --staged compara el index con HEAD. La salida es en formato diff unificado.

Dominar las herramientas diff es una habilidad fundamental para desarrolladores y administradores. Use nuestra herramienta gratuita para comparacion instantanea de texto.

Compare dos textos instantaneamente con nuestra herramienta Diff Checker gratuita.

𝕏 Twitterin LinkedIn
¿Fue útil?

Mantente actualizado

Recibe consejos de desarrollo y nuevas herramientas.

Sin spam. Cancela cuando quieras.

Prueba estas herramientas relacionadas

±Text Diff Checker123Word Counter↕️Line Sort & Dedup

Artículos relacionados

Git Commands Cheat Sheet: Comandos esenciales para todo desarrollador

Cheat sheet completo de comandos Git: configuración, ramas, merge, rebase, stash y flujos avanzados.

Git Rebase vs Merge: Cuándo usar cada uno (con ejemplos visuales)

Entiende la diferencia entre git rebase y merge. Aprende cuándo usar cada uno y evita errores comunes.

Git cherry-pick, revert y reset explicados

Aprende cuándo usar git cherry-pick, revert y reset. Diferencias, casos de uso y consideraciones de seguridad.

Guia de Diff de Texto Online: Algoritmos, git diff y Mejores Practicas

Analisis profundo de herramientas y algoritmos de diff de texto. Myers, Patience, Histogram diff, formato unificado git diff, herramientas de terminal, jsdiff, Python difflib, diff semantico, fusion de tres vias, deteccion de regresion CI/CD y mejores practicas.