4. Deshacer cambios no deseados

Comparar el directorio de trabajo con el repositorio

Imagina que estás trabajando en tu hello.html y un gato travieso se pasea por el teclado, añadiendo un montón de tonterías al archivo. Has pasado de un Hello, World! bien hecho a una página llena de maullidos sin sentido.

Vale, una vez más: imagina que eres un gato intentando dormir sobre un teclado. Abre hello.html y machaca algunas teclas para hacer unos cuantos cambios (enseguida veremos cómo gestionar el desastre).

Después de la interrupción felina, comprobemos si ha cambiado algo. git status es el comando de cabecera para esto: muestra el estado actual de tu directorio de trabajo y del repositorio.

Tarea
Completada

Ejecuta el comando git status para comprobar el estado del repositorio.

En la salida del comando git status, podemos ver que el archivo hello.html se ha modificado:

Resultado:

On branch main Changes not staged for commit:   (use "git add <file>..." to update what will be committed)   (use "git restore <file>..." to discard changes in working directory)       modified: hello.html

no changes added to commit (use "git add" and/or "git commit -a")

Veamos qué ha cambiado exactamente. Podrías abrir el archivo y buscar la aportación del gato, pero no es muy eficiente. ¿Y si el archivo es grande o el gato ha estado especialmente inspirado?

Entonces, ¿qué hacemos?

El comando

viene al rescate: muestra qué líneas de tu directorio de trabajo difieren de la versión del repositorio. Por defecto, compara con lo que tienes en el área de preparación (que no ha recibido cambios nuevos desde el último commit, así que en la práctica estamos comparando con el último commit).

Ejecuta en la terminal:
git diff
Tarea
Completada

Comprueba la diferencia entre el directorio de trabajo y el repositorio.

Consejo: Cuando la salida de git diff no cabe en una sola pantalla, Git puede abrirla en un pager, una vista desplazable para salidas largas. Usa las flechas y para moverte por ella. Para salir del paginador, pulsa q.

Deberías ver algo parecido a esto:

Resultado:
diff --git a/hello.html b/hello.html
index 8ab686e..95f1408 100644
--- a/hello.html
+++ b/hello.html
@@ -1 +1 @@
-Hello, World!
\ No newline at end of file
+Hello, Meow! World! Meow! Meow! Meow!
\ No newline at end of file
¡Eh! ¿Qué es esto?

Este formato de salida se suele llamar parche (patch), y sirve para decirte qué ha cambiado en el archivo. Irónicamente, la salida está pensada para ser legible por humanos, pero fue una decisión de diseño de los años 70, así que quizá no resulte tan intuitiva como las interfaces modernas. En cualquier caso, aunque al principio parezca un poco críptica, tiene un patrón. Así se lee:

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

Esta salida te dice:

  • El archivo hello.html ha cambiado, como muestran las primeras líneas.
  • La línea Hello, World! se eliminó.
  • Se sustituyó por Hello, Meow! World! Meow! Meow! Meow!
Vale, ¿y qué significa para nuestro caso?

Esto deja bastante clara la "aportación" de nuestro gato. Con git diff puedes revisar los cambios línea por línea, lo que facilita detectar modificaciones no intencionadas. Cuando ya ves claro qué ha cambiado, puedes decidir si quieres conservar los cambios, descartarlos o modificarlos más.

El comando git diff acepta varios argumentos para comparar cosas distintas. Por ejemplo, git diff HEAD compara el directorio de trabajo con el commit más reciente de la rama actual, mientras que git diff 4620193 example.html compararía el archivo example.html del directorio de trabajo con la versión del commit 4620193.

En el siguiente paso quitaremos los maullidos sin sentido y restauraremos el Hello, World! original con otro comando útil de Git.

Next step
¿Quieres probar el modo historia?

Haz el curso como estaba pensado: progreso en pequeñas dosis, un orden lineal y sin distracciones, y entradas de Gitopedia que se desbloquean poco a poco. Continúa con Git real en VS Code/Cursor/Antigravity/Windsurf cuando quieras.

Modo historia
GRATIS
pero requiere iniciar sesión