Secourir son code et réparer ses erreurs
Prérequis
- Maîtriser les commits, branches et fusions (Ateliers 04-06)
- Savoir faire git status, git log, git diff
- Avoir déjà poussé sur GitHub (Atelier 07)
Objectifs d'apprentissage
- Annuler des modifications locales (Working Directory & Staging) avec git restore
- Choisir entre revert, reset --soft/mixed/hard et comprendre leur danger
- Mettre de côté avec stash (push/pop, --include-untracked) et nettoyer avec clean
- Sauver un commit perdu avec reflog, cherry-pick et bisect
Les 4 zones d’erreurs dans Git
Section titled “Les 4 zones d’erreurs dans Git”Chaque erreur vit dans une zone — chaque zone a son antidote :
| Zone | État du fichier | Commande | Impact | Historique partagé ? |
|---|---|---|---|---|
| Working Directory | Modifié, non indexé | git restore <file> |
Écrase le local | ✅ Sûr |
| Staging Area | Indexé | git restore --staged <file> |
Retire de l’index | ✅ Sûr |
| Local Repository | Commité (pas poussé) | git reset |
Recule HEAD | ✅ Sûr si pas poussé |
| Distant | Commité & poussé | git revert |
Nouveau commit inverse | ✅ Seul sûr après push |
1. Annuler en local (Working & Staging)
Section titled “1. Annuler en local (Working & Staging)”Abandonner une modification locale
Section titled “Abandonner une modification locale”git restore index.html# ou legacy :git checkout -- index.htmlDésindexer
Section titled “Désindexer”git restore --staged index.html# équivalent :git reset HEAD index.htmlLe fichier repasse en modified mais reste sur disque.
Commandes à exécuter
2. revert vs reset — choisir le bon outil
Section titled “2. revert vs reset — choisir le bon outil”revert — pour l’historique partagé (pushé)
Section titled “revert — pour l’historique partagé (pushé)”Crée un nouveau commit qui inverse le précédent — ne réécrit pas l’historique :
git log --oneline# a1b2c3 feat: add notifications (à annuler)# b0c9d8 fix: typo
git revert a1b2c3# → commit "Revert feat: add notifications"À utiliser si a1b2c3 est déjà sur origin/main.
reset — pour l’historique local (pas poussé)
Section titled “reset — pour l’historique local (pas poussé)”Recule HEAD. 3 modes :
git reset --soft HEAD~1 # annule commit, garde indexgit reset --mixed HEAD~1 # défaut : garde Working, vide indexgit reset --hard HEAD~1 # tout jettegit reset --hard a1b2c3 # vers un hash| Mode | Commit | Index | Working | Cas |
|---|---|---|---|---|
soft |
Reculé | Gardé | Gardé | Reformuler message, squasher |
mixed |
Reculé | Vidé | Gardé | Refaire add proprement |
hard |
Reculé | Vidé | Jeté | Annuler tout, danger |
Commandes à exécuter
Commandes à exécuter
3. Mettre de côté : stash & nettoyer : clean
Section titled “3. Mettre de côté : stash & nettoyer : clean”stash — pile temporaire
Section titled “stash — pile temporaire”Idéal pour changer de branche vite sans committer :
git stash push -m "wip: login form"git stash list# stash@{0}: wip: login formgit stash pop # applique + supprimegit stash apply # applique sans supprimergit stash drop stash@{0}git stash clearAvec untracked :
git stash push --include-untracked -m "avec nouveaux fichiers"git stash push --staged -m "seulement l'index" # Git ≥ 2.35 : stash UNIQUEMENT ce qui est stagégit stash push --keep-index -m "tout sauf l'index" # stache TOUT mais garde l'index intact dans le working treeclean — effacer les non-suivis
Section titled “clean — effacer les non-suivis”git clean -n # dry-run : que va-t-il effacer ?git clean -f # efface fichiers non suivisgit clean -fd # + dossiersgit clean -fdx # + ignorés par .gitignore (danger)Commandes à exécuter
4. La bouée ultime : git reflog
Section titled “4. La bouée ultime : git reflog”reset --hard a mangé un commit ? Branche supprimée ? reflog vous sauve — 90 jours par défaut avant garbage collection (30 jours pour les commits orphelins).
git reflog# a1b2c3 HEAD@{0}: reset: moving to HEAD~1# e4f5a6b HEAD@{1}: commit: feat: add notifications# c7d8e9f HEAD@{2}: commit: fix: oauthRestaurer :
git reset --hard HEAD@{1}# ougit reset --hard e4f5a6bgit log --oneline -3Voir le reflog d’une branche :
git reflog show maingit log -g --oneline # parcourt le reflogCommandes à exécuter
5. Cherry-pick & Bisect — au-delà
Section titled “5. Cherry-pick & Bisect — au-delà”cherry-pick — prendre un commit ailleurs
Section titled “cherry-pick — prendre un commit ailleurs”git switch maingit cherry-pick e4f5a6b# applique e4f5a6b sur maingit cherry-pick --abort # en cas de conflitbisect — chasser le bug
Section titled “bisect — chasser le bug”Git coupe l’historique en binaire pour trouver le commit coupable :
git bisect startgit bisect bad # commit actuel buguégit bisect good a1b2c3 # commit ancien OK# → Git checkout un milieu, testez, puis :git bisect good # ou bad# → répète jusqu'à trouvergit bisect resetFiches de révision
Section titled “Fiches de révision”Quelle commande annule un fichier non indexé ?
Cliquer pour révéler la réponsegit restore <file> (ou checkout --)
Cliquer pour voir la questionComment déstager sans perdre le fichier ?
Cliquer pour révéler la réponsegit restore --staged <file> ou git reset HEAD <file>
Cliquer pour voir la questionrevert vs reset ?
Cliquer pour révéler la réponserevert = nouveau commit inverse (sûr si pushé). reset = recule HEAD (seulement si pas pushé).
Cliquer pour voir la question3 modes reset ?
Cliquer pour révéler la réponse--soft (garde index), --mixed (garde Working), --hard (tout jette).
Cliquer pour voir la questionÀ quoi sert stash ?
Cliquer pour révéler la réponseMettre de côté le Working + index temporairement sans committer (pop/apply).
Cliquer pour voir la questionQue fait clean -fd ?
Cliquer pour révéler la réponseEfface fichiers/dossiers non suivis (non indexés).
Cliquer pour voir la questionComment sauver un commit après reset --hard ?
Cliquer pour révéler la réponsegit reflog → repérer HEAD@{n} → git reset --hard HEAD@{n}.
Cliquer pour voir la questioncherry-pick et bisect ?
Cliquer pour révéler la réponsecherry-pick = appliquer un commit précis. bisect = recherche binaire du commit bugué.
Cliquer pour voir la questionQuiz de validation
Section titled “Quiz de validation”1. Quelle commande déstage sans perdre le fichier ?
2. Quel reset détruit Working ?
3. Quelle commande restaure et vide la pile stash ?
4. Commit pushé à annuler → que faire ?
Cheat Sheet
Section titled “Cheat Sheet”# Localgit restore <file>git restore --staged <file>git clean -n; git clean -fd
# Revert vs Resetgit revert <hash> --no-editgit reset --soft HEAD~1git reset --mixed HEAD~1git reset --hard HEAD~1
# Stashgit stash push -m "wip" --include-untrackedgit stash list; git stash pop; git stash apply; git stash drop
# Refloggit reflog; git reflog --oneline -10git reset --hard HEAD@{1}git reset --hard <hash>
# Avancégit cherry-pick <hash>git cherry-pick --abortgit bisect start; git bisect bad; git bisect good <hash>; git bisect resetMini Challenge
Section titled “Mini Challenge”Carte mentale
Section titled “Carte mentale”Prochaine étape
Section titled “Prochaine étape”Vous savez réparer. Passons à l’open source : Fork, gh CLI, gouvernance et sécurité.