Git School · FluxGit

Deshacer git reset --hard con reflog

FluxGit ·

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_COMMIT

Conserva 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-work

Primer 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 --short

Preguntas 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

Git School · 1:50

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.

Deshacer git reset --hard: recupera tu commit perdido
Narración en inglés. YouTube ofrece subtítulos manuales en 11 idiomas. Esta transcripción está en español.

Ver en YouTube — abre una pestaña nueva

Grabado en un repositorio de pruebas.

Leer la transcripción de la narración
  1. 00:03 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.
  2. 00:12 Primero, un trabajo guardado en un commit: reintentar dos veces la llamada de pago.
  3. 00:19 Después, en una terminal: git reset hard, HEAD tilde uno.
  4. 00:24 FluxGit lo ve al instante. La rama ha retrocedido y el commit ya no está en ella.
  5. 00:31 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.
  6. 00:47 En FluxGit, Recover lost work lo explica con palabras sencillas y te lleva al sitio correcto.
  7. 00:59 La Safety Timeline muestra el reset en una frase. Desde el momento anterior, crea una rama.
  8. 01:06 Tu commit ha vuelto, en su propia rama.
  9. 01:10 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.
  10. 01:26 Lo mismo en la terminal: git reflog, busca la línea anterior al reset y crea una rama en ese commit.
  11. 01:34 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.

Flujos relacionados

Descargar FluxGit