Por Anónimo (no verificado) , 29 Abril 2026

Introducción

El reflog registra cada cambio a HEAD y a la punta de cada branch en tu máquina local. Es local, por clon y no se pushea. Casi cualquier commit "perdido" puede rescatarse a través de él.

Viendo

git reflog                            # reflog de HEAD
git reflog show main                  # reflog de main
git reflog --date=iso
git log -g --oneline                  # log walk a través del reflog

Cada entrada tiene una secuencia (HEAD@{0}, HEAD@{1}, ...), una acción (commit, reset, merge, rebase, ...) y un SHA destino.

Recuperando un commit perdido

git reflog
# 9f8a1c2 HEAD@{0}: reset: moving to HEAD~3
# a1b2c3d HEAD@{1}: commit: Important work
git switch -c rescued a1b2c3d

O directamente:

git reset --hard HEAD@{1}

Sintaxis basada en tiempo

git show HEAD@{2.hours.ago}
git diff main@{yesterday} main

Git interpreta @{...} como un conteo o una fecha.

Expiración del reflog

Por defecto, las entradas alcanzables del reflog expiran después de 90 días, y las inalcanzables después de 30:

git config gc.reflogExpire 90.days
git config gc.reflogExpireUnreachable 30.days

Hasta la expiración, incluso los commits hard-reseteados permanecen recuperables.

Reflogs por ref

Cada branch tiene su propio reflog en .git/logs/refs/heads/<name>. Stash también tiene uno (refs/stash):

git reflog show stash

Podando el reflog

git reflog expire --expire=now --all
git gc --prune=now

Úsalo solo si necesitas eliminar permanentemente datos; esto remueve la red de seguridad.

Reflog vs git log

git log recorre el grafo de commits por punteros padre; el reflog recorre los movimientos registrados de una ref. Después de un force-reset, git log ya no muestra los commits abandonados, pero el reflog aún los muestra.

Inspección de reflog por ref

Cada ref mantiene su propio reflog. Inspecciona el reflog de un branch específico para ver cómo se movió su punta:

git reflog show feature/login
git log -g feature/login --oneline
cat .git/logs/refs/heads/feature/login

Útil al investigar "¿quién movió este branch?" en un clon local. El formato del archivo de reflog es una línea por cambio con SHA viejo, SHA nuevo, committer, timestamp y un mensaje textual. Combinado con git blame en el archivo, da una pista de auditoría local completa; recuerda que los reflogs no se pushean, así que la pista cubre solo tu máquina.

Errores comunes

Olvidar que el reflog existe en pánico y rehacer horas de trabajo que era fácilmente recuperable. Siempre verifica git reflog primero. Pushear durante la recuperación y asumir que el reflog está en el servidor; no lo está, solo tu clon local lo tiene. Ejecutar git gc --prune=now por instinto de "limpieza" y destruir la red de seguridad para cualquier commit no referenciado. Y finalmente, tratar las entradas del reflog como eternas; las refs eliminadas hace mucho expiran. Etiqueta o branchea cualquier cosa que quieras conservar antes de que pasen 30 días.