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

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.