Une erreur dans un commit déjà envoyé
Annuler une erreur avec Git, c’est revenir à un état connu : un fichier, un commit ou une branche. Plusieurs commandes le permettent, mais certaines détruisent du travail et d’autres n’en détruisent aucun.
Une personne ajoute par erreur une ligne dans le registre de l’association, puis la pousse. Tout dépend d’où en est l’erreur : dans le fichier, dans l’index, dans un commit local ou dans un commit partagé.
À la fin de cette leçon
Remarque
Je peux annuler une erreur sans perdre de travail.
Mots-clés
| Mot | Ce que ça veut dire | Exemple |
|---|---|---|
| Restore | remettre un fichier comme dans le dernier commit | git restore |
| Revert | ajouter un commit qui défait un commit précédent | git revert |
| Reset | déplacer le nom de la branche vers un autre commit | git reset |
| Reflog | le journal des endroits où HEAD est passé | git reflog |
| Commit partagé | un commit déjà poussé vers le serveur | |
| Travail non enregistré | des changements qui ne sont dans aucun commit |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
restore remet un fichier dans son état enregistré
Tant que vous n’avez pas fait de commit, git restore fichier remet le fichier comme dans le dernier commit. Attention : les changements que vous aviez écrits disparaissent pour de bon, car aucun commit ne les garde.
git restore --staged fichier fait autre chose : il retire le fichier de l’index, mais garde vos changements dans le dossier.
Créer le dépôt dans le dossier registre
git init -b main registreAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Écrire la première note
printf 'depot de cles\n' > registre/notes.txtAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Choisir le fichier pour le commit
git -C registre add notes.txtAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Enregistrer la première note
git -C registre commit -m "Premiere note"Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Ajouter une ligne par erreur
printf 'erreur\n' >> registre/notes.txtAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Voir le fichier modifié
git -C registre status --shortAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Remettre le fichier comme au dernier commit
git -C registre restore notes.txtAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Relire le fichier
cat registre/notes.txtAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
revert défait un commit en ajoutant un commit
Quand l’erreur est déjà dans un commit partagé, on n’efface pas l’historique : d’autres l’ont peut-être déjà reçu. git revert ajoute un nouveau commit qui fait l’inverse du commit fautif.
L’historique garde tout : l’erreur, puis sa correction. Personne n’a de conflit en tirant.
Ajouter une ligne fautive
printf 'faute\n' >> registre/notes.txtAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Enregistrer la faute dans un commit
git -C registre commit -am "Ajout par erreur"Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Défaire ce commit par un nouveau commit
git -C registre revert --no-edit HEADAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Lire l’historique, récent d’abord
git -C registre --no-pager log --format=%sAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
reset déplace une branche, reflog retrouve le passé
git reset déplace le nom de la branche vers un autre commit. Avec --soft, vos changements restent dans l’index. Avec --hard, ils sont effacés du dossier : c’est la forme dangereuse. Ne l’utilisez jamais sur un commit déjà poussé.
git reflog liste les endroits où HEAD est passé. Après un mauvais reset, le commit perdu y reste visible quelque temps. Ici, ces deux commandes sont dites en mots, pas lancées.
Exemple : la sortie de git reflog
966e4fb HEAD@{0}: revert: Revert "Ajout par erreur"
9002311 HEAD@{1}: commit: Ajout par erreur
49acd93 HEAD@{2}: commit (initial): Premiere noteExemple travaillé : quel retour choisir ?
| Où est l’erreur | Commande sûre | Perd-on du travail ? |
|---|---|---|
| Fichier modifié, pas dans l’index | git restore fichier | Oui, les changements du fichier |
| Fichier dans l’index, pas de commit | git restore --staged fichier | Non |
| Commit local, pas poussé | git reset --soft HEAD~1 | Non, les changements restent dans l’index |
| Commit déjà poussé | git revert commit | Non |
| Branche déplacée par erreur | git reflog, puis git switch -c sauvetage hash | Non, si on agit à temps |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Une erreur fréquente
Attention
On croit souvent que git reset --hard est la façon normale d’annuler. Ce n’est pas vrai : elle efface vos changements non enregistrés, sans corbeille. Sur un commit déjà poussé, elle réécrit ce que les autres ont reçu. Préférez restore pour un fichier et revert pour un commit partagé.