Comment annuler un commit Git sans perdre de modifications

GitBeginner
Pratiquer maintenant

Introduction

Git est un système de contrôle de version puissant qui permet aux développeurs de gérer efficacement leur base de code. Une tâche courante consiste à annuler des modifications. Alors que des commandes comme git reset peuvent modifier l'historique des commits, git revert offre une manière plus sûre et non destructive d'annuler des commits, en particulier dans les projets collaboratifs. Ce laboratoire vous guidera dans l'utilisation de git revert pour annuler un commit et comment utiliser ses options pour préserver vos modifications en vue d'autres modifications.

Inspection de l'historique des commits

Avant d'apporter des modifications, il est essentiel de comprendre l'état actuel de notre projet. L'environnement de laboratoire a été préconfiguré avec un dépôt Git contenant un fichier nommé story.txt et quelques commits. Inspectons l'historique des commits.

Tout d'abord, utilisez la commande git log avec l'option --oneline pour obtenir une vue compacte de l'historique des commits. Cette commande liste chaque commit sur une seule ligne, affichant le hash du commit et le message du commit.

git log --oneline

Vous devriez voir une sortie similaire à celle-ci. Notez que vos hashes de commit seront différents :

c7a3e69 (HEAD -> master) Add a second, unwanted line
a9b2d5f Add the first line to the story
f3e1c8a Initial commit: Add story.txt

Ce log montre trois commits. Le commit le plus récent, en haut, a le message "Add a second, unwanted line". Faisons comme si ce commit avait introduit une erreur que nous devons annuler.

Visualisons également le contenu actuel du fichier story.txt :

cat story.txt

La sortie sera :

Once upon a time, in a land of code.
The hero of our story was a brave developer.
Suddenly, a wild bug appeared!

Notre objectif est de supprimer la dernière ligne, "Suddenly, a wild bug appeared!", qui a été ajoutée dans notre commit le plus récent.

Utilisation de git revert pour une annulation sécurisée

La commande git revert est utilisée pour créer un nouveau commit qui annule les modifications d'un commit précédent. C'est une méthode sûre pour annuler des modifications car elle ne modifie pas l'historique du projet.

Tout d'abord, copiez le hash du commit que vous souhaitez annuler. D'après la sortie de l'étape précédente, il s'agit du commit avec le message "Add a second, unwanted line".

Exécutez maintenant la commande git revert avec ce hash.

Veuillez remplacer <your-commit-hash> par le hash réel de votre terminal.

git revert <your-commit-hash>

Après avoir exécuté cette commande, Git ouvrira votre éditeur de texte par défaut (nano) pour vous permettre de modifier le message du commit pour ce nouveau commit d'annulation. Le message par défaut est généralement suffisant.

Pour enregistrer et quitter nano :

  1. Appuyez sur Ctrl+O (Write Out) puis sur Entrée pour confirmer le nom du fichier.
  2. Appuyez sur Ctrl+X pour quitter.

Vérifions maintenant à nouveau l'historique des commits :

git log --oneline

Vous verrez un nouveau commit en haut :

e0d5f1b (HEAD -> master) Revert "Add a second, unwanted line"
c7a3e69 Add a second, unwanted line
a9b2d5f Add the first line to the story
f3e1c8a Initial commit: Add story.txt

Remarquez que le commit original "indésirable" est toujours dans l'historique, mais un nouveau commit "Revert" a été ajouté. Ce nouveau commit annule les modifications apportées par celui qui était indésirable.

Enfin, vérifiez le contenu de story.txt pour confirmer que la modification a été annulée :

cat story.txt

La sortie devrait maintenant être :

Once upon a time, in a land of code.
The hero of our story was a brave developer.

La ligne indésirable a été supprimée avec succès.

Annuler tout en conservant les modifications avec --no-commit

Parfois, vous souhaitez annuler les modifications d'un commit mais les conserver dans votre répertoire de travail pour les modifier. Par exemple, vous pourriez vouloir corriger une erreur dans le commit plutôt que de la supprimer entièrement. L'option --no-commit (ou -n) est parfaite pour cela.

Tout d'abord, réinitialisons notre dépôt à l'état précédent notre dernière annulation, afin de pouvoir essayer une approche différente. Nous utiliserons git reset pour cela. Cette commande déplace le pointeur HEAD, et --hard met à jour les fichiers de votre répertoire de travail pour qu'ils correspondent.

git reset --hard HEAD~1

Cette commande supprime le commit "Revert" que nous venons de faire. Vous pouvez le confirmer en exécutant git log --oneline.

Maintenant, annulons à nouveau le commit "indésirable", mais cette fois en utilisant l'option --no-commit. N'oubliez pas d'utiliser le hash du commit "Add a second, unwanted line".

Veuillez remplacer <your-commit-hash> par le hash réel de votre terminal.

git revert --no-commit <your-commit-hash>

Cette fois, aucun éditeur ne s'ouvre. L'annulation est préparée, mais pas encore commitée. Vérifiez le statut de votre dépôt :

git status

La sortie montrera que story.txt est prêt à être commitée (staged for commit) :

On branch master
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
	modified:   story.txt

Les modifications du commit annulé sont maintenant dans votre zone de staging. Vous pouvez maintenant les modifier. Remplaçons la ligne indésirable par une meilleure. Ouvrez story.txt avec nano :

nano story.txt

Le fichier ressemblera à ce qu'il était après l'annulation à l'étape 2. Ajoutez une nouvelle ligne, meilleure, à la fin du fichier :

And they lived happily ever after.

Enregistrez et quittez nano (Ctrl+O, Entrée, Ctrl+X).

Maintenant, ajoutez vos modifications à la zone de staging et commitez-les avec un nouveau message descriptif :

git add story.txt
git commit -m "Replace unwanted line with a proper conclusion"

Enfin, vérifiez le log et le contenu du fichier pour voir le résultat :

git log --oneline
cat story.txt

Le log montre votre nouveau commit, et story.txt contient le contenu corrigé. Vous avez réussi à annuler un commit tout en conservant et en modifiant ses changements.

Résumé

Dans ce laboratoire, vous avez appris à annuler un commit Git en toute sécurité sans perdre votre travail. Vous avez pratiqué l'inspection de l'historique des commits avec git log, l'exécution d'un git revert standard pour créer un nouveau commit qui annule les changements précédents, et l'utilisation de l'option git revert --no-commit pour annuler les changements dans votre zone de staging, vous permettant de les modifier avant de créer un nouveau commit. Ces techniques sont essentielles pour gérer l'historique de votre projet de manière propre et sûre, en particulier dans un environnement d'équipe.