Deshacer un commit es un poco aterrador si no sabes cómo funciona. Pero en realidad es increíblemente fácil si lo entiendes.
Digamos que tiene esto, donde C es su CABEZA y (F) es el estado de sus archivos.
(F)
A-B-C
↑
master
Desea destruir nuclearmente C y nunca volver a verlo y perder todos los cambios en los archivos modificados localmente . Tu hiciste esto:
git reset --hard HEAD~1
El resultado es:
(F)
A-B
↑
master
Ahora B es la CABEZA. Debido a que usó --hard
, sus archivos se restablecen a su estado en commit B.
Ah, pero supongamos que cometer C no fue un desastre, sino un poco extraño. Desea deshacer la confirmación, pero mantenga los cambios para editar un poco antes de realizar una confirmación mejor. Comenzando de nuevo desde aquí, con C como su CABEZA:
(F)
A-B-C
↑
master
Puedes hacer esto, dejando de lado --hard
:
git reset HEAD~1
En este caso el resultado es:
(F)
A-B-C
↑
master
En ambos casos, HEAD es solo un puntero a la última confirmación. Cuando haces un git reset HEAD~1
, le dices a Git que mueva el puntero HEAD hacia atrás una confirmación. Pero (a menos que lo use --hard
) deja sus archivos como estaban. Así que ahora git status
muestra los cambios que has registrado en C. ¡No has perdido nada!
Para el toque más ligero, incluso puede deshacer su confirmación pero dejar sus archivos y su índice :
git reset --soft HEAD~1
Esto no solo deja sus archivos solos, sino que también deja solo su índice . Cuando lo haga git status
, verá que los mismos archivos están en el índice que antes. De hecho, justo después de este comando, podría hacer git commit
y estaría rehaciendo la misma confirmación que acaba de tener.
Una cosa más: ¿ Supongamos que destruye un commit como en el primer ejemplo, pero luego descubre que lo necesitaba después de todo ? Mala suerte, ¿verdad?
No, todavía hay una manera de recuperarlo. Escriba git reflog
y verá una lista de commits (parciales) (es decir, hashes) en los que se ha movido. Encuentre el commit que destruyó y haga lo siguiente:
git checkout -b someNewBranchName shaYouDestroyed
Ahora has resucitado ese compromiso. Los commits en realidad no se destruyen en Git durante unos 90 días, por lo que generalmente puede regresar y rescatar uno del que no quiso deshacerse.