GIT - 24 Voyage dans le temps avec réinitialisation et reflog
Dans cette leçon, on fait un véritable voyage dans le temps Git avec les commandes git reset et git reflog. Je suis dans le repository test, sur master, avec plusieurs commits dans l'historique. Préparons quelques modifications dans coucou.html : une partie stagée (git add) et une partie modifiée dans le working directory.
Les 3 modes de git reset
La commande git reset <commit> déplace HEAD sur un commit donné. Elle propose trois variantes selon ce qu'on souhaite préserver :
--soft: le moins destructif. DéplaceHEADmais préserve la staging area et le working directory. Les modifications restent prêtes à être commitées.--mixed(défaut) : déplaceHEAD, vide la staging area, préserve le working directory. Les modifications repassent en non-stagées.--hard: le plus destructif. DéplaceHEADet écrase à la fois la staging area et le working directory. Toutes les modifications non commitées sont perdues.
git reset --soft <sha>
git reset --mixed <sha>
git reset --hard <sha>
Récupérer après un hard reset avec reflog
Après un git reset --hard, git hist ne montre plus que deux commits — il semble qu'on ait « perdu » des commits. En réalité, Git conserve un journal de toutes les opérations qui ont touché HEAD :
git reflog
Le reflog liste toutes les actions qui ont déplacé HEAD : commits, checkouts, resets, merges, etc. Chaque entrée a son propre identifiant. Pour revenir avant la réinitialisation destructrice, repérez l'identifiant juste avant l'opération reset, puis :
git reset --hard <sha-avant-reset>
git hist
Vous retrouvez l'historique complet. Conclusion : combinées, git reset et git reflog donnent un contrôle total sur les voyages dans le temps de votre repository Git — y compris la récupération après des erreurs apparemment irréversibles.
En résumé
Cette leçon explique comment naviguer dans l'historique Git grâce à la réinitialisation et reflog. Vous découvrirez les trois types de réinitialisation (soft, mixed par défaut, et hard) et leurs impacts respectifs sur votre espace de travail. Reflog offre un filet de sécurité pour retrouver n'importe quel commit, même après une réinitialisation destructrice.
Points clés
- Les trois types de reset : soft préserve tout (HEAD seul), mixed annule l'indexation mais garde les modifications, hard efface tout
- Soft reset change uniquement le pointeur HEAD sans toucher à la zone de transit ou au répertoire de travail
- Mixed reset (par défaut) change HEAD et annule l'indexation, mais préserve les modifications locales
- Hard reset change HEAD, annule l'indexation et efface toutes les modifications en attente
- git reflog affiche l'historique complet de toutes les actions effectuées sur le dépôt
- Reflog permet de récupérer n'importe quel commit antérieur même après une réinitialisation, en utilisant son identifiant
Questions fréquentes
Quelle différence entre soft, mixed et hard reset ?
Soft change seulement HEAD en gardant tout le reste. Mixed (défaut) change HEAD et désindexe les fichiers mais préserve les modifications. Hard change HEAD, désindexe et efface complètement les modifications locales.
Comment récupérer un commit après un hard reset ?
Utiliser git reflog pour afficher l'historique des actions, identifier l'identifiant du commit souhaité, puis exécuter git reset avec cet identifiant.
Quel est le type de reset par défaut ?
Le type mixed est appliqué par défaut quand on exécute git reset sans l'option --soft ou --hard.