Sinopsis
git diff [<options>] [<commit>] [--] [<path>...]
Descripción
El comando git diff muestra diferencias entre dos conjuntos de contenido de archivos. Sin argumentos, compara el árbol de trabajo contra el área de staging, mostrando lo que no está staged. Con --cached (o --staged), compara el área de staging contra el último commit. Con uno o dos argumentos de commit, compara esos commits.
Los diffs son centrales para revisión de código, depuración y entender el historial. Git produce diffs unificados por defecto pero también puede mostrar diffs a nivel de palabra, resaltado de movimientos de color y estadísticas. Para archivos binarios, solo se muestra una línea "differ" a menos que se configure un driver de diff binario.
En el uso diario, git diff se integra estrechamente con alias de shell, plugins de editor e integración continua. Los usuarios avanzados a menudo añaden alias que combinan flags que siempre pasan. El formato de salida puede personalizarse vía configuración de Git. Cuando algo sale mal, ejecuta el comando con GIT_TRACE=1 en el entorno para revelar las llamadas plumbing subyacentes.
Entender cómo git diff interactúa con el resto del modelo de datos de Git rinde dividendos. Cada comando opera sobre algún subconjunto de las piezas (objetos, index, refs, árbol de trabajo), y saber cuáles toca ayuda a predecir resultados.
Opciones comunes
| Opción | Descripción |
|---|---|
--cached / --staged | Compara el index con HEAD en lugar de árbol de trabajo con index. |
--stat | Muestra un resumen de inserciones/eliminaciones por archivo. |
--name-only | Lista solo los nombres de archivos que difieren. |
--word-diff | Resalta cambios a nivel de palabra. |
-w, --ignore-all-space | Ignora diferencias de espacios en blanco. |
--color-moved | Resalta bloques de código que fueron movidos. |
-U<n> | Muestra n líneas de contexto (predeterminado 3). |
Ejemplos
git diff
# Cambios no staged en el árbol de trabajo
git diff --cached
# Cambios staged para el próximo commit
git diff main..feature
# Todas las diferencias entre dos branches
git diff HEAD~3 HEAD -- src/
# Últimos tres commits, restringidos a src/
Errores comunes
Olvidar --cached al revisar lo que está a punto de commitearse es una confusión clásica. Otro es usar la sintaxis de rango de dos puntos vs tres puntos incorrectamente: A..B es "diferencias de A a B", mientras que A...B es "diferencias desde la merge base hasta B". Diffs masivos solo de espacios en blanco después de cambios del editor pueden domarse con -w.
Comandos relacionados
git status, git log -p, git show, git range-diff