← retour aux snippets

git: recuperer un commit perdu avec reflog

Retrouver un commit ou une branche supprimee avec git reflog et restaurer rapidement.


objectif

Identifier un commit disparu apres un reset —hard, un rebase ou une branche supprimee, puis le restaurer proprement.

code minimal

# lister l'historique des positions de HEAD (avec dates ISO)
git reflog --date=iso

# revenir a l'etat juste avant l'action fautive
git reset --hard HEAD@{1}

utilisation

# 1) retrouver le commit cible dans le reflog
git reflog --date=iso | head -n 20

# 2) afficher le diff d'un etat passe pour verifier
git show HEAD@{2}

# 3) recuperer une branche supprimee (recreer depuis le SHA trouve)
# supposez que <sha> vient du reflog (ex: "checkout: moving from feature/x to main")
git branch feature/x <sha>

# 4) si vous voulez seulement reprendre le patch d'un commit orphelin
git cherry-pick <sha>

# 5) revenir a un etat precedent exact de la branche courante
git reset --hard HEAD@{3}

# 6) verifier l'etat
git status
git log --oneline --decorate -n 5

variante(s) utile(s)

# reflog d'une branche precise (si elle existe encore)
git reflog show feature/x

# recherches pratiques dans le reflog
git reflog --grep-reflog='reset'        # actions de type reset
git reflog --grep-reflog='rebase'       # actions de rebase
git reflog --grep-reflog='commit'       # nouveaux commits

# retrouver un commit non reference quand le reflog ne suffit plus
# (dernier recours; affiche des commits orphelins)
git fsck --unreachable --no-reflogs --full | grep commit | awk '{print $3}' | head

# creer une branche depuis un commit orphelin
git branch rescue/<date> <sha>

# annuler un rebase rate en revenant a l'entree "rebase started"
git reflog --date=iso | grep 'rebase' | head
git reset --hard HEAD@{<index>}

# apres restauration locale, mettre a jour la distante prudemment
git push --force-with-lease

notes

  • git reflog conserve les mouvements de HEAD pour une duree configurable (gc.reflogExpire). Plus vous agissez vite, mieux c’est.
  • HEAD@{n} designe le n-ieme etat precedent de HEAD; utilisez git show HEAD@{n} pour valider avant reset --hard.
  • pour une branche supprimee, retrouvez un SHA lie a cette branche dans le reflog puis recreez-la avec git branch <nom> <sha>.
  • preferez --force-with-lease lors d’un push forcé pour eviter d’ecraser le travail d’autrui.