Git: Deshacer la última confirmación local

En este breve tutorial, veremos cómo restablecer HEAD en un repositorio de Git, deshaciendo así la última confirmación local y sus variantes.

¿Has cometido algo accidentalmente en la rama equivocada? Tal vez acabas de confirmar la nueva característica brillante y, para tu consternación, hay un error tipográfico en la interfaz de usuario que no has visto antes, y te gustaría recuperar la confirmación para corregirlo también. ?

En algunos casos, puedes *arreglarlo, hacer otra confirmación y luego aplastarlos juntos antes de enviar al repositorio remoto, pero solo si Estaré impulsando el cambio de todos modos.

Alternativamente, puede deshacer la última confirmación local, realizar cambios adicionales y luego enviar esa confirmación al repositorio remoto, si así lo desea.

Deshacer la última confirmación local

Vamos a crear un archivo que nos gustaría agregar a nuestro repositorio, agregarlo y finalmente confirmar:

1
2
3
4
5
6
$ echo "Hello World!" >> file.txt
$ git add file.txt
$ git commit -m "Added file.txt"
$ echo "It's a great day today :(" >> file.txt
$ git add file.txt
$ git commit -m "Modified file.txt"

Vaya, accidentalmente hemos dejado un error tipográfico horrible en el contenido. ¡Hemos puesto los paréntesis de forma incorrecta! Y acabamos de cometer ese error:

1
2
3
$ git log --pretty=oneline
df9fc1b773ecf3ba14c990615831f1087817611f (HEAD -> main) Modified file.txt
55db4f399d1ad64e0a40e1858d23fef0ffe31fb0 Added file.txt

Para eliminar una confirmación local, suponiendo que aún no se haya enviado al repositorio remoto, podemos usar el comando git reset, que es efectivamente el opuesto de git add:

1
2
3
$ git reset HEAD~
Unstaged changes after reset:
M       file.txt

Hemos reiniciado HEAD (puntero a la última confirmación), apuntando de nuevo (~) a la confirmación anterior. Al pasar un número después de la tilde, podríamos haber retrocedido múltiples confirmaciones en lugar de solo una.

{.icon aria-hidden=“true”}

Nota: En ciertos sistemas operativos, es posible que deba usar una notación diferente. HEAD~, HEAD^ y [correo electrónico protegido]{1} hacen referencia a la confirmación anterior, pero es posible que determinados terminales y sistemas operativos no funcionen con todas estas notaciones.

Una vez reiniciado, el cambio que hemos realizado en file.txt, es decir, la modificación errónea no está preparada. Echemos un vistazo al registro de nuevo:

1
2
$ git log --pretty=oneline
55db4f399d1ad64e0a40e1858d23fef0ffe31fb0 (HEAD -> main) Added file.txt

Y el estado es:

1
2
3
4
5
6
7
8
$ git status
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:   file.txt

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

Sin embargo, ¿cuáles son los contenidos del archivo ahora?

1
2
3
4
$ nano file.txt

Hello World
It's a great day today :(

Por defecto, el comando reset es --soft. El indicador --soft no restablece los cambios realizados en el archivo, simplemente elimina la confirmación que se realizó. Avancemos y volvamos a cometer este error nuevamente, para que podamos ver qué sucede cuando ejecutamos la opción --hard.

Reinicio completo {#reinicio completo}

En lugar de --soft reset, que podemos usar para simplemente deshacer la confirmación, dejando los archivos intactos (y los cambios aún presentes, razón por la cual el comando git status nos indicó que escenificáramos los cambios) - también podemos hacer un --hard reset:

1
2
$ git reset --hard HEAD~
HEAD is now at 55db4f3 Added file.txt

Esta vez, los cambios no están sin etapas, como antes. Están eliminados. Si revisamos el registro, se parecerá mucho a la última vez:

1
2
$ git log --pretty=oneline
55db4f399d1ad64e0a40e1858d23fef0ffe31fb0 (HEAD -> main) Added file.txt

Sin embargo, si comprobamos el status:

1
2
3
$ git status
On branch main
nothing to commit, working tree clean

No hay nada que confirmar, porque el cambio que se hizo en el archivo en la confirmación anterior también se eliminó, volviendo a configurar HEAD en la primera confirmación:

1
2
$ nano file.txt
Hello World!
Licensed under CC BY-NC-SA 4.0