Plus facile à lire avec un fond crème, une teinte, plus de contraste ou un texte plus grand ? Choisissez vos couleurs et votre texte, une fois pour toutes les pages.

Leçon gratuite

Annuler une erreur Git sans perdre son travail

Après cette leçon: Je peux annuler une erreur sans perdre de travail.

Leçon de 60 min12 commandesLab Git et Gitea : apprendre clone, commit et push sur un serveur Git à soi

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

MotCe que ça veut direExemple
Restoreremettre un fichier comme dans le dernier commitgit restore
Revertajouter un commit qui défait un commit précédentgit revert
Resetdéplacer le nom de la branche vers un autre commitgit reset
Reflogle 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

Commande
git init -b main registre

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.

Écrire la première note

Commande
printf 'depot de cles\n' > registre/notes.txt

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.

Choisir le fichier pour le commit

Commande
git -C registre add notes.txt

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.

Enregistrer la première note

Commande
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

Commande
printf 'erreur\n' >> registre/notes.txt

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.

Voir le fichier modifié

Commande
git -C registre status --short

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.

Remettre le fichier comme au dernier commit

Commande
git -C registre restore notes.txt

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.

Relire le fichier

Commande
cat registre/notes.txt

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.

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

Commande
printf 'faute\n' >> registre/notes.txt

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.

Enregistrer la faute dans un commit

Commande
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

Commande
git -C registre revert --no-edit HEAD

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.

Lire l’historique, récent d’abord

Commande
git -C registre --no-pager log --format=%s

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.

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

Code: bash
966e4fb HEAD@{0}: revert: Revert "Ajout par erreur"
9002311 HEAD@{1}: commit: Ajout par erreur
49acd93 HEAD@{2}: commit (initial): Premiere note

Exemple travaillé : quel retour choisir ?

Où est l’erreurCommande sûrePerd-on du travail ?
Fichier modifié, pas dans l’indexgit restore fichierOui, les changements du fichier
Fichier dans l’index, pas de commitgit restore --staged fichierNon
Commit local, pas pousségit reset --soft HEAD~1Non, les changements restent dans l’index
Commit déjà pousségit revert commitNon
Branche déplacée par erreurgit reflog, puis git switch -c sauvetage hashNon, 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é.

À propos de ce labo et de sa source: Lab Git et Gitea : apprendre clone, commit et push sur un serveur Git à soi

Vous enseignez à une classe ? Proposez ce module à vos étudiants avec un guide de l'enseignant, des devoirs corrigés et un laboratoire pour chaque étudiant.