Git: volver a una confirmación anterior

Si he aprendido algo en mis más de 15 años de programación, es que los errores son comunes y cometo muchos de ellos. Esto se aplica igualmente a las herramientas de control de versiones...

Si algo he aprendido en mis más de 15 años de programación, es que los errores son comunes y cometo muchos de ellos. Esto también se aplica a las herramientas de control de versiones. Ya sea que hayas realizado cambios accidentalmente o simplemente te hayas dado cuenta de que tu código de confirmación anterior no es lo que querías, muchas veces tendrás que revertir una confirmación anterior en Git.

En este artículo, mostraré algunas formas de revertir sus confirmaciones, según su caso de uso. Este es un tema complicado (lo cual es cierto para muchos temas de Git en general), así que asegúrese de seguir las instrucciones que mejor se adapten a sus necesidades.

Eliminar confirmaciones no publicadas

Si aún no ha publicado sus confirmaciones en un repositorio remoto, como GitHub, puede eliminar las confirmaciones anteriores utilizando el comando reset.

Si bien esta es una solución efectiva, es peligrosa ya que está reescribiendo el historial y dejando las confirmaciones "eliminadas" sin referencia, o "huérfanas". La única forma de encontrar y recuperar estas confirmaciones sin referencia es con git reflog.

El comando reset tiene tres opciones diferentes, dos de las cuales describiremos aquí:

1
$ git reset --hard <hash-or-ref>

Usando la opción --hard, todo se revierte a la confirmación especificada. Esto incluye los punteros de referencia del historial de confirmaciones, el índice de preparación y su directorio de trabajo.

Esto significa que al usar solo este comando, no solo volverá a una confirmación anterior, sino que perderá todos los cambios de trabajo en el proceso. Para evitar perder cualquier cambio de trabajo, puede usar los comandos stash y stash pop:

1
2
3
$ git stash
$ git reset --hard <hash-or-ref>
$ git stash pop

El comando stash guarda los cambios de trabajo (sin ninguna confirmación o cambio en el árbol), y luego stash pop los recupera.

La otra opción que puede considerar es la opción --soft. Esta opción funciona de la misma manera que git reset --hard <hash-or-ref>, pero solo afecta el historial de confirmación, no el directorio de trabajo o el índice de preparación.

1
$ git reset --soft <hash-or-ref>

Entonces, si tiene cambios no confirmados que desea conservar, entonces esta es probablemente la opción que desea.

Eliminación de confirmaciones publicadas

Así que digamos que confirmaste tu código y luego lo empujaste al repositorio remoto. En este punto, se recomienda enfáticamente que no use algo como git reset ya que estaría reescribiendo el historial.

En su lugar, el enfoque recomendado sería usar el comando revert. Este comando funciona deshaciendo los cambios que se realizaron en la confirmación especificada mediante la creación de una nueva confirmación y no eliminando ninguna confirmación anterior. Esto es ideal para los cambios publicados porque se conserva la verdadera historia del repositorio. Aquí está el comando:

1
$ git revert <hash-or-ref>

Entonces, digamos que tiene un archivo de texto en su repositorio con el siguiente contenido:

1
This is my sample text

Y luego lo cambias a:

1
This is my awesome sample text

Su historial de confirmaciones podría verse así:

1
2
3
$ git log --pretty=oneline
676ec97a9cb2cebbb5c77904bbc61ced05b86f52 Added 'awesome' to text
735c5b43bf4b5b7107a9cc3f6614a3890e2889f6 Initial commit

Si decidimos que ya no queremos "awesome" en nuestro texto, pero no queremos eliminar la confirmación 676ec, podemos usar revert para deshacer ese cambio:

1
2
3
$ git revert 676ec
[master f68e546] Revert "Added 'awesome' to text"
 1 file changed, 1 insertion(+), 1 deletion(-)

Después de que se nos solicite ingresar un mensaje de confirmación, ahora podemos ver en nuestro historial de confirmación que en realidad hay una nueva confirmación:

1
2
3
4
$ git log --pretty=oneline
f68e546ac2ae240f22b2676b5aec499aab27f1ca Revert "Added 'awesome' to text"
676ec97a9cb2cebbb5c77904bbc61ced05b86f52 Added 'awesome' to text
735c5b43bf4b5b7107a9cc3f6614a3890e2889f6 Initial commit

Como resultado de esto, la primera y la tercera confirmación representan exactamente el mismo estado del proyecto. La confirmación se revirtió y no se perdió ningún historial.

Tenga en cuenta que hay bastantes otras formas de usar este comando, como si desea revertir 2 confirmaciones, puede usar:

1
$ git revert HEAD~2

O si desea revertir muchas confirmaciones no continuas, especifíquelas individualmente:

1
$ git revert 676ec 735c5

Revisar temporalmente una confirmación anterior {#revisar temporalmente una confirmación anterior}

Al "revertir una confirmación", puede querer decir que desea volver temporalmente a un estado anterior en su repositorio, pero sin realizar ningún cambio real en el árbol. En este caso, probablemente solo querrá verificar el compromiso, lo que le permitirá volver al maestro o cualquier otro estado cuando haya terminado:

1
$ git checkout <hash-or-ref>

Esto cambiará su directorio de trabajo al contenido de ese compromiso, así como la ubicación a la que apunta HEAD, ninguno de los cuales es irreversible. Cualquier cambio que realice aquí puede enviarse a una rama o guardarse para su uso posterior.

Licensed under CC BY-NC-SA 4.0