A veces, al trabajar con Git, es posible que desee deshacer la última confirmación. Una confirmación es una instantánea de un repositorio de Git en un momento dado. Git tiene una variable de referencia llamada HEADque apunta a la última confirmación en la rama de trabajo actual. Para deshacer una confirmación, todo lo que necesita hacer es apuntar la HEADvariable a la instantánea anterior.

Esta guía explica cómo deshacer la última confirmación de Git.

No se recomienda deshacer una confirmación que ya se envió a un repositorio compartido. Si solo desea cambiar el mensaje de confirmación, consulte este artículo.

Arquitectura de tres árboles Git

En Git puedes deshacer los cambios usando el git resetcomando seguido del identificador de confirmación.

git resettoma argumentos adicionales que le permiten controlar el comportamiento del comando. Para comprender mejor cómo resetfunciona, hablemos de los tres árboles diferentes de Git. La arquitectura de tres árboles es el concepto clave del sistema de gestión Git. Se llaman árboles porque representan colecciones de archivos.

Git administra y manipula los siguientes tres árboles:

  • El directorio de trabajo: un directorio que incluye todos los subdirectorios y archivos en el sistema de archivos local que está asociado con el repositorio. A menudo se le conoce como un "árbol de trabajo". El directorio de trabajo es algo así como una caja de arena donde puede probar los cambios antes de enviarlos al índice de ensayo.
  • El índice: este árbol realiza un seguimiento de los archivos nuevos o modificados que se agregaron al índice con git add, para incluirlos en la próxima confirmación. A menudo se le conoce como "área de preparación" o "índice de preparación".
  • El HEAD- Un puntero a su última confirmación en la rama actual.

El git resetcomando tiene tres argumentos que corresponden a los tres árboles:

  • --soft- Actualiza el HEADpuntero a la confirmación dada. El directorio de trabajo y el índice no se modifican.
  • --mixed- Actualiza el HEADpuntero y restablece el Índice a la confirmación especificada. El directorio de trabajo se deja intacto. Este es el modo de operación predeterminado del resetcomando.
  • --hard- Actualiza el HEADpuntero y restablece el índice y el directorio de trabajo a la confirmación especificada. Tenga mucho cuidado al utilizar esta opción, ya que todos los cambios locales que no haya realizado se sobrescribirán y se perderán.

Deshacer la última confirmación

Para deshacer la última confirmación sin perder los cambios que realizó en los archivos locales y el índice, invoque git resetcon la --softopción seguida de HEAD~1:

git reset --soft HEAD~1

HEAD~1es una variable que apunta a la confirmación anterior. El comando anterior mueve la rama actual hacia atrás una confirmación, deshaciendo efectivamente su última confirmación. Si ejecuta el git statuscomando, verá que los archivos modificados se enumeran como cambios no confirmados.

Para actualizar el HEADpuntero para restablecer el Índice, ejecute git resetcon --mixedo sin una opción:

git reset --mixed HEAD~1git reset HEAD~1

Los archivos modificados se mantienen, pero a diferencia del ejemplo anterior, ahora los cambios no se preparan para la confirmación.

Si no desea conservar los cambios que realizó en los archivos, invoque el git resetcomando con la --hardopción:

git reset --hard HEAD~1

Antes de realizar un restablecimiento completo, asegúrese de que ya no necesita los cambios.

Deshacer varias confirmaciones

Con git reset, puede volver a cualquier confirmación anterior.

Por ejemplo, para mover la rama actual hacia atrás tres confirmaciones, usaría:

git reset --hard HEAD~3

Como estamos usando --hard, el comando anterior eliminará las últimas tres instantáneas del historial de confirmaciones.

Otra forma de volver a una confirmación específica es pasar el ID de la confirmación al git resetcomando.

Úselo git log --onelinepara encontrar los ID de confirmación:

git log --oneline

El comando mostrará una lista de todas las confirmaciones, incluido el ID y la primera línea del mensaje de confirmación:

32921222 (HEAD -> master) Update changelog
7505724c adding new tests
750862ce new blog post
95a63417 sort configuration file
252032e4 Refactor User class
...

Una vez que sepa la ID de la confirmación que desea restablecer, simplemente pase la ID al git resetcomando:

git reset --hard 95a63417

Conclusión

Para deshacer la última confirmación, use el git resetcomando. No restablezca las confirmaciones forzadas, ya que puede causar muchos problemas a sus colegas.

Si encuentra un problema o tiene comentarios, deje un comentario a continuación.