git reflog
Muestra por dónde han pasado HEAD y las ramas
El comando 'git reflog' lista cada posición que ha tenido HEAD: cada commit, cambio de rama, reset, fusión y rebase, del más reciente al más antiguo. Es local a tu repositorio y es la red de seguridad del trabajo perdido — los commits que un reset o un rebase quitaron de una rama siguen listados y se recuperan con HEAD@{n}. Por defecto, las entradas caducan a los 90 días.
Sinopsis
git reflog [show] [<log-options>] [<ref>]Opciones
Elegir la opción adecuada
log frente a reflog
Dos historiales
| Comando | Lista | ¿Compartido? |
|---|---|---|
git log | Commits alcanzables desde una rama | Sí, con los commits |
git reflog | Cada movimiento de HEAD, incluso a commits que ninguna rama tiene | No, solo local |
Ejemplos
Listar los movimientos de HEAD
git reflogDel más reciente al más antiguo, con nombres HEAD@{n}.
Deshacer un reset
git reset --hard HEAD@{1}Vuelve a donde estaba HEAD un movimiento antes.
Reflog de una rama
git reflog show mainSolo los movimientos de main.
Ejemplos de flujos de trabajo
git reflogEncontrar la entrada anterior al reset
git reset --hard HEAD@{1}Volver a ella
git reflogEncontrar el último commit de esa rama
git switch -c feature/login a1b2c3dRecrear la rama ahí
Solución de problemas
El commit no está en el reflog
Causa: Nunca se extrajo aquí, o la entrada caducó
Prueba git fsck --lost-found para commits huérfanos
HEAD@{1} apunta a un sitio inesperado
Causa: Cada cambio de rama también cuenta como movimiento
Lee el reflog y elige la entrada exacta
Consejos y trampas
Buenas prácticas
- ✓Revisa git reflog antes de entrar en pánico por commits perdidos.
- ✓Recupera primero en una rama nueva (git switch -c rescue <hash>) para revisar sin riesgo.
Errores comunes
- ✗Creer que un reset --hard borró commits para siempre — el reflog aún los tiene.
- ✗Esperar demasiado: los commits inalcanzables desaparecen cuando caducan las entradas del reflog y se ejecuta git gc.
- ✗Esperar el reflog en otra máquina — nunca se sube ni se clona.
Preguntas frecuentes
Por defecto, 90 días las alcanzables y 30 días las inalcanzables.
No, solo lista. Son git reflog expire y delete los que eliminan entradas.