Versioning avec Git & GitHub · Étape 09

Retrouve un état perdu avec reflog et les références

Observe les déplacements locaux de HEAD, retrouve un commit devenu inaccessible et crée une branche de récupération.

Durée indicative · ~1 h 25Niveau intermédiairePrérequis conseillé · Leçon 8 — revert d’un commit partagéPratique · TP
L’idée reçue

« 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.

Challenge autonome

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.

Ta progression

Chargement de l’état… Se connecter pour synchroniser.