Cómo revertir un commit de Git sin perder cambios

GitBeginner
Practicar Ahora

Introducción

Git es un potente sistema de control de versiones que permite a los desarrolladores gestionar su base de código de manera eficaz. Una tarea común es deshacer cambios. Mientras que comandos como git reset pueden alterar el historial de commits, git revert proporciona una forma más segura y no destructiva de deshacer commits, especialmente en proyectos colaborativos. Este laboratorio te guiará a través del uso de git revert para deshacer un commit y cómo usar sus opciones para preservar tus cambios para futuras modificaciones.

Inspeccionando el Historial de Commits

Antes de realizar cualquier cambio, es fundamental comprender el estado actual de nuestro proyecto. El entorno de laboratorio ha sido preconfigurado con un repositorio Git que contiene un archivo llamado story.txt y algunos commits. Inspeccionemos el historial de commits.

Primero, utiliza el comando git log con la opción --oneline para obtener una vista compacta del historial de commits. Este comando lista cada commit en una sola línea, mostrando el hash del commit y el mensaje del commit.

git log --oneline

Deberías ver una salida similar a esta. Ten en cuenta que tus hashes de commit serán diferentes:

c7a3e69 (HEAD -> master) Add a second, unwanted line
a9b2d5f Add the first line to the story
f3e1c8a Initial commit: Add story.txt

Este log muestra tres commits. El commit más reciente, en la parte superior, tiene el mensaje "Add a second, unwanted line". Supongamos que este commit introdujo un error que necesitamos deshacer.

Veamos también el contenido actual del archivo story.txt:

cat story.txt

La salida será:

Once upon a time, in a land of code.
The hero of our story was a brave developer.
Suddenly, a wild bug appeared!

Nuestro objetivo es eliminar la última línea, "Suddenly, a wild bug appeared!", que se añadió en nuestro commit más reciente.

Usando git revert para un Deshacer Seguro

El comando git revert se utiliza para crear un nuevo commit que deshace los cambios de un commit anterior. Este es un método seguro para deshacer cambios porque no altera el historial del proyecto.

Primero, copia el hash del commit que deseas revertir. De la salida del paso anterior, este es el commit con el mensaje "Add a second, unwanted line".

Ahora, ejecuta el comando git revert con ese hash.

Por favor, reemplaza <your-commit-hash> con el hash real de tu terminal.

git revert <your-commit-hash>

Después de ejecutar este comando, Git abrirá tu editor de texto predeterminado (nano) para permitirte editar el mensaje del commit para este nuevo commit de reversión. El mensaje predeterminado suele ser suficiente.

Para guardar y salir de nano:

  1. Presiona Ctrl+O (Write Out) y luego Enter para confirmar el nombre del archivo.
  2. Presiona Ctrl+X para salir.

Ahora, revisemos nuevamente el historial de commits:

git log --oneline

Verás un nuevo commit en la parte superior:

e0d5f1b (HEAD -> master) Revert "Add a second, unwanted line"
c7a3e69 Add a second, unwanted line
a9b2d5f Add the first line to the story
f3e1c8a Initial commit: Add story.txt

Observa que el commit original "no deseado" todavía está en el historial, pero se ha añadido un nuevo commit de "Revert". Este nuevo commit revierte los cambios realizados por el no deseado.

Finalmente, verifica el contenido de story.txt para confirmar que el cambio ha sido deshecho:

cat story.txt

La salida ahora debería ser:

Once upon a time, in a land of code.
The hero of our story was a brave developer.

La línea no deseada ha sido eliminada con éxito.

Revertir Conservando Cambios con --no-commit

A veces, quieres deshacer los cambios de un commit pero conservarlos en tu directorio de trabajo para modificarlos. Por ejemplo, podrías querer corregir un error en el commit en lugar de descartarlo por completo. La opción --no-commit (o -n) es perfecta para esto.

Primero, vamos a restablecer nuestro repositorio al estado anterior a nuestra última reversión, para poder probar un enfoque diferente. Usaremos git reset para esto. Este comando mueve el puntero HEAD y --hard actualiza los archivos en tu directorio de trabajo para que coincidan.

git reset --hard HEAD~1

Este comando elimina el commit de "Revert" que acabamos de hacer. Puedes confirmarlo ejecutando git log --oneline.

Ahora, revertiremos el commit "no deseado" nuevamente, pero esta vez usando la opción --no-commit. Recuerda usar el hash del commit "Add a second, unwanted line".

Por favor, reemplaza <your-commit-hash> con el hash real de tu terminal.

git revert --no-commit <your-commit-hash>

Esta vez, no aparece ningún editor. La reversión está preparada, pero no confirmada (committed). Verifica el estado de tu repositorio:

git status

La salida mostrará que story.txt está preparado para ser confirmado (staged for commit):

On branch master
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
	modified:   story.txt

Los cambios del commit revertido están ahora en tu área de preparación (staging area). Ahora puedes modificarlos. Reemplacemos la línea no deseada por una mejor. Abre story.txt con nano:

nano story.txt

El archivo se verá como después de la reversión en el Paso 2. Añade una línea nueva y mejor al final del archivo:

And they lived happily ever after.

Guarda y sal de nano (Ctrl+O, Enter, Ctrl+X).

Ahora, añade tus cambios al área de preparación y confírmalos con un mensaje nuevo y descriptivo:

git add story.txt
git commit -m "Replace unwanted line with a proper conclusion"

Finalmente, verifica el log y el contenido del archivo para ver el resultado:

git log --oneline
cat story.txt

El log muestra tu nuevo commit, y story.txt tiene el contenido corregido. Has revertido con éxito un commit conservando y modificando sus cambios.

Resumen

En este laboratorio, has aprendido a revertir de forma segura un commit de Git sin perder tu trabajo. Practicaste la inspección del historial de commits con git log, la ejecución de un git revert estándar para crear un nuevo commit que deshace cambios anteriores, y el uso de la opción git revert --no-commit para revertir cambios a tu área de preparación (staging area), permitiéndote modificarlos antes de crear un nuevo commit. Estas técnicas son esenciales para gestionar el historial de tu proyecto de forma limpia y segura, especialmente en un entorno de equipo.