Comandos de Git

git diff

git diff: muestra diferencias entre commits, ramas, archivos o el directorio de trabajo.

El comando git diff muestra las diferencias entre distintos estados de tu repositorio: por ejemplo, entre el directorio de trabajo y el área de staging o entre dos commits. Así puedes revisar tu trabajo antes de crear un commit o entender mejor el historial del proyecto.

Por defecto, git diff compara el directorio de trabajo con el área de staging para mostrar los cambios que aún no has preparado. También puede comparar archivos concretos, ramas o commits.

git diff es especialmente útil cuando quieres:

  • Revisar los cambios que has hecho antes de prepararlos o incluirlos en un commit.
  • Comparar distintas versiones de tu proyecto para ver cómo ha evolucionado con el tiempo.
  • Identificar las líneas concretas de código que cambiaron en un commit determinado.
  • Entender las diferencias entre ramas antes de hacer un merge.

Cuando la salida de git diff no cabe en una pantalla, la terminal entra en modo pager, pensado para navegar por listas largas. En este modo, puedes desplazarte por la salida usando las teclas de flecha y del teclado, o PageUp y PageDown para moverte más rápido. Para salir del modo pager, pulsa q.

Ejemplos

Mostrar todos los cambios fuera de staging del directorio de trabajo:

git diff

Mostrar todos los cambios en staging, es decir, los cambios listos para incluirse en un commit:

git diff --staged

Mostrar cambios entre dos commits:

git diff 1234abc 5678def

Mostrar cambios entre dos ramas:

git diff main feature-branch

Mostrar cambios de un archivo concreto entre dos ramas. El separador especial -- indica a Git que todos los argumentos siguientes son rutas de archivo y evita que las confunda con una rama o un commit:

git diff main feature-branch -- path/to/file.js

Entender la salida

Imagina que hemos modificado un archivo llamado index.html añadiendo algunas etiquetas nuevas y cambiando una existente. La salida del comando git diff podría tener este aspecto:

Resultado:
diff --git a/index.html b/index.html
index 1c2s3z5..4f5g6h7 100644
--- a/index.html
+++ b/index.html
@@ -8,1 +8,3 @@
-<h1>Old header</h1>
+<h2>New header</h2>
+
+<p>New text.</p>

Este formato de salida se llama parche (patch), y está pensado para enseñarnos qué ha cambiado en el archivo. Irónicamente, aunque la salida pretende ser legible para personas, la decisión de diseño viene de los años 70, así que quizá no sea tan intuitiva como las interfaces modernas. Aunque al principio pueda parecer un poco críptica, tiene un patrón. Se lee así:

  • La primera línea indica que el diff compara dos versiones del archivo index.html.
  • La segunda línea muestra metadatos internos de Git. No es importante para entender los cambios del archivo.
  • Las líneas --- y +++, junto con las rutas de archivo, muestran a qué corresponden respectivamente las líneas - y +.
  • La línea @@ muestra los números de línea de los cambios en la versión antigua y en la nueva del archivo.
  • Las líneas con prefijo - se eliminaron en la versión nueva.
  • Las líneas con prefijo + se añadieron en la versión nueva.
  • Las líneas sin cambios se muestran como contexto, pero no tienen prefijo.

Esta salida nos dice que:

  • El archivo index.html ha cambiado, como indican las rutas de las primeras líneas.
  • La línea <h1>Old header</h1> se ha eliminado.
  • Se ha sustituido por una línea nueva: <h2>New header</h2>.
  • Se ha añadido al final un bloque nuevo, <p>New text.</p>, como muestra la línea que empieza con +.

Un archivo de parche como este puede incluir varios cambios en el archivo, separados por líneas @@. También puede incluir varios archivos.