Par Anonyme (non vérifié) , 29 avril 2026

Ce que vous accomplirez

Vous gâcherez délibérément un rebase, puis récupérerez en utilisant le reflog et ORIG_HEAD.

Setup : un sandbox avec de vrais commits

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

Désastre 1 : commits accidentellement supprimés

git rebase -i HEAD~4
git log --oneline

Récupération 1 : ORIG_HEAD

git reset --hard ORIG_HEAD
git log --oneline

Désastre 2 : résolution de conflit de rebase mal tournée

git checkout -b feature HEAD~2
echo "feature change" >> file.txt
git commit -am "Feature change"
git rebase main

Récupération 2 : reflog

git reflog
git reset --hard HEAD@{3}

Désastre 3 : rebase, plus de travail, puis réalisation

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

Désastre 4 : force-push du mauvais rebase

  • Le reflog local a encore l'original.
  • Un coéquipier a un clone avec l'original.
  • Le host a un log d'activité.
git reflog
git reset --hard <good-sha>
git push --force-with-lease

Désastre 5 : le rebase a mangé le mauvais parent

git reset --hard ORIG_HEAD
git rebase main

Prévenir les désastres futurs

Faire une branche backup avant les opérations risquées

git branch backup-before-rebase
git rebase -i HEAD~10
git reset --hard backup-before-rebase
git branch -D backup-before-rebase

Augmenter l'expiration du reflog

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

Pusher avant de rebaser

git push backup HEAD:my-branch-backup
git rebase ...

Activer rerere

git config --global rerere.enabled true

Le modèle mental

Rebase réécrit les commits, mais les originaux ne disparaissent pas — ils restent comme commits orphelins dans la base de données d'objets.