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 reflogconserve 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; utilisezgit show HEAD@{n}pour valider avantreset --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-leaselors d’un push forcé pour eviter d’ecraser le travail d’autrui.