Secourir son code et réparer ses erreurs
Les 3 zones d’erreurs dans Git
Section titled “Les 3 zones d’erreurs dans Git”Dans le cycle de développement Git, les erreurs peuvent survenir à différentes étapes. Selon la zone dans laquelle se trouve votre code modifié ou erroné, la stratégie d’annulation change.
| Zone de travail | État du fichier | Commande d’annulation | Impact |
|---|---|---|---|
| Working Directory | Modifié, non indexé | git restore <file> | Écrase les modifications locales non sauvegardées. |
| Staging Area | Indexé, prêt à être validé | git restore --staged <file> | Retire le fichier de l’index mais conserve les modifications. |
| Local Repository | Commité dans l’historique | git reset (soft / mixed / hard) | Recule le pointeur de branche (HEAD). |
1. Annuler en local (Working Directory & Staging Area)
Section titled “1. Annuler en local (Working Directory & Staging Area)”Abandonner des modifications locales (Working Directory)
Section titled “Abandonner des modifications locales (Working Directory)”Si vous avez modifié un fichier (par exemple index.html) et que vos modifications ne conviennent pas, vous pouvez restaurer le fichier dans l’état exact du dernier commit :
git restore index.htmlAttention
Cette commande est destructrice. Toutes les modifications locales non commités dans ce fichier seront définitivement perdues.
Désindexer un fichier (Staging Area)
Section titled “Désindexer un fichier (Staging Area)”Si vous avez ajouté un fichier à l’index avec git add index.html par erreur, vous pouvez le retirer de la Staging Area sans perdre vos modifications :
git restore --staged index.htmlLe fichier retournera à l’état “Modifié mais non indexé”.
Exercice Pratique : Restaurer et désindexer
Section titled “Exercice Pratique : Restaurer et désindexer”Suivez les instructions du simulateur pour vous exercer à manipuler la Staging Area et le Working Directory :
Commandes à exécuter
2. Annuler des commits (git reset)
Section titled “2. Annuler des commits (git reset)”Lorsque le commit est créé localement, git reset permet de revenir en arrière dans le temps. Il existe trois modes de reset principaux.
graph TD
A[Dernier Commit] -->|git reset| B{Choix du mode}
B -->|--soft| C[Conserve dans la Staging Area]
B -->|--mixed| D[Conserve dans le Working Directory]
B -->|--hard| E[Détruit toutes les modifications]
Git Reset Soft
Section titled “Git Reset Soft”Permet d’annuler le dernier commit tout en conservant vos modifications dans la Staging Area (indexées et prêtes à être à nouveau commitées). Très utile pour reformuler un message de commit ou regrouper des modifications.
git reset --soft HEAD~1Git Reset Mixed (Option par défaut)
Section titled “Git Reset Mixed (Option par défaut)”Annule le dernier commit et retire les fichiers de la Staging Area, mais conserve les modifications dans votre Working Directory (fichiers modifiés mais non indexés).
git reset --mixed HEAD~1Git Reset Hard (Destructeur)
Section titled “Git Reset Hard (Destructeur)”Annule le dernier commit, vide la Staging Area et supprime définitivement toutes les modifications de votre Working Directory. Le projet revient à l’état strict du commit ciblé.
git reset --hard HEAD~13. Mettre de côté temporairement (git stash)
Section titled “3. Mettre de côté temporairement (git stash)”Vous travaillez sur une nouvelle fonctionnalité dans la branche feature-login, mais un bug critique survient sur main. Vous devez changer de branche en urgence, mais vos modifications actuelles ne sont pas assez stables pour faire l’objet d’un commit.
git stash vous permet de mettre vos modifications de côté dans une pile temporaire, nettoyant ainsi votre espace de travail.
Sauvegarder les modifications en attente
Section titled “Sauvegarder les modifications en attente”git stash(Vous pouvez maintenant changer de branche avec git switch main en toute sécurité)
Lister les sauvegardes temporaires
Section titled “Lister les sauvegardes temporaires”git stash listRestaurer les modifications et vider la pile
Section titled “Restaurer les modifications et vider la pile”Une fois le bug corrigé, revenez sur votre branche de travail et récupérez vos modifications :
git stash pop(Restaure le dernier élément de la pile de stash et le supprime de la liste)
4. La bouée de sauvetage ultime : git reflog
Section titled “4. La bouée de sauvetage ultime : git reflog”Avez-vous fait un git reset --hard par erreur ? Supprimé une branche contenant des commits précieux ?
Pas de panique ! Git n’efface jamais immédiatement les commits orphelins. Ils restent stockés dans la base de données locale pendant environ 30 jours avant d’être nettoyés. La commande git reflog enregistre tous les mouvements de la tête d’écriture (HEAD), y compris les resets et les switchs de branches.
Étape 1 : Consulter le journal d’activité de HEAD
Section titled “Étape 1 : Consulter le journal d’activité de HEAD”git reflogVous obtiendrez un historique semblable à celui-ci :
a1b2c3d HEAD@{0}: reset: moving to HEAD~1e4f5g6h HEAD@{1}: commit: feat: add notifications supportj7k8l9m HEAD@{2}: commit: fix: resolve oauth login loopÉtape 2 : Restaurer l’état perdu
Section titled “Étape 2 : Restaurer l’état perdu”Pour récupérer le commit de notifications annulé par le reset, utilisez l’index du reflog associé :
git reset --hard HEAD@{1}Et voilà ! Votre commit est restauré comme par magie.
Fiches de révision
Section titled “Fiches de révision”Quelle commande annule les modifications locales d'un fichier non indexé ?
Cliquer pour révéler la réponsegit restore <fichier>
Cliquer pour voir la questionQuelle est la différence entre git reset --soft et --hard ?
Cliquer pour révéler la réponse--soft annule le commit mais garde les fichiers modifiés et indexés. --hard annule le commit et détruit définitivement toutes les modifications.
Cliquer pour voir la questionÀ quoi sert git stash ?
Cliquer pour révéler la réponseÀ mettre temporairement de côté les modifications en cours pour retrouver un répertoire de travail propre sans créer de commit.
Cliquer pour voir la questionComment récupérer un commit supprimé par erreur avec git reset --hard ?
Cliquer pour révéler la réponseLancer git reflog pour repérer l'identifiant du commit, puis exécuter git reset --hard HEAD@{index}.
Cliquer pour voir la questionQuiz de validation
Section titled “Quiz de validation”1. Quelle commande permet de désindexer un fichier 'main.js' sans perdre ses modifications ?
2. Quel type de reset détruit définitivement les modifications du Working Directory ?
3. Quelle commande restaure les modifications stasheades et les retire de la pile ?
Prochaine étape
Section titled “Prochaine étape”Vous savez maintenant faire face aux erreurs locales et restaurer votre historique. Découvrons à présent comment collaborer sur des projets open source de grande envergure avec le workflow de Fork.