git reset
es un comando poderoso que puede modificar el historial de su repositorio de Git y corregir los errores que cometió. A pesar de esto, aún cuando el nombre hace que su uso parezca aterrador, en realidad es bastante sencillo, por lo tanto hablemos de cómo funciona.
¿Qué es Git HEAD?
Antes de comprender cómo funcionan los restablecimientos, debemos hablar sobre Git HEAD.
«HEAD» es simplemente un alias para su compromiso de trabajo actual. Puede pensar en él como la cabeza de un tocadiscos, donde la posición determina qué datos se están usando. Si en este momento utiliza el master
branch, HEAD será la última confirmación en esa rama.
Pese a ser un alias para una confirmación, HEAD en realidad no apunta de forma directa a una confirmación la mayor parte del tiempo. Apunta hacia una rama y utiliza automáticamente la última confirmación. Además puede apuntar de forma directa a una confirmación, que se conoce como «HEAD separada», aún cuando eso no importa para git reset
.
¿Cómo funciona Git Reset?
El historial de confirmaciones de Git se almacena como un árbol de confirmaciones y está destinado a ser inmutable en su mayor parte. A pesar de esto, a veces es necesario modificar este historial, y ahí es donde git reset
entra en juego.
Cada confirmación se enlaza con la confirmación anterior, y puede ramificarse en diferentes ramas que eventualmente se fusionarán de nuevo en el master
rama. Sea cual sea el caso, HEAD de forma general apuntará hacia la última confirmación en cualquier rama en la que esté trabajando.
Entonces, ¿qué sucede cuando haces un compromiso que deseas revertir?
Bueno, corriendo git reset
Simplemente, mueve el HEAD hacia atrás y deja todos los commits delante de él colgando. Esto reescribe el historial de Git regularmente inmutable para deshacerse de las confirmaciones delante de HEAD.
Esto puede resultar muy útil por muchas razones. Tal vez hiciste una confirmación, después hiciste algunos cambios adicionales y quisiste impulsar todo como una confirmación. Tú podrías git reset
volver a la confirmación anterior y después volver a realizar la confirmación correctamente.
O tal vez accidentalmente realizó una confirmación que incluía algunos cambios que no deseaba rastrear. Esto puede ser muy difícil de comprender si no sabe cómo git reset
funciona, pero restablecer el HEAD y después solo realizar los cambios correctos logrará esto. Tenga en cuenta que esto es distinto de git revert
, que invierte las confirmaciones.
RELACIONADO: Cómo recuperar confirmaciones revertidas en un repositorio de Git
Hay tres tipos diferentes de reinicios en Git, y todos difieren en función de cómo manejan las confirmaciones que quedan pendientes. Todos reescriben el historial de Git, y todos mueven el HEAD hacia atrás, pero tratan los cambios de manera distinto:
git reset --soft
, que mantendrá sus archivos y restablecerá automáticamente todos los cambios.git reset --hard
, que lo hará destruir totalmente cualquier cambio y eliminarlo del directorio local. Solo use esto si sabe lo que está haciendo.git reset --mixed
, que es el predeterminado y mantiene todos los archivos iguales pero desestabiliza los cambios. Esta es la opción más flexible, pero a pesar del nombre, no modifica archivos.
La diferencia entre suave y mixto es si los cambios se realizan por etapas o no. Staged es simplemente una zona intermedia entre el directorio local y el historial de Git. git add
archivos de etapas, y git commit
los escribe a la historia. Sea cual sea el caso, el directorio local no se ve afectado, solo cambia el estado del seguimiento de Git de esos cambios.
Simplemente, los reinicios suaves y mixtos son casi iguales y le posibilitan mantener los cambios, y los reinicios duros restablecerán totalmente su directorio local en el lugar donde estaba en el momento de la confirmación.
Usando Git Reset
Una vez que comprenda lo que está pasando, utilice git reset
es increíblemente fácil. Para restablecer, necesitará una referencia a la confirmación a la que desea regresar. Puedes obtener esto corriendo reflog
:
git reflog
Copie el código de siete dígitos de la derecha. Si solo te quedaste atrapado en vim
, presione Q, y tal vez ejecute git config --global core.editor "nano"
.
Después, puede restablecer la confirmación de destino:
git reset --mixed a560612
O puede orientar las confirmaciones en función de su posición en vinculación con HEAD. El siguiente comando apunta a la confirmación justo antes de HEAD, que es una abreviatura útil si necesita restablecer la última confirmación:
git reset --mixed HEAD~
Si está usando un cliente de Git como Tenedor, restablecer es tan sencillo como hacer un clic con el botón derecho en la confirmación de destino y elegir «Restablecer»:
¿Debería realizar un reinicio completo?
En realidad, solo debería utilizar restablecimientos suaves o mixtos, pero, si estropeó tanto su repositorio que necesita restablecerlo por completo, puede utilizar la próxima secuencia de comandos para restablecerlo totalmente a la normalidad.
git fetch origin git checkout master git reset --hard origin/master git clean -d --force
Decididamente, siempre puede extraer el clásico «quitar su repositorio y volver a clonar desde Github», pero de esta manera al menos Git está aprobado y solo restablece una sola rama.