¿Has commiteado código incorrecto, o has destruido tu árbol de archivos con un reset --hard equivocado? Esta lección te muestra los comandos de rescate, ordenados del menos destructivo al más destructivo.
Descartar cambios no commiteados
Si has modificado un archivo pero aún no lo has puesto en stage, y quieres volver a la versión commiteada:
Si ya pusiste cambios en stage y quieres sacarlos (sin perder el contenido):
Deshacer un commit con git revert (seguro)
git revert crea un nuevo commit que invierte los efectos del commit objetivo. El historial se preserva, ningún commit existente se elimina. Es el método seguro, especialmente si ya has hecho push.
HEAD se refiere al último commit. También puedes pasar un hash: git revert a3f5b6c.
Retroceder en el historial con git reset
git reset mueve el puntero de rama hacia un commit anterior. Existen tres modos, del menos al más destructivo:
Modo --soft: los commits se deshacen, los archivos quedan en stage. Útil para agrupar commits.
Modo --mixed (por defecto): los commits se deshacen, los archivos salen del stage pero los cambios permanecen.
Modo --hard: los commits se deshacen y los cambios se ELIMINAN. Irrecuperable sin reflog.
La red de seguridad: git reflog
git reflog es tu último recurso. Lista todo lo que HEAD ha apuntado en las últimas semanas, incluso después de un reset --hard. Es la memoria secreta de Git.
Ves una lista de entradas con identificadores del tipo HEAD@{2}. Para volver a un estado concreto:
Recuperar un archivo de un commit antiguo
Si solo quieres recuperar un archivo en su estado de un commit concreto, sin tocar el resto:
El archivo vuelve a su estado en el commit a3f5b6c, listo para hacer stage o descartar.
