« Un commit qui n’apparaît plus dans git log est immédiatement supprimé. »
Le commit peut rester présent dans la base d’objets et être référencé par le reflog local pendant une période limitée.
01Observe le point de départ
cd /tmp/soria-git-undo-$USER/reflog
git log --oneline -3
git rev-parse HEAD
cat checkpoint.txt
02Déplace main
git reset --hard HEAD~1
git log --oneline -3
cat checkpoint.txt
Le troisième commit n’est plus accessible depuis main, mais le déplacement de HEAD vient d’être enregistré.
03Lis le reflog
git reflog -5
git reflog show main -5
git show HEAD@{1}
Les positions HEAD@{n} décrivent des entrées du reflog, pas une profondeur stable dans le graphe de commits.
04Récupère sans déplacer main
lost_commit=$(git rev-parse HEAD@{1})
git branch recovered-checkpoint "$lost_commit"
git show recovered-checkpoint:checkpoint.txt
git log --oneline --decorate --all --graph
Créer une branche rend le commit de nouveau accessible sans réécrire immédiatement la branche principale.
05Compare avec une sauvegarde de référence
git show-ref
git for-each-ref --format='%(refname:short) %(objectname:short)' refs/heads/
git merge-base main recovered-checkpoint
06Comprends les limites
Le reflog est local au clone. Il n’est pas envoyé par push et ses entrées expirent. Pour un état important, crée rapidement une branche ou un tag et vérifie son contenu.
07Observe les objets non référencés
git fsck --no-reflogs --unreachable
git count-objects -v
Ces commandes aident au diagnostic. N’exécute pas de garbage collection agressive avant d’avoir terminé une récupération.
Récupère sans écraser main
Rends un commit inaccessible par reset, retrouve-le avec reflog, crée une branche de récupération et démontre que main n’a pas été déplacée une seconde fois.
✓Ce que tu retiens
Le reflog enregistre les déplacements locaux des références. Il permet souvent de retrouver un commit perdu, mais la récupération doit être matérialisée rapidement par une nouvelle référence.