Ejercicio: Uso de Git para corregir errores
Ahora vamos a practicar la corrección de errores.
Práctica de recuperación de un archivo eliminado
En primer lugar, intente eliminar index.html:
rm index.html
Puede parecer una mala idea, pero recuerde: Git le cubre las espaldas.
Use un comando
ls
para comprobar que index.html se haya eliminado:ls
Debería ver la siguiente salida. Observe que ahora no hay ningún archivo index.html.
CSS
Vamos a recuperar index.html. Use
git checkout
para recuperar index.html:git checkout -- index.html
Vuelva a utilizar
ls
para comprobar el contenido del directorio actual. ¿Se ha restaurado index.html?Sí. Ahora la salida debe tener un archivo index.html y un directorio CSS:
CSS index.html
Práctica de la recuperación de un archivo eliminado: git rm
Si quiere recuperar archivos eliminados, las cosas son un poco más complicadas si los elimina mediante git rm
en lugar de rm
.
Para ver lo que sucede, pruebe este comando:
git rm index.html
De nuevo, busque index.html al ejecutar
ls
. No debería ver index.html.Intente recuperar index.html lo mismo que la última vez:
git checkout -- index.html
Esta vez, Git indica que no sabe nada de index.html. Esto se debe a que Git no solo ha eliminado el archivo, sino que ha registrado la eliminación en el índice:
error: pathspec 'index.html' did not match any file(s) known to git.
Revierta la eliminación de index.html del almacenamiento provisional con el comando
git reset
:git reset HEAD index.html
Busque esta salida, que lo confirma:
Unstaged changes after reset: D index.html
Ahora puede recuperar el archivo del índice con el comando que ha usado antes:
git checkout -- index.html
git reset
deshizo el cambio, pero el archivo seguía borrado, así que tuvo que usarcheckout
para recuperarlo.Vuelva a comprobar que ha funcionado al ejecutar
ls
.
Reversión de una confirmación
Ahora vamos a complicar las cosas un poco más. Imagine que por accidente sobrescribe un archivo con otro, o que hace un cambio en un archivo que resulta ser un gran error. Quiere revertir el archivo a la versión anterior, pero ya ha confirmado los cambios. En este caso, un sencillo git checkout
no va a funcionar.
Una solución a este problema consiste en revertir la confirmación anterior.
Abra index.html con
code
:code index.html
Reemplace el contenido de index.html por este código:
<h1>That was a mistake!</h1>
Guarde y cierre el archivo.
Use estos comandos para confirmar los cambios y mostrar la confirmación más reciente:
git commit -m "Purposely overwrite the contents of index.html" index.html git log -n1
La marca
-n1
aquí indica a Git que solo se quiere la entrada de confirmación más reciente.Use los comandos siguientes para intentar restaurar index.html:
git checkout -- index.html
Abra index.html en el editor:
code index.html
¿Qué versión de index.html verá? ¿La versión anterior o la nueva?
En esta situación, la mejor opción es revertir el cambio realizando otra confirmación que cancele la primera. Este es un trabajo para
git revert
.Cierre el archivo y use
git revert
para deshacer los cambios confirmados:git revert --no-edit HEAD
La marca
--no-edit
aquí indica a Git que no se quiere agregar un mensaje de confirmación para esta acción.Compruebe los resultados. Deben tener un aspecto similar a este ejemplo:
[main 6a27310] Revert "Purposely overwrite the contents of index.html" 1 file changed, 13 insertions(+), 1 deletion(-)
Realice un seguimiento con un comando
git log
para mostrar la confirmación más reciente:git log -n1
Vuelva a comprobar la salida. Deberían parecerse a los de este ejemplo:
Author: User Name <user-name@contoso.com> Date: Tue Nov 19 23:42:26 2019 +0000 Revert "Purposely overwrite the contents of index.html" This reverts commit 15d3bded388470c98881a632025bc15190fe9d17.
Por último, abra el archivo index.html para asegurarse de que el contenido es la versión correcta.
La reversión no es la única manera de solucionar esta situación; bastaría con editar index.html y confirmar el archivo corregido. Esa opción es más difícil si los cambios confirmados fueran muchos. En cualquier caso, git revert
es una clara señal de intenciones.