Aller au contenu
Développement medium
🔐 Alerte sécurité — Incident supply chain Trivy : lire mon analyse de l'attaque

Récupérer des données perdues dans Git

10 min de lecture

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

  • 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 --hard avant que le garbage collector n’intervienne
  • Utiliser git fsck pour localiser des objets orphelins

Le reflog (reference log) enregistre chaque mouvement de HEAD dans votre repo local : commits, switches de branche, resets, rebases, checkouts…

Fenêtre de terminal
git reflog

Sortie typique :

a1b2c3d HEAD@{0}: reset: moving to HEAD~3
e4f5a6b HEAD@{1}: commit: feat: authentification OAuth
c7d8e9f HEAD@{2}: commit: fix: corriger la pagination
b0a1c2d HEAD@{3}: commit: feat: page de profil
f1a2b3c HEAD@{4}: checkout: moving from feature/auth to main

Chaque ligne est un point de restauration. HEAD@{1} signifie « où HEAD était il y a 1 mouvement ».

Vous avez exécuté git reset --hard HEAD~3 par erreur et 3 commits ont disparu :

  1. Consultez le reflog

    Fenêtre de terminal
    git reflog
    a1b2c3d HEAD@{0}: reset: moving to HEAD~3
    e4f5a6b HEAD@{1}: commit: feat: authentification OAuth

    La ligne HEAD@{1} montre le SHA du commit juste avant le reset.

  2. Restaurez HEAD à la position d’avant le reset

    Fenêtre de terminal
    git reset --hard e4f5a6b

    Ou avec la notation reflog :

    Fenêtre de terminal
    git reset --hard HEAD@{1}
  3. 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.

Vous avez supprimé feature/dashboard avec git branch -D et réalisez que vous en aviez encore besoin :

  1. Retrouvez le dernier commit de la branche dans le reflog

    Fenêtre de terminal
    git reflog

    Cherchez la ligne correspondant à la branche supprimée :

    f1a2b3c HEAD@{5}: commit: feat: ajouter les graphiques du dashboard
    d4e5f6a HEAD@{6}: commit: feat: layout du dashboard
    a7b8c9d HEAD@{7}: checkout: moving from main to feature/dashboard

    Le dernier commit de la branche est f1a2b3c.

  2. Recréez la branche à partir de ce SHA

    Fenêtre de terminal
    git branch feature/dashboard f1a2b3c
  3. 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.

Si vous connaissez le nom de la branche, consultez son reflog dédié :

Fenêtre de terminal
git reflog show feature/dashboard

Cela montre uniquement les mouvements de cette branche, pas les mouvements de 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 :

En quittant le detached HEAD, Git affiche un avertissement :

Warning: you are leaving 2 commits behind, not connected to
any of your branches:
a1b2c3d feat: expérience WIP
d4e5f6a fix: correction rapide

Si vous êtes encore en detached HEAD :

Fenêtre de terminal
git switch -c rescue/mon-travail

Cela crée une branche qui capture tous vos commits.

Si vous avez déjà quitté le detached HEAD :

  1. Retrouvez le SHA dans le reflog

    Fenêtre de terminal
    git reflog
    b0a1c2d HEAD@{0}: checkout: moving from a1b2c3d to main
    a1b2c3d HEAD@{1}: commit: feat: expérience WIP
  2. Créez une branche sur ce SHA

    Fenêtre de terminal
    git branch rescue/mon-travail a1b2c3d

Un rebase qui a mal tourné peut être annulé :

Fenêtre de terminal
git rebase --abort

Revient à l’état exact d’avant le rebase — aucune modification perdue.

Le reflog montre l’état d’avant :

Fenêtre de terminal
git reflog
a1b2c3d HEAD@{0}: rebase (finish): ...
f1a2b3c HEAD@{5}: rebase (start): checkout main
e4f5a6b HEAD@{6}: commit: mon dernier commit avant le rebase

Restaurez l’état d’avant :

Fenêtre de terminal
git reset --hard HEAD@{6}

Ou utilisez ORIG_HEAD juste après :

Fenêtre de terminal
git reset --hard ORIG_HEAD

Si le reflog est vide (repo fraîchement cloné, reflog expiré après 90 jours), git fsck peut retrouver les objets orphelins :

Fenêtre de terminal
git fsck --lost-found

Sortie :

dangling commit a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0
dangling commit d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0a1b2c3
dangling blob f1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0

Examinez chaque commit orphelin :

Fenêtre de terminal
git show a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0

Si c’est le commit que vous cherchez, rattachez-le à une branche :

Fenêtre de terminal
git branch rescue/found a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0
SituationCommande
Retrouver un commit perdugit reflog → noter le SHA
Annuler un reset —hardgit reset --hard HEAD@{N}
Annuler immédiatement (merge/reset/rebase)git reset --hard ORIG_HEAD
Branche suppriméegit refloggit branch nom SHA
Travail en detached HEADgit switch -c rescue/nom (avant de quitter)
Travail perdu en detached HEADgit refloggit 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-foundgit show SHA
SymptômeCause probableSolution
Le reflog est videRepo fraîchement cloné (le reflog est local)git fsck --lost-found
HEAD@{N} pointe vers le mauvais commitNumérotation décalée par d’autres opérationsUtilisez 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ètementgit switch nom-branche pour vérifier son contenu
fsck ne trouve rienLe garbage collector a nettoyé les objets orphelinsSi 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 incorrectPlusieurs opérations depuis l’erreurUtilisez le reflog avec un SHA précis
  • 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 reflog est votre premier réflexe : il montre chaque mouvement de HEAD des 90 derniers jours
  • ORIG_HEAD est 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-found est 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 prochain git gc (délai gc.pruneExpire = 2 semaines par défaut) — agissez vite

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracing. Aujourd'hui, ce site ne couvre même pas mes frais d'hébergement, d'électricité, de matériel, de logiciels, mais surtout de cafés.

Un soutien régulier, même symbolique, m'aide à garder ces ressources gratuites et à continuer de produire des guides de qualité. Merci pour votre appui.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn