Lo que lograrás
Deliberadamente arruinarás un rebase, luego recuperarás usando el reflog y ORIG_HEAD.
Setup: un sandbox con commits reales
mkdir rebase-recovery && cd rebase-recovery
git init
for i in 1 2 3 4 5; do
echo "$i" > file.txt
git add . && git commit -m "Commit $i"
done
git log --oneline
Desastre 1: commits descartados accidentalmente
git rebase -i HEAD~4
git log --oneline
Recuperación 1: ORIG_HEAD
git reset --hard ORIG_HEAD
git log --oneline
Desastre 2: resolución de conflicto de rebase salió mal
git checkout -b feature HEAD~2
echo "feature change" >> file.txt
git commit -am "Feature change"
git rebase main
Recuperación 2: reflog
git reflog
git reset --hard HEAD@{3}
Desastre 3: rebase, más trabajo, luego darse cuenta
git reflog
git reset --hard <sha-before-rebase>
git branch save-work HEAD~2..HEAD
git reset --hard <sha-before-rebase>
git cherry-pick save-work
git branch -D save-work
Desastre 4: force-push del mal rebase
- El reflog local aún tiene el original.
- Un compañero tiene un clone con el original.
- El host tiene un log de actividad.
git reflog
git reset --hard <good-sha>
git push --force-with-lease
Desastre 5: rebase comió el padre equivocado
git reset --hard ORIG_HEAD
git rebase main
Prevenir desastres futuros
Hacer un branch de backup antes de operaciones riesgosas
git branch backup-before-rebase
git rebase -i HEAD~10
git reset --hard backup-before-rebase
git branch -D backup-before-rebase
Aumentar expiración del reflog
git config gc.reflogExpire 365.days
git config gc.reflogExpireUnreachable 90.days
Pushear antes de rebasear
git push backup HEAD:my-branch-backup
git rebase ...
Habilitar rerere
git config --global rerere.enabled true
El modelo mental
Rebase reescribe commits, pero los originales no desaparecen — quedan como commits huérfanos en la base de datos de objetos, alcanzables vía reflog durante ~90 días.