Comandos de Git

git diff

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

El comando git diff se usa para mostrar las diferencias entre distintos estados de tu repositorio Git, como las diferencias entre tu directorio de trabajo y el área de preparación, o entre dos commits. Te ayuda a ver qué cambios se han hecho, algo útil para revisar tu trabajo antes de crear un commit o para entender el historial de tu proyecto.

Por defecto, git diff muestra las diferencias entre tu directorio de trabajo y el área de preparación. Así puedes ver qué cambios has hecho y todavía no has preparado para el commit. También puedes usar git diff para 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 fusionarlas.

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 sin preparar del directorio de trabajo:

git diff

Mostrar todos los cambios preparados, 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. La opción especial -- se usa para decirle a Git que todos los argumentos siguientes son rutas de archivo. Esto es necesario para evitar ambigüedades cuando una ruta de archivo podría confundirse 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.