Introduction
Dans le flux de travail avec Git, l'ajout et la validation (commit) de fichiers constituent des étapes cruciales. Cependant, il arrive parfois que l'on commette des erreurs : ajout du mauvais fichier, message de commit inapproprié, ou décision ultérieure de revenir sur une modification. Heureusement, Git offre des outils pour annuler ou modifier ces commits. Cet article explore en détail les différentes méthodes pour défaire un commit, en mettant l'accent sur les commandes git reset et git revert, ainsi que sur la modification du dernier message de commit.
Revenir en arrière avec git reset
La commande git reset permet de faire revenir en arrière la branche visée. Elle offre différentes options pour contrôler le niveau de retour en arrière, affectant l'historique des commits, la zone de staging (index), et le répertoire de travail.
Comportement par défaut de git reset
Par défaut, git reset déplace simplement la référence (par exemple, master) qui pointe sur le dernier commit de l'historique. C'est comme si ce commit n'avait jamais été effectué. Les modifications sont conservées dans votre répertoire de travail, mais ne sont plus suivies par Git.
Par exemple, si vous décidez que le commit restaurant hello.py n'était pas une bonne idée, git reset permettra de supprimer ce commit de l'historique. Avant ce commit, le fichier hello.py n'existait plus, il n'était donc plus suivi par Git.
Les modes de git reset
git reset accepte différents modes, qui déterminent comment le répertoire de travail et la zone de staging sont affectés :
Lire aussi: Tout savoir sur la pilule du lendemain
--mixed(par défaut) : Permet de revenir en arrière jusqu'au<commit>, réinitialise la zone de staging tout en laissant votre dossier de travail en l'état. L'historique sera perdu (les commits suivants<commit>seront perdus, mais pas vos modifications).Comment se passent les choses si j’effectue un reset en mode mixed ? Le fichier Cartes.md a également été envoyé au paradis des octets.--hard: Permet de revenir au<commit>et réinitialise la zone de staging et le dossier de travail pour correspondre. Toutes les modifications, ainsi que tous les commits fait après le<commit>seront supprimées. C'est le mode le plus destructeur, car il efface les modifications non commitées. Le mode--harddegit resetpermet d'aller plus loin dans le retour en arrière, en combinant legit resetavec une synchronisation du répertoire de travail (comme le faitgit checkout).--soft: Ce mode est le moins destructeur. Il déplace simplement la référence au commit spécifié, sans toucher à la zone de staging ni au répertoire de travail. Les modifications qui étaient dans le commit annulé se retrouvent dans la zone de staging, prêtes à être commitées à nouveau.
Supprimer plusieurs commits
git reset permet aussi de supprimer plusieurs commits. Pour supprimer les 'n' derniers commits, il suffit de suffixer le caractère '^' n fois à la référence 'HEAD'. Par exemple, git reset HEAD^^ supprimera les deux derniers commits.
Précautions d'utilisation
La commande reset ne devra jamais être utilisée après avoir publié (push) vos modifications. En effet, elle modifie l'historique des commits, ce qui peut poser des problèmes de synchronisation avec les autres collaborateurs.
Inverser un commit avec git revert
Il existe une autre façon de revenir sur ses pas et détricoter ce qu’on vient de faire, c’est la commande git revert. Revert permet d'inverser un commit. Cette commande va défaire ce qui avait été fait au moment du <commit> en créant un nouveau commit. Au lieu de supprimer le commit original, git revert crée un nouveau commit qui annule les modifications introduites par le commit ciblé. Cela préserve l'historique des commits, ce qui est important lorsque l'on travaille en collaboration.
Là encore, un exemple pratique vous permettra de mieux comprendre.
git checkout : Explorer l'historique
git checkout <commit_id> est une commande utilisée très régulièrement lorsque l’on travaille avec des branches, comme vous le verrez bientôt. Transforme tous les fichiers pour reproduire l'état du <commit>. Cette commande nous place dans un état particulier appellé detached HEAD. En résumé vous êtes revenu en arrière en tant que spectateur. Vous pouvez voir le projet tel qu'il était au moment du commit tout en ayant la possibilité de revenir dans le "présent".Cette commande ne modifie pas l'historique enregistré dans le dépôt (la référence master n'est pas modifiée).
Lire aussi: Allaiter après un mois
Choisir entre reset et revert
Vous voilà donc confronté à un choix : utiliser reset ou revert ? Le choix entre git reset et git revert dépend de la situation et de vos objectifs :
- Utilisez
git resetsi vous travaillez seul sur une branche locale et que vous souhaitez supprimer des commits récents qui n'ont pas été partagés avec d'autres. - Utilisez
git revertsi vous travaillez en collaboration ou si vous souhaitez conserver l'historique des commits intact.git revertest également préférable si le commit que vous souhaitez annuler est ancien et a déjà été partagé.
Modifier le dernier message de commit
Il peut arriver que l’on effectue un commit avec un message pas assez explicite ou autrement inapproprié. Et après coup on se dit qu’on aurait pu faire mieux. Admettons que j’aurais préféré écrire « Ajout d’une étape ».
Pour modifier le message du dernier commit, vous pouvez utiliser la commande suivante :
git commit --amend -m "Nouveau message"Gardez à l’esprit que cette fonctionnalité est limitée au dernier commit en cours.
Lire aussi: Tomber enceinte en prenant la pilule : les risques
tags: #annuler #un #commit #git
