Vous avez supprimé une branche par erreur, fait un reset --hard
de trop, ou perdu du travail en detached HEAD ? Git ne jette presque
jamais rien. Le reflog conserve 90 jours d’historique local, et
git fsck retrouve même les objets orphelins. Ce guide vous accompagne
dans chaque scénario de récupération.
Prérequis : Sélection de révisions et HEAD détaché.
Ce que vous allez apprendre
Section intitulée « Ce que vous allez apprendre »- Utiliser le reflog pour retrouver tout commit ou état passé
- Récupérer une branche supprimée par erreur
- Récupérer des commits réalisés en HEAD détaché
- Annuler un
reset --hardavant que le garbage collector n’intervienne - Utiliser
git fsckpour localiser des objets orphelins
Le reflog : votre machine à remonter le temps
Section intitulée « Le reflog : votre machine à remonter le temps »Le reflog (reference log) enregistre chaque mouvement de HEAD dans votre repo local : commits, switches de branche, resets, rebases, checkouts…
git reflogSortie typique :
a1b2c3d HEAD@{0}: reset: moving to HEAD~3e4f5a6b HEAD@{1}: commit: feat: authentification OAuthc7d8e9f HEAD@{2}: commit: fix: corriger la paginationb0a1c2d HEAD@{3}: commit: feat: page de profilf1a2b3c HEAD@{4}: checkout: moving from feature/auth to mainChaque ligne est un point de restauration. HEAD@{1} signifie
« où HEAD était il y a 1 mouvement ».
Récupérer après un reset —hard
Section intitulée « Récupérer après un reset —hard »Vous avez exécuté git reset --hard HEAD~3 par erreur et 3 commits
ont disparu :
-
Consultez le reflog
Fenêtre de terminal git refloga1b2c3d HEAD@{0}: reset: moving to HEAD~3e4f5a6b HEAD@{1}: commit: feat: authentification OAuthLa ligne
HEAD@{1}montre le SHA du commit juste avant le reset. -
Restaurez HEAD à la position d’avant le reset
Fenêtre de terminal git reset --hard e4f5a6bOu avec la notation reflog :
Fenêtre de terminal git reset --hard HEAD@{1} -
Vérifiez que les commits sont revenus
Fenêtre de terminal git log --oneline -5
Les 3 commits sont de retour. Le reflog a permis de retrouver le SHA du commit perdu.
Récupérer une branche supprimée
Section intitulée « Récupérer une branche supprimée »Vous avez supprimé feature/dashboard avec git branch -D et
réalisez que vous en aviez encore besoin :
-
Retrouvez le dernier commit de la branche dans le reflog
Fenêtre de terminal git reflogCherchez la ligne correspondant à la branche supprimée :
f1a2b3c HEAD@{5}: commit: feat: ajouter les graphiques du dashboardd4e5f6a HEAD@{6}: commit: feat: layout du dashboarda7b8c9d HEAD@{7}: checkout: moving from main to feature/dashboardLe dernier commit de la branche est
f1a2b3c. -
Recréez la branche à partir de ce SHA
Fenêtre de terminal git branch feature/dashboard f1a2b3c -
Vérifiez que le contenu est complet
Fenêtre de terminal git log --oneline feature/dashboard
La branche est restaurée avec tous ses commits.
Reflog d’une branche spécifique
Section intitulée « Reflog d’une branche spécifique »Si vous connaissez le nom de la branche, consultez son reflog dédié :
git reflog show feature/dashboardCela montre uniquement les mouvements de cette branche, pas les mouvements de HEAD.
Sauver du travail en detached HEAD
Section intitulée « Sauver du travail en detached HEAD »Vous avez fait des commits en detached HEAD (par exemple après un
git checkout <SHA> ou git switch --detach <SHA>) et vous voulez
garder ce travail :
Symptôme
Section intitulée « Symptôme »En quittant le detached HEAD, Git affiche un avertissement :
Warning: you are leaving 2 commits behind, not connected toany of your branches: a1b2c3d feat: expérience WIP d4e5f6a fix: correction rapideSolution : créer une branche avant de quitter
Section intitulée « Solution : créer une branche avant de quitter »Si vous êtes encore en detached HEAD :
git switch -c rescue/mon-travailCela crée une branche qui capture tous vos commits.
Solution : récupérer après avoir quitté
Section intitulée « Solution : récupérer après avoir quitté »Si vous avez déjà quitté le detached HEAD :
-
Retrouvez le SHA dans le reflog
Fenêtre de terminal git reflogb0a1c2d HEAD@{0}: checkout: moving from a1b2c3d to maina1b2c3d HEAD@{1}: commit: feat: expérience WIP -
Créez une branche sur ce SHA
Fenêtre de terminal git branch rescue/mon-travail a1b2c3d
Récupérer après un rebase raté
Section intitulée « Récupérer après un rebase raté »Un rebase qui a mal tourné peut être annulé :
Pendant le rebase
Section intitulée « Pendant le rebase »git rebase --abortRevient à l’état exact d’avant le rebase — aucune modification perdue.
Après un rebase terminé
Section intitulée « Après un rebase terminé »Le reflog montre l’état d’avant :
git refloga1b2c3d HEAD@{0}: rebase (finish): ...f1a2b3c HEAD@{5}: rebase (start): checkout maine4f5a6b HEAD@{6}: commit: mon dernier commit avant le rebaseRestaurez l’état d’avant :
git reset --hard HEAD@{6}Ou utilisez ORIG_HEAD juste après :
git reset --hard ORIG_HEADDernier recours : git fsck —lost-found
Section intitulée « Dernier recours : git fsck —lost-found »Si le reflog est vide (repo fraîchement cloné, reflog expiré après
90 jours), git fsck peut retrouver les objets orphelins :
git fsck --lost-foundSortie :
dangling commit a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0dangling commit d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0a1b2c3dangling blob f1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0Examinez chaque commit orphelin :
git show a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0Si c’est le commit que vous cherchez, rattachez-le à une branche :
git branch rescue/found a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0Récapitulatif des commandes de récupération
Section intitulée « Récapitulatif des commandes de récupération »| Situation | Commande |
|---|---|
| Retrouver un commit perdu | git reflog → noter le SHA |
| Annuler un reset —hard | git reset --hard HEAD@{N} |
| Annuler immédiatement (merge/reset/rebase) | git reset --hard ORIG_HEAD |
| Branche supprimée | git reflog → git branch nom SHA |
| Travail en detached HEAD | git switch -c rescue/nom (avant de quitter) |
| Travail perdu en detached HEAD | git reflog → git branch rescue/nom SHA |
| Rebase raté (en cours) | git rebase --abort |
| Rebase raté (terminé) | git reset --hard ORIG_HEAD |
| Reflog vide / expiré | git fsck --lost-found → git show SHA |
Dépannage : problèmes courants
Section intitulée « Dépannage : problèmes courants »| Symptôme | Cause probable | Solution |
|---|---|---|
| Le reflog est vide | Repo fraîchement cloné (le reflog est local) | git fsck --lost-found |
HEAD@{N} pointe vers le mauvais commit | Numérotation décalée par d’autres opérations | Utilisez le SHA directement, pas la notation HEAD@{N} |
git branch dit que la branche existe déjà | La branche n’a pas été supprimée complètement | git switch nom-branche pour vérifier son contenu |
fsck ne trouve rien | Le garbage collector a nettoyé les objets orphelins | Si le reflog a expiré (30 j, gc.reflogExpireUnreachable) et que git gc a tourné (pruneExpire = 2 semaines) : les données sont irrécupérables |
| ORIG_HEAD est incorrect | Plusieurs opérations depuis l’erreur | Utilisez le reflog avec un SHA précis |
À retenir
Section intitulée « À retenir »- Git ne jette presque jamais rien — les commits restent dans la base d’objets même après un reset ou une suppression de branche
git reflogest votre premier réflexe : il montre chaque mouvement de HEAD des 90 derniers joursORIG_HEADest un raccourci pour annuler immédiatement la dernière opération (reset, merge, rebase)- Branche supprimée : retrouvez le SHA dans le reflog et recréez
la branche avec
git branch nom SHA - Detached HEAD : créez une branche (
git switch -c) avant de quitter, ou retrouvez le SHA dans le reflog git fsck --lost-foundest le dernier recours quand le reflog est vide- Les entrées de reflog pour commits orphelins expirent après 30 jours (
gc.reflogExpireUnreachable) ; les objets sont purgés au prochaingit gc(délaigc.pruneExpire= 2 semaines par défaut) — agissez vite