Réparer
reflog, les trois reset, revert, restore, stash — presque rien n'est perdu.
Presque toutes les erreurs Git sont réversibles, parce que les commits ne sont pas supprimés quand plus rien ne les désigne. Encore faut-il savoir les retrouver.
reflog : le journal des pointeurs
$ git reflog
7f3k9q2 HEAD@{0}: reset: moving to HEAD~3
a91b4de HEAD@{1}: commit: Ajoute la correction serveur
3c0f81a HEAD@{2}: commit: Charge les quizgit log montre l'historique joignable. reflog montre où HEAD est passé,
y compris ce qui n'est plus désigné par aucune branche. Après un reset malheureux
ou une branche supprimée, c'est là qu'on retrouve l'empreinte perdue — et
git branch sauvetage a91b4de la remet au jour.
Le reflog est local et expire après quelques semaines. Il ne protège que toi, et pas indéfiniment.
Les trois reset
Tous les trois déplacent la branche courante. Ils diffèrent par ce qu'ils touchent en plus.
| Branche | Index | Répertoire de travail | |
|---|---|---|---|
--soft | déplacée | inchangé | inchangé |
--mixed (défaut) | déplacée | réinitialisé | inchangé |
--hard | déplacée | réinitialisé | écrasé |
--soft est l'outil pour refaire un commit autrement : le travail reste prêt
dans l'index. --mixed le renvoie dans le répertoire de travail. --hard est le
seul qui détruise du travail non commité — et cela, le reflog ne le rattrape
pas, puisqu'il n'a jamais été enregistré.
revert : annuler sans réécrire
git revert a91b4derevert crée un nouveau commit qui applique l'inverse du commit visé.
L'historique n'est pas réécrit : rien ne disparaît, on ajoute une annulation.
C'est la seule façon correcte d'annuler quelque chose de déjà partagé. Un reset
sur une branche publique enfreint la règle d'or ; revert est visible, traçable,
et ne casse le dépôt de personne.
restore et stash
git restore fichier.txt # ré-extrait depuis l'index
git restore --staged fichier.txt # retire de l'index, garde les modifications
git stash # met de côté, nettoie le répertoire
git stash pop # remetstash sert quand il faut basculer de branche au milieu d'un travail non
commité. Prudence : les fichiers non suivis ne sont pas remisés par défaut —
il faut -u.
La seule vraie perte
Ce qui n'a jamais été ni commité ni ajouté à l'index n'existe nulle part :
aucun objet, aucune entrée de reflog. git reset --hard et git checkout d'un
fichier modifié l'effacent définitivement. Avant toute manipulation
hasardeuse, un git stash -u coûte une seconde et rend l'opération réversible.
Le piège classique
git reset sans argument de portée fait un --mixed, ce qui vide l'index et
donne l'impression que le travail a disparu — alors qu'il est intact dans le
répertoire de travail. Un git status suffit à le constater. Se précipiter sur
--hard « pour nettoyer » est précisément ce qui transforme une frayeur en perte
réelle.
Réponse unique
Quelle variante de `reset` est la seule à détruire du travail non commité ?
Indice · Lequel touche les fichiers sur le disque ?
[ METTRE EN PRATIQUE ]
Tout casser, tout retrouver
3 étapes · 30 min · 130 XP
[ CETTE LEÇON DANS LES PARCOURS ]
- Fondamentauxétape 7 / 18suivant — Hygiène d'un dépôt →