Curso
Explicación de Git Diff: Una guía completa con ejemplos
Git diff es tu ventana a los cambios que se producen en tu repositorio de código. En esencia, es un comando que te muestra las diferencias entre los distintos estados de tus archivos, ya sea comparando tu trabajo actual con lo que ya has preparado o comparando los cambios entre ramas y confirmaciones. Piensa que es la forma que tiene Git de responder a la pregunta: "¿Qué ha cambiado?". Cuando ejecutas git diff
, Git analiza el contenido de los archivos línea por línea, identificando lo que se ha añadido, eliminado o modificado, y presenta esta información en un formato estandarizado que destaca exactamente qué ha cambiado y dónde.
Git diff ayuda a los desarrolladores a garantizar la calidad del código, proporcionando una visión clara de las modificaciones antes de que sean confirmadas. Aquí veremos cómo utilizar eficazmente este comando esencial, desde comparaciones básicas hasta técnicas avanzadas que mejorarán tu flujo de trabajo de desarrollo y la colaboración en equipo.
Requisitos previos
Para seguir este tutorial, debes estar familiarizado con estos conceptos de Git:
- Flujo de trabajo básico de Git (init, add, commit)
- Repositorios Git y su estructura
- Ramas y su funcionamiento
- Commits e historial de commits
- La zona de parada (índice)
Si necesitas repasar estos conceptos, estos recursos te ayudarán:
- Hoja de trucos de Git- Referencia rápida para los comandos Git más comunes
- Curso de introducción a Git- Para principiantes que aprenden los fundamentos de Git
- Tutorial de GitHub y Git para principiantes- Introducción práctica a Git y GitHub
- Curso de Git intermedio- Para quienes estén preparados para avanzar en sus conocimientos de Git
Necesitarás Git instalado en tu sistema para seguir los ejemplos. Todos los comandos pueden ejecutarse en un terminal o símbolo del sistema.
Por qué Git Diff es esencial para los desarrolladores
Todo desarrollador necesita saber qué ha cambiado en su código, tanto si trabaja en solitario como en un equipo de cientos de personas. Sin git diff, te quedarías adivinando qué líneas has alterado, lo que haría casi imposible la resolución de problemas y la colaboración.
Git diff es esencial para la gestión de cambios y sirve de base para crear software de calidad mediante procesos de revisión eficaces. Al examinar los cambios, git diff proporciona el contexto necesario para comprender no sólo qué ha cambiado, sino por qué esos cambios son importantes.
Esta visibilidad directa de la evolución del código ayuda a los equipos a mantener los estándares y evitar que los errores lleguen a producción.
A medida que los proyectos crecen en complejidad, git diff se vuelve realmente indispensable por varias razones clave:
- Cambia la verificación: Confirma exactamente lo que vas a confirmar, evitando la inclusión accidental de código de depuración o cambios no relacionados
- Transferencia de conocimientos: Entender lo que han hecho los compañeros sin tener que leer archivos enteros
- Resolución de conflictos: Identifica exactamente dónde y cómo entran en conflicto los cambios durante las fusiones
- Análisis histórico: Rastrea cuándo se introdujeron cambios específicos para cazar errores o comprender la evolución de las características
- Revisiones de código específicas: Centra la atención en las partes del código que realmente cambiaron, ahorrando tiempo y mejorando la calidad de la revisión
Para utilizar git diff con eficacia, es necesario comprender la arquitectura subyacente que permite estas comparaciones: el modelo de "Tres Árboles" de Git.
Arquitectura de tres árboles de Git
Para entender git diff, primero tienes que comprender la arquitectura fundamental de "tres árboles" de Git. A pesar del nombre, no son árboles reales en el sistema de archivos, sino tres estados distintos en los que existe tu código.
Piensa en estos estados como en tres versiones diferentes de tu proyecto que Git controla simultáneamente: el Directorio de Trabajo (tus archivos reales), el Área de Escenificación (o índice, donde se preparan los cambios para su confirmación) y el Repositorio (el historial de confirmaciones de tu proyecto almacenado en el directorio .git
).
El Directorio de Trabajo contiene los archivos que estás editando activamente: aquí es donde escribes código, haces cambios y pruebas tu trabajo. El Área de Preparación actúa como una zona de preparación en la que seleccionas qué cambios deben incluirse en tu próxima confirmación . Puedes pensar que es como un muelle de carga donde se organizan los paquetes (tus cambios) antes del envío.
Por último, el Repositorio almacena la historia completa de tu proyecto como una serie de commits , instantáneas de tu código en momentos concretos, enlazadas entre sí para formar una cadena histórica.
Git diff funciona comparando estos tres estados en varias combinaciones. Cuando ejecutas git diff
sin argumentos, compara tu Directorio de Trabajo con el Área de Escenificación, mostrando los cambios que has realizado pero que aún no has escenificado .
Utilizando git diff --staged
se compara el Área de Escenificación con la última confirmación, mostrando lo que se incluirá en tu próxima confirmación .
Y git diff HEAD
compara tu Directorio de Trabajo directamente con la última confirmación, mostrando todos los cambios no comprometidos independientemente del estado de la puesta en escena.
Estos puntos de comparación constituyen la base de todas las operaciones diff en Git:
- Directorio de trabajo ↔ Zona de Reagrupamiento: ¿Qué cambios he realizado pero aún no he puesto en escena? (
git diff
) - Área de preparación ↔ Repositorio: ¿Qué cambios he realizado que se comprometerán a continuación? (
git diff --staged
) - Directorio de trabajo ↔ Repositorio: ¿Cuál es la diferencia total entre mis archivos de trabajo y el último commit? (
git diff HEAD
) - Entre commits: ¿Cómo ha evolucionado el código entre momentos concretos de la historia? (
git diff commit1-hash commit2-hash
)
Comprender esta arquitectura te proporciona el modelo mental necesario para utilizar git diff de forma eficaz para saber exactamente qué ha cambiado, dónde y cuándo en tu código base.
Una vez comprendida esta arquitectura, ahora podemos explorar cómo utilizar en la práctica los comandos git diff para obtener información sobre la evolución de tu código en estos tres estados.
Uso básico de Git Diff
Vamos a crear un proyecto de análisis de datos de muestra para demostrar git diff en acción. Crearemos un pequeño repositorio con scripts de Python, datos CSV y archivos de texto que podremos modificar a lo largo de este tutorial.
# Create and initialize our project
mkdir data-analysis-project
cd data-analysis-project
git init
# Create initial files
echo "# Data Analysis Project\nA sample project to demonstrate git diff functionality." > README.md
echo "import pandas as pd\n\ndef load_data(filename):\n return pd.read_csv(filename)\n\ndef analyze_data(data):\n return data.describe()" > analysis.py
echo "id,name,value\n1,alpha,10\n2,beta,20\n3,gamma,30" > data.csv
echo "DEBUG=False\nDATABASE_PATH=./data/" > config.txt
echo "def normalize_data(data):\n return (data - data.min()) / (data.max() - data.min())" > utils.py
# Make our first commit
git add .
git commit -m "Initial commit with basic project structure"
# Check the directory structure
> tree
.
├── README.md
├── analysis.py
├── config.txt
├── data.csv
└── utils.py
Nuestro proyecto tiene ahora cinco archivos bajo control de versiones, lo que nos da una base para demostrar varios escenarios de diff. A medida que avancemos, modificaremos estos archivos para mostrar cómo git diff revela los cambios en diferentes contextos.
Comprender los resultados de git diff
Cuando ejecutas un comando git diff, la salida sigue un formato estandarizado diseñado para indicar claramente lo que ha cambiado. Vamos a modificar nuestro archivo analysis.py
para ver un diff en acción:
# Update analysis.py with a new function
echo "import pandas as pd\n\ndef load_data(filename):\n return pd.read_csv(filename)\n\ndef analyze_data(data):\n return data.describe()\n\ndef visualize_data(data):\n return data.plot(kind='bar')" > analysis.py
Ahora examinemos el git diff resultante:
git diff
Verás un resultado similar a éste:
Nota: Para salir de la salida de git diff, pulsa "q" en tu terminal.
Desglosemos este resultado:
- La cabecera (
diff --git a/analysis.py b/analysis.py
) muestra qué archivo se está comparando, que es analysis.py - La página metadatos del archivo (
index db0e049..a7a7ab0 100644
) muestra los identificadores internos de Git para las versiones anterior y posterior - La dirección marcadores de archivo (
--- a/analysis.py and +++ b/analysis.py
) indican los archivos "antes" y "después". - La cabecera (
@@ -5,3 +5,6 @@
) muestra las líneas afectadas. Esta notación puede interpretarse como
-5,3
significa que a partir de la línea 5 del archivo original, se muestran 3 líneas en el diff+5,6
significa que a partir de la línea 5 del archivo modificado, se muestran 6 líneas en el diff- La diferencia entre estos números indica que se añadieron 3 líneas
5. Elcontenido de cambia y las líneas que empiezan por +
muestran adiciones
En archivos más grandes, git diff agrupa los cambios en "hunks" - secciones del archivo que contienen cambios. Cada trozo tiene su propia cabecera con números de línea para ayudarte a localizar los cambios en el archivo.
Comparar el directorio de trabajo y el área de preparación
Ejecutar git diff
sin argumentos compara tu Directorio de Trabajo (estado actual de los archivos) con el Área de Preparación (cambios listos para ser confirmados). Esto es útil para revisar lo que has cambiado pero aún no has preparado para tu próxima confirmación.
Vamos a modificar varios archivos para demostrarlo:
# Update README.md
echo "# Data Analysis Project\nA sample project to demonstrate git diff functionality.\n\n## Installation\nRun \pip install -r requirements.txt" > README.md
# Update data.csv
echo "id,name,value\n1,alpha,10\n2,beta,20\n3,gamma,30\n4,delta,40" > data.csv
Ahora vamos a escenificar sólo los cambios de README.md:
git add README.md
Ejecutando ahora git diff
sólo se mostrarán los cambios no escalonados de data.csv
y el archivo analysis.py
anterior:
Esto te ayuda a centrarte en lo que aún no has puesto en escena. Si quieres ver lo que ya has montado:
git diff --staged # or git diff --cached (they're synonyms)
Esto mostrará los cambios en README.md que están preparados y listos para confirmar. Este flujo de trabajo es crucial para crear commits limpios y lógicos. Puedes escenificar partes de tu trabajo que tengan sentido juntas, revisar el diff escenificado para verificar que es una unidad de cambio coherente, y luego confirmarlo.
Comparación entre la zona de parada y el último commit
El comando git diff --staged
compara tu Área de Escenario con tu última confirmación. Esto te muestra exactamente lo que se incluirá en tu próxima confirmación si ejecutas ahora git commit
.
Pongamos en escena nuestros cambios en data.csv y examinemos lo que se ha puesto en escena:
git add data.csv
git diff --staged
La salida mostrará ahora los cambios tanto en README.md
como en data.csv
, ya que ambos han sido puestos en escena. Este paso de revisión es fundamental antes de comprometerte: actúa como tu última línea de defensa contra la introducción de cambios no intencionados.
Un flujo de trabajo habitual podría ser así
- Hacer cambios en varios archivos
- Ejecuta
git diff
para revisar todos los cambios - Utiliza
git add
selectivamente para organizar grupos lógicos de cambios - Ejecuta
git diff --staged
para verificar lo que se va a cometer - Confirma los cambios por etapas con
git commit -m "Your message"
- Repítelo para otras agrupaciones lógicas de cambios
Este enfoque metódico ayuda a mantener un historial de confirmaciones limpio y significativo que facilita la comprensión de la evolución de tu proyecto y la localización de los problemas que puedan haberse introducido. A medida que adquieras experiencia, estos comandos diff se convertirán en una segunda naturaleza, y te servirán como compañeros constantes en el proceso de desarrollo.
Hagamos nuestros commits antes de pasar a la siguiente fase:
# data.csv and README.md are to be committed
git commit -m "Modify data.csv and README.md files"
# Stage and commit analysis.py
git add analysis.py
git diff --staged # Review the changes one more time
git commit -m "Add a new function to analysis.py"
Técnicas intermedias de Git Diff
Ahora que entendemos los fundamentos de git diff, vamos a explorar técnicas más potentes que mejorarán tu capacidad de rastrear y analizar los cambios en tus proyectos. Seguiremos trabajando con nuestro proyecto de análisis de datos para demostrar estos conceptos intermedios.
Comparación entre diferentes referencias
Git se basa en el concepto de referencias: punteros a estados específicos de tu código. Estas referencias incluyen ramas, commits y etiquetas. El comando git diff puede comparar dos de estas referencias cualesquiera para mostrar qué ha cambiado entre ellas.
Vamos a crear una nueva rama para desarrollar una función y hacer algunos cambios:
# Create and switch to a new branch
git checkout -b feature/advanced-analytics
# Modify the analysis.py file with a new function
echo "import pandas as pd
import numpy as np
def load_data(filename):
return pd.read_csv(filename)
def analyze_data(data):
return data.describe()
def visualize_data(data):
return data.plot(kind='bar')
def perform_advanced_analysis(data):
"""Performs advanced statistical analysis on the dataset"""
results = {}
results['correlation'] = data.corr()
results['skew'] = data.skew()
return results" > analysis.py
# Commit the changes
git add analysis.py
git commit -m "Add advanced analysis function"
Ahora podemos comparar nuestra rama de características con la rama principal:
git diff main feature/advanced-analytics
Este comando muestra todas las diferencias entre las dos ramas: cada archivo modificado, añadido o eliminado. Verás los cambios que hemos hecho en analysis.py, incluidas nuestras nuevas importaciones y función (pulsa Intro varias veces, ya que el diff completo se trunca en el terminal).
Para comparar con una confirmación concreta, puedes utilizar el hash de la confirmación:
git log --oneline # Find the commit hash you want to compare with
git diff 7b3105e # Replace 7b3105e with the actual commit hash you want to compare
Esta capacidad de comparación resulta inestimable cuando:
- Preparar las revisiones del código viendo todos los cambios en una rama de características
- Comprobar qué cambios introduciría la rama de un colega antes de fusionarla
- Comprender cómo evolucionó tu código base entre versiones o lanzamientos
Comparar archivos específicos
Cuando trabajas con repositorios grandes, a menudo quieres centrarte en los cambios de archivos o directorios concretos, en lugar de ver todas las diferencias. Git diff te lo pone fácil permitiéndote especificar rutas.
Hagamos cambios en varios archivos:
# Update config.txt
echo "DEBUG=True
DATABASE_PATH=./data/
LOG_LEVEL=INFO" > config.txt
# Update utils.py
echo "def normalize_data(data):
return (data - data.min()) / (data.max() - data.min())
def clean_data(data):
return data.dropna()" > utils.py
Para ver los cambios sólo en el archivo de configuración:
git diff config.txt
O para comparar un archivo concreto entre ramas:
# Compare analysis.py file between main and feature/advanced-analytics branches
git diff main feature/advanced-analytics -- analysis.py
El --
en el comando anterior ayuda a Git a distinguir entre referencias y rutas de archivos. Esto es especialmente útil cuando
- Trabajar en repositorios con muchos archivos, pero centrándose en componentes específicos (lo que ocurrirá a menudo)
- Comprobar cómo ha cambiado la configuración en las distintas ramas
- Revisar sólo los archivos más críticos de un gran conjunto de cambios
Opciones contextuales de difusión
Git diff proporciona varias opciones para ajustar cómo se muestran las diferencias, lo que facilita centrarse en los cambios significativos.
Por ejemplo, cuando se trata de cambios en el formato del código, las diferencias de espacio en blanco pueden ocultar importantes cambios semánticos. Hagamos una demostración con un cambio de formato:
# Make a whitespace change to analysis.py
sed -i '' 's/ return/ return/g' analysis.py # Reduce indentation
Ahora, la comparación con el diff estándar de git muestra cambios en los espacios en blanco (fíjate en que las declaraciones de retorno están desalineadas):
git diff analysis.py
# OUT:
--- a/analysis.py
+++ b/analysis.py
@@ -2,17 +2,17 @@ import pandas as pd
import numpy as np
def load_data(filename):
- return pd.read_csv(filename)
+ return pd.read_csv(filename)
def analyze_data(data):
- return data.describe()
+ return data.describe()
def visualize_data(data):
- return data.plot(kind='bar')
+ return data.plot(kind='bar')
def perform_advanced_analysis(data):
Performs advanced statistical analysis on the dataset
results = {}
results['correlation'] = data.corr()
results['skew'] = data.skew()
- return results
+ return results
Pero podemos ignorar los cambios en los espacios en blanco (esto no muestra ningún cambio, ya que sólo hemos eliminado los espacios en blanco):
git diff -w analysis.py # or --ignore-all-space
Otra opción útil es controlar las líneas de contexto, es decir, las líneas sin cambios que se muestran alrededor de las modificaciones:
git diff -U1 analysis.py # Show only 1 line of context (default is 3)
git diff -U5 analysis.py # Show 5 lines of context
Estas opciones contextuales son especialmente valiosas cuando
- Revisar el código que ha pasado por el formateo automatizado
- Centrarse en los cambios funcionales más que en los cambios de estilo
- Necesitar más contexto para entender un cambio concreto
- Trabajar con archivos grandes en los que el contexto por defecto crearía demasiada salida
Al dominar estas técnicas intermedias, tendrás un control mucho más preciso sobre cómo revisar y comprender los cambios en tu código base, haciendo que tu flujo de trabajo de desarrollo sea más eficiente y tus revisiones de código más eficaces.
Vamos a confirmar los últimos cambios antes de pasar a las aplicaciones avanzadas de git diff:
git add .
git commit -m "Modify analysis.py, config.txt, and utils.py"
Aplicaciones avanzadas de Git Diff
Partiendo de nuestro conocimiento de las técnicas intermedias de git diff, vamos a explorar algunas aplicaciones avanzadas que llevarán tus habilidades con Git al siguiente nivel. Estas técnicas avanzadas son especialmente útiles cuando se trabaja en bases de código complejas o se colabora con equipos más grandes.
Utilizar herramientas externas de diff
Aunque el diff integrado de Git es potente, a veces una herramienta de diff visual proporciona una mayor claridad, especialmente para cambios complejos. Git te permite configurar herramientas externas para mejorar tu experiencia de difusión.
Vamos a configurar una popular herramienta visual de diferencias. Utilizaremos VSCode como ejemplo, pero una configuración similar sirve para herramientas como Beyond Compare, Meld o KDiff3:
# Configure Git to use VSCode as the diff tool (project-specific)
git config diff.tool vscode
git config difftool.vscode.cmd "code --wait --diff \$LOCAL \$REMOTE"
# To use other popular tools, you could use:
# For Beyond Compare (project-specific):
git config diff.tool bc3
git config difftool.bc3.path "/path/to/beyond/compare"
# Installation commands:
# For Beyond Compare:
# On macOS: brew install --cask beyond-compare
# On Ubuntu: sudo apt-get install beyond-compare
# On Windows: Download from https://www.scootersoftware.com/download.php
# Note: To apply these settings globally instead of just the current project,
# add the --global flag to each command, for example:
# git config --global diff.tool vscode
Ahora, en lugar de utilizar git diff
, puedes utilizar:
git difftool main feature/advanced-analytics
Esto abrirá tu herramienta visual diff configurada para mostrar los cambios. Este es el aspecto de Más Allá de Comparar:
Las herramientas de difusión visual ofrecen varias ventajas:
- Comparación lado a lado para que sea más fácil ver el contexto
- Resaltado de sintaxis que se ajusta a tus preferencias de editor
- Navegación avanzada entre cambios
- Posibilidad de editar archivos directamente mientras se revisan las diferencias
Al revisar grandes cambios o archivos con estructuras complejas (como JSON o XML anidados), las herramientas visuales de diferencias pueden mejorar drásticamente la comprensión y la eficacia.
Comandos diff especializados
Git ofrece comandos diff especializados que te dan un control más granular para casos de uso específicos. Exploremos algunos de estos potentes comandos:
git diff-tree
examina las diferencias entre los objetos árbol (directorios):
# Get the hash of the last two commits
LAST_COMMIT=$(git rev-parse HEAD)
PREV_COMMIT=$(git rev-parse HEAD~1)
# Show changes in the last commit
git diff-tree --patch $PREV_COMMIT $LAST_COMMIT
git diff-index compara el árbol de trabajo con el índice (área de preparación) o con un árbol:
# Compare working directory with the index
git diff-index --patch HEAD
git diff-index
es especialmente útil para programar y automatizar. Te permite comprobar mediante programación qué cambios se incluirían en tu próxima confirmación, lo que lo hace valioso para los ganchos de precompromiso y los scripts de validación.
Por ejemplo, podrías utilizarlo en una cadena CI/CD para verificar que no se han modificado determinados archivos o para asegurarte de que los cambios de configuración siguen patrones específicos antes de permitir confirmaciones.
git diff-files
muestra los cambios entre los archivos del directorio de trabajo y el índice:
# Check differences for specific files
git diff-files --patch config.txt
Estos comandos especializados son especialmente útiles para:
- Crear flujos de trabajo y scripts Git personalizados
- Depuración de problemas internos de Git
- Realizar análisis específicos del estado del depósito
- Construir herramientas de automatización que interactúen con Git
Analizar el historial de código
Una de las aplicaciones más potentes de git diff es analizar cómo ha evolucionado el código a lo largo del tiempo, lo que puede ser crucial para depurar o comprender el desarrollo de características.
Examinemos una confirmación concreta utilizando la notación especial ^!
:
# Get the hash of our advanced analytics commit
ANALYTICS_COMMIT=$(git log --oneline | grep "advanced analysis" | cut -d ' ' -f 1)
# Show only changes introduced in that specific commit
git diff $ANALYTICS_COMMIT^!
La sintaxis ^!
es una forma abreviada de comparar un commit con su padre, mostrando exactamente lo que ha cambiado sólo en ese commit.
Para seguir la evolución de un archivo concreto a lo largo del tiempo:
# Analyze how analysis.py changed over the last 3 commits
git log -p -3 analysis.py
Cuando busques un bicho, puedes utilizar git diff
con git bisect
:
# Add a bug to simulate a regression
echo "import pandas as pd
import numpy as np
def load_data(filename):
# Bug: accidentally returning None instead of the data
pd.read_csv(filename)
return None
def analyze_data(data):
return data.describe()
def visualize_data(data):
return data.plot(kind='bar')
def perform_advanced_analysis(data):
results = {}
results['correlation'] = data.corr()
results['skew'] = data.skew()
return results" > analysis.py
git add analysis.py
git commit -m "Update analysis.py with a hidden bug"
# Now use git bisect to find when the bug was introduced
git bisect start
git bisect bad # Mark current commit as containing the bug
git bisect good main # Mark the main branch as working correctly
# Git will check out commits for you to test
# Once found, you can examine the exact change that introduced the bug
git diff HEAD^!
Git bisect es una potente herramienta de depuración que realiza una búsqueda binaria en tu historial de confirmaciones para encontrar qué confirmación introdujo un error. Combinado con git diff, crea un flujo de trabajo eficiente:
1. Inicia el proceso de bisección con git bisect start
2. Marca la confirmación actual como mala (que contiene el error) con git bisect bad
3. Marca una confirmación buena conocida (en la que no exista el fallo) con git bisect good
4. Git comprueba automáticamente una confirmación en medio de tu historial para que la pruebes.
5. Después de probar la confirmación actual, dile a git el resultado:
- Si el fallo existe en esta confirmación:
git bisect bad
- Si el fallo no existe en esta confirmación:
git bisect good
6. Git seguirá comprobando diferentes confirmaciones basándose en tus comentarios (después de cada comando git bisect bad/good
), reduciendo la búsqueda cada vez. Repite el proceso de comprobación y marcado hasta que git identifique la primera confirmación errónea.
7. Una vez que git encuentre la confirmación problemática, mostrará un mensaje indicando qué confirmación introdujo el error.
8. Examina exactamente qué cambió en el compromiso identificado: git diff HEAD^!
9. Este comando te muestra con precisión qué código se modificó en la confirmación que introdujo el fallo, lo que te permite centrar tus esfuerzos de depuración en esos cambios concretos.
10. Sal de la bisectriz en cualquier momento con: git bisect reset
Esto te devolverá a la rama en la que estabas antes de iniciar el proceso de bisección.
11. También puedes automatizar el proceso de bisecado con: git bisect run
Donde es un comando que devuelve 0 para las confirmaciones buenas y distinto de cero para las malas.
Este flujo de trabajo reduce drásticamente el tiempo de depuración, sobre todo en grandes bases de código con muchas confirmaciones entre los estados funcional y defectuoso.
Estas técnicas de análisis histórico son inestimables para:
- Averiguar cuándo y por qué se introdujo un error
- Comprender la evolución de una característica o componente
- Auditar los cambios para las revisiones de seguridad
- Documentar el proceso de toma de decisiones tras los cambios de código
Si dominas estas aplicaciones avanzadas de git diff, podrás navegar por el historial de tu proyecto con precisión, depurar problemas con mayor eficacia y obtener una visión más profunda de la evolución de tu código base.
Referencia del comando Git Diff
Git diff ofrece una amplia gama de opciones para personalizar su salida y comportamiento para situaciones específicas. Aquí tienes una referencia completa de los parámetros más utilizados para mejorar tu análisis diferencial:
Opciones básicas de comparación
git diff
- Compara el directorio de trabajo con la zona de preparacióngit diff --staged
(o--cached
)- Compara el área de preparación con la última confirmacióngit diff HEAD
- Compara el directorio de trabajo con la última confirmacióngit diff
- Comparar el directorio de trabajo con una confirmación específicagit diff
- Comparar dos commits concretosgit diff
- Compara dos ramas
Limitación de la trayectoria
git diff --
- Limitar la comparación a un archivo o directorio concretogit diff --stat
- Mostrar resumen de cambios (archivos cambiados, inserciones, eliminaciones), una opción muy útil para grandes diffsgit diff --name-only
- Mostrar sólo los nombres de los archivos modificadosgit diff --name-status
- Mostrar los nombres y el estado (añadido, modificado, eliminado) de los archivos modificados
Control de la pantalla
git diff -w
(o --ignorar-todo-espacio) - Ignora los cambios en los espacios en blancogit diff --ignore-space-change
- Ignorar los cambios en la cantidad de espacios en blancogit diff --color-words
- Muestra las diferencias a nivel de palabra con coloresgit diff --word-diff
- Mostrar las diferencias a nivel de palabra en un formato diferentegit diff -U
- Mostrar n líneas de contexto (por defecto 3)git diff --no-prefix
- No mostrar los prefijos a/ y b/ en la salida diff
Filtrado de contenidos
git diff --binary
- Mostrar cambios en archivos binariosgit diff -S
- Busca cambios que añadan o eliminen la cadena especificadagit diff -G
- Busca cambios que coincidan con el patrón regex especificadogit diff --pickaxe-all
- Cuando utilices -S o -G, muestra todos los cambios del archivo, no sólo los que coincidan
Opciones de formato
git diff --patch-with-stat
- Mostrar resumen de parches y estadísticasgit diff --compact-summary
- Mostrar resumen de estadísticas en formato compactogit diff --numstat
- Mostrar estadísticas en un formato amigable para la máquinagit diff --summary
- Mostrar resumen de creación/eliminación
Estas opciones pueden combinarse para crear comparaciones potentes y específicas. Por ejemplo, para ver los cambios a nivel de palabra en un archivo concreto ignorando los espacios en blanco:
git diff --color-words -w -- analysis.py
O para encontrar todos los lugares donde se haya añadido o eliminado una función concreta:
git diff -S"def perform_advanced_analysis" main feature/advanced-analytics
Comprender estas opciones te ayuda a eliminar el ruido y a centrarte precisamente en los cambios que importan, haciendo que tus flujos de trabajo de revisión y análisis del código sean más eficaces. Tanto si estás buscando errores, preparando un pull request, o simplemente intentando entender qué ha cambiado, la opción git diff adecuada puede facilitarte significativamente la tarea.
Conclusión
A lo largo de este artículo, hemos explorado git diff como un comando versátil para ver los cambios en el código. Hemos tratado la comparación de los archivos de trabajo con los cambios organizados, el examen de las diferencias entre ramas y confirmaciones, y el uso de comandos especializados para obtener una visión más profunda. Incorporar git diff a tu flujo de trabajo ayuda a crear confirmaciones más limpias, detectar problemas pronto y facilitar mejores revisiones del código.
Tanto si trabajas solo como en equipo, dominar git diff te eleva de la simple escritura de código a la comprensión de cómo evoluciona tu base de código con el tiempo.
Para seguir ampliando tus conocimientos sobre Git, consulta estos valiosos recursos:
- La completa Git Cheat Sheet para una consulta rápida
- Introducción a Git para principiantes que quieran consolidar los fundamentos
- La práctica Tutorial de GitHub y Git para principiantes para un aprendizaje práctico
- Git intermedio para avanzar en tus habilidades con estrategias de ramificación y técnicas de colaboración
- Fundamentos de Git para profundizar en el modelo interno de Git y los flujos de trabajo avanzados.
Estos recursos te ayudarán a ampliar lo que has aprendido sobre git diff y a elevar tu dominio del control de versiones al siguiente nivel.
Preguntas frecuentes sobre Git Diff
¿Cuál es la diferencia entre git diff y git diff --staged?
git diff
muestra los cambios entre tu directorio de trabajo y el área de preparación (cambios sin preparar), mientras que git diff --staged
muestra los cambios entre tu área de preparación y la última confirmación (lo que se confirmará a continuación).
¿Cómo puedo comparar los cambios entre dos ramas?
Utiliza git diff branch1 branch2
para ver todas las diferencias entre ramas. Para comparar archivos concretos, add -- path/to/file
después de los nombres de las ramas.
¿Cómo ignoro los cambios de espacios en blanco en git diff?
Utiliza git diff -w
o git diff --ignore-all-space
para ignorar todos los cambios en los espacios en blanco, facilitando que te centres en las diferencias sustanciales de código en lugar de en el formato.
¿Puedo utilizar git diff para averiguar cuándo se introdujo un cambio concreto?
Sí. Utiliza git diff -S"search string"
para encontrar cuándo se añadió/eliminó texto, o combínalo con git log -p
para ver la evolución de un código concreto. Para localizar errores, git bisect
con diff es muy potente.
¿Cómo puedo ver git diff de una forma más visual?
Configura herramientas de diferencia externas con git config diff.tool
para utilizar aplicaciones de diferencia visual como VSCode, Beyond Compare o Meld, que proporcionan comparaciones lado a lado con una mejor visualización.

Soy un creador de contenidos de ciencia de datos con más de 2 años de experiencia y uno de los mayores seguidores en Medium. Me gusta escribir artículos detallados sobre IA y ML con un estilo un poco sarcastıc, porque hay que hacer algo para que sean un poco menos aburridos. He publicado más de 130 artículos y un curso DataCamp, y estoy preparando otro. Mi contenido ha sido visto por más de 5 millones de ojos, 20.000 de los cuales se convirtieron en seguidores tanto en Medium como en LinkedIn.
Los mejores cursos de DataCamp
Curso
Git intermedio
Curso