Introduction
Le reflog enregistre chaque changement de HEAD et de chaque pointe de branche sur votre machine locale. Il est local, par clone, et n'est pas poussé. Presque tout commit « perdu » peut être sauvé via lui.
Visualiser
git reflog # reflog HEAD
git reflog show main # reflog de main
git reflog --date=iso
git log -g --oneline # parcours de log à travers le reflog
Chaque entrée a une séquence (HEAD@{0}, HEAD@{1}, ...), une action (commit, reset, merge, rebase, ...), et un SHA cible.
Récupérer un commit perdu
git reflog
# 9f8a1c2 HEAD@{0}: reset: moving to HEAD~3
# a1b2c3d HEAD@{1}: commit: Important work
git switch -c rescued a1b2c3d
Ou directement :
git reset --hard HEAD@{1}
Syntaxe basée sur le temps
git show HEAD@{2.hours.ago}
git diff main@{yesterday} main
Git interprète @{...} soit comme un compteur, soit comme une date.
Expiration du reflog
Par défaut, les entrées atteignables du reflog expirent après 90 jours, et les inatteignables après 30 :
git config gc.reflogExpire 90.days
git config gc.reflogExpireUnreachable 30.days
Jusqu'à expiration, même les commits hard-resettés restent récupérables.
Reflogs par ref
Chaque branche a son propre reflog à .git/logs/refs/heads/<name>. Le stash en a un aussi (refs/stash) :
git reflog show stash
Élaguer le reflog
git reflog expire --expire=now --all
git gc --prune=now
À utiliser seulement si vous devez supprimer définitivement des données ; cela retire le filet de sécurité.
Reflog vs git log
git log parcourt le graphe de commits par les pointeurs parents ; le reflog parcourt les mouvements enregistrés d'une ref. Après un reset forcé, git log n'affiche plus les commits abandonnés, mais le reflog le fait encore.
Inspection du reflog par ref
Chaque ref garde son propre reflog. Inspectez le reflog d'une branche spécifique pour voir comment sa pointe a bougé :
git reflog show feature/login
git log -g feature/login --oneline
cat .git/logs/refs/heads/feature/login
Utile pour enquêter sur « qui a déplacé cette branche ? » sur un clone local. Le format de fichier reflog est une ligne par changement avec ancien SHA, nouveau SHA, committer, horodatage et un message textuel. Combiné avec git blame sur le fichier, il donne une piste d'audit locale complète ; rappelez-vous que les reflogs ne sont pas poussés, donc la piste ne couvre que votre machine.
Erreurs fréquentes
Oublier l'existence du reflog en panique et refaire des heures de travail facilement récupérable. Vérifiez toujours git reflog en premier. Pousser pendant la récupération et supposer que le reflog est sur le serveur ; il ne l'est pas, seul votre clone local l'a. Exécuter git gc --prune=now par instinct de « nettoyage » et détruire le filet de sécurité pour tout commit non référencé. Et enfin, traiter les entrées de reflog comme éternelles ; les refs supprimées de longue date vieillissent. Taggez ou branchez tout ce que vous voulez garder avant 30 jours.