Cosa otterrai
Romperai deliberatamente un rebase, poi recupererai usando il reflog e ORIG_HEAD.
Setup: un sandbox con commit reali
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
Disastro 1: commit accidentalmente droppati
git rebase -i HEAD~4
git log --oneline
Recupero 1: ORIG_HEAD
git reset --hard ORIG_HEAD
git log --oneline
Disastro 2: risoluzione conflitti rebase andata male
git checkout -b feature HEAD~2
echo "feature change" >> file.txt
git commit -am "Feature change"
git rebase main
Recupero 2: reflog
git reflog
git reset --hard HEAD@{3}
Disastro 3: rebase, poi piu lavoro, poi realizzato che il rebase era sbagliato
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
Disastro 4: force-push del rebase cattivo
git reflog
git reset --hard <good-sha>
git push --force-with-lease
Disastro 5: rebase ha mangiato il genitore sbagliato
git reset --hard ORIG_HEAD
git rebase main
Prevenire futuri disastri
Fare un branch di backup prima di operazioni rischiose
git branch backup-before-rebase
git rebase -i HEAD~10
git reset --hard backup-before-rebase
git branch -D backup-before-rebase
Aumentare la scadenza reflog
git config gc.reflogExpire 365.days
git config gc.reflogExpireUnreachable 90.days
Pushare prima del rebase
git push backup HEAD:my-branch-backup
git rebase ...
Abilitare rerere
git config --global rerere.enabled true