Saltar a contenido

Deshaciendo cosas en Git

Una de las fortalezas de git es la capacidad de poder realizar "viajes en el tiempo", es decir, recorrer el historial de cambios para deshacerlos o crear nuevas versiones de nuestro trabajo a partir de un punto determinado.

git restore

El comando sacará el archivo del área de preparación para colocarlo en el directorio de trabajo. En otras palabras, cambiará el estado del archivo de preparado a modificado. Su sintaxis:

git restore --staged <archivo>

Por ejemplo:

git restore --staged index.html

git reset

Un reset es una operación que toma un commit específico y restablece el historial para que coincida con el estado del repositorio en ese commit específico.

Supongamos que, partiendo de la siguiente situación, ejecutamos el comando git reset HEAD~2

git reset

Estamos deshaciendo los dos últimos commits de la rama Hotfix . Estos dos commits quedarán huérfanos y se eliminarán la próxima vez que Git haga limpieza.

git reset

Por ejemplo:

git reset HEAD~3

Eliminará los últimos 3 commits hacia atrás, pero manteniendo las modificaciones que contiene ese commit en el área de trabajo.

git reset a nivel de archivo

El comando git reset se puede usar también a nivel de un único archivo. En cuyo caso su comportamiento es diferente a cuando se usa a nivel de commit.

Por ejemplo:

git reset HEAD~2 index.html

El archivo index.html ahora está modificado (además, se mantienen las modificaciones hechas) y, nuevamente, no preparado.

git revert

Un revert es una operación que toma un commit específico y crea un nuevo commit con el contenido del commit especificado.

Supongamos que partimos de la siguiente situación y queremos volver al commit marcado con el asterisco.

git revert

Tras ejecutar el comando git revert HEAD~2 estaremos deshaciendo los cambios de los dos últimos commits de la rama Hotfix añadiendo un nuevo commit que ejecuta los cambios.

git revert

git revert sobre archivos

Este comando solo se puede ejecutar a nivel de commit y no a nivel de archivo.

git checkout

Un checkout es una operación que mueve el puntero de referencia HEAD a un commit específico.

Supongamos que el HEAD de la rama master se encuentra en el commit d. Ahora ejecutamos el comando git checkout b.

git revert

El resultado es un cambio en el historial de commit.

Veámoslo con un ejemplo:

git checkout 56a4e5c08

Permite volver hacia atrás a cualquier commit (56a4e5c08 en el ejemplo) que forme parte de la historia de nuestro proyecto, deshaciendo los cambios posteriores al commit elegido.

Detached HEAD

La acción anterior dejaría al proyecto sin referencia a HEAD(DETACHED HEAD). Eso significa que podemos hacer cambios y modificaciones sobre el código del momento en el que nos hemos situado y hacer los commits que necesitemos, pero si queremos que esos cambios se mantengan en git y no sean eliminados por el proceso git garbage collection process tendremos que crear una nueva rama del último commit que hemos realizado.

git checkout a nivel de archivo

El comando git checkout se puede usar también a nivel de un único archivo. En cuyo caso su comportamiento es diferente a cuando se usa a nivel de commit.

En este caso no mueve el HEAD del repositorio, lo que hace es llevar al directorio de trabajo el fichero al que hemos hecho checkout con el contenido que tenía en el commit especificado.

Por ejemplo:

git checkout -- index.html

De esta manera, el archivo index.html volverá al estado que tenía antes del último commit

Base de conocimiento