Deshacer git reset --hard con reflog
Los bloques son casos distintos, no un único script. Elige el que encaja con tu repositorio. Sustituye ramas, rutas y VERIFIED_COMMIT antes de usarlos. Los comandos de cancelación solo corresponden a su operación activa; no ejecutes ambas alternativas.
Respuesta breve
Tras git reset --hard, busca el commit anterior en el reflog, compruébalo y crea una rama de rescate. La recuperación exige que el objeto del commit siga conservado.
Ejemplo y condiciones
Este recorrido recupera trabajo que llegó a tener un commit. El reflog no guarda las modificaciones que solo estaban en el directorio de trabajo.
Inspecciona antes de cambiar
Detén nuevos resets, rebases y cambios de rama. Lee git reflog y verifica el contenido con git show antes de mover ninguna referencia.
git status --short
git reflog --date=iso
git show VERIFIED_COMMITConserva una referencia o checkout separado
Crea rescue/lost-work sobre VERIFIED_COMMIT. Esa rama conserva el commit sin cambiar tu rama actual ni sobrescribir los archivos del directorio de trabajo.
git branch rescue/lost-work VERIFIED_COMMIT
git log -5 --oneline rescue/lost-workPrimer flujo
Inspecciona el historial y el parche de la rama recuperada. Puedes revisarla en otro checkout o integrar deliberadamente el trabajo que necesitas.
Elige deliberadamente la otra opción
Un reset directo al commit recuperado vuelve a cambiar la rama, el índice y los archivos. Conserva primero tus cambios actuales y una referencia de rescate.
Límites y excepciones
HEAD@{1} es una posición del reflog, no una garantía del commit correcto. ORIG_HEAD puede contener la punta anterior, pero otras operaciones pueden reemplazarlo.
Conflictos y limpieza
El reflog caduca y el pruning de objetos tiene otra política configurable. Si el objeto se eliminó, una entrada antigua del reflog no puede reconstruirlo.
Verifica el resultado
Comprueba el commit, sus archivos y el historial de la rama de rescate. Ejecuta las pruebas pertinentes antes de incorporar sus cambios.
git show --stat rescue/lost-work
git status --shortPreguntas habituales
git revert crea un commit inverso y no devuelve una rama al estado previo al reset. Para contenido solo preparado, git fsck puede hallar blobs; no garantiza nombres ni estructura.
Revisa la operación en FluxGit
FluxGit reúne movimientos del reflog y puntos de restauración en Safety Timeline. Con la función habilitada y cambios locales detectados, un reset cubierto puede guardar un stash de seguridad; el reset de terminal del tutorial no usa esa protección.
Documentación oficial de Git
Deshacer git reset --hard: recupera tu commit perdido
Recupera un cambio guardado en un commit tras git reset --hard mediante el reflog local mientras se conserve el objeto del commit. La recuperación no está garantizada tras caducar el reflog o eliminarse los objetos.
Ver en YouTube — abre una pestaña nueva
Grabado en un repositorio de pruebas.
Leer la transcripción de la narración
- Hiciste git reset hard y tu último commit ha desaparecido. A todos nos pasa una vez. Aquí está la forma de recuperarlo, y por qué funciona.
- Primero, un trabajo guardado en un commit: reintentar dos veces la llamada de pago.
- Después, en una terminal: git reset hard, HEAD tilde uno.
- FluxGit lo ve al instante. La rama ha retrocedido y el commit ya no está en ella.
- Por esto no se ha perdido. Una rama es solo una etiqueta sobre un commit. El reset mueve la etiqueta hacia atrás, pero el commit sigue en el repositorio, y el reflog, el diario de Git, todavía lo apunta. Ponle una rama y vuelve.
- En FluxGit, Recover lost work lo explica con palabras sencillas y te lleva al sitio correcto.
- La Safety Timeline muestra el reset en una frase. Desde el momento anterior, crea una rama.
- Tu commit ha vuelto, en su propia rama.
- El trabajo sin commit no aparece en el reflog. Con los puntos de restauración habilitados y si se detectan cambios locales, FluxGit puede guardar un stash de seguridad antes de un reset hard. Este reset ejecutado directamente en la terminal de Git omite esa protección.
- Lo mismo en la terminal: git reflog, busca la línea anterior al reset y crea una rama en ese commit.
- Resumen. Un reset mueve una etiqueta. El reflog recuerda dónde estaba. Crea una rama para conservar el commit. Siguiente lección: recuperar una rama borrada.