Git revert
La commande git revert
peut être considérée comme une commande de type « undo », mais il ne s'agit pas d'une opération d'annulation classique. Au lieu de supprimer le commit de l'historique du projet, elle détermine comment annuler les changements introduits par le commit et ajoute un nouveau commit avec le contenu ainsi obtenu. Ainsi, Git ne perd pas l'historique, lequel est important pour l'intégrité de votre historique de révision et pour une collaboration fiable.
L'opération de revert ne doit être utilisée que lorsque vous souhaitez appliquer l'inverse d'un commit à partir de votre historique de projet. Cela peut être utile, par exemple, si vous suivez un bug et que vous découvrez qu'il a été introduit par un commit unique. Au lieu d'accéder manuellement à un nouvel instantané, de le corriger et de le commiter, vous pouvez utiliser git revert
qui le fera automatiquement pour vous.
Fonctionnement
La commande git revert
est utilisée pour annuler des changements apportés à l'historique de commits d'un dépôt. D'autres commandes « d'annulation », comme git checkout et git reset, déplacent les pointeurs de réf HEAD
et les branches vers un commit spécifié. git revert
prend également un commit spécifié. Toutefois, git revert
ne déplace pas les pointeurs de réf vers ce commit. Une opération de revert prend le commit spécifié, inverse les changements introduits par le commit, puis crée un « commit de revert ». Les pointeurs de réf sont ensuite mis à jour pour pointer vers le nouveau commit de revert constituant la pointe de la branche.
Pour illustrer ceci, créons un exemple de dépôt à l'aide des lignes de commande ci-dessous :
$ mkdir git_revert_test
$ cd git_revert_test/
$ git init .
Initialized empty Git repository in /git_revert_test/.git/
$ touch demo_file
$ git add demo_file
$ git commit -am"initial commit"
[main (root-commit) 299b15f] initial commit
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 demo_file
$ echo "initial content" >> demo_file
$ git commit -am"add new content to demo file"
[main 3602d88] add new content to demo file
n 1 file changed, 1 insertion(+)
$ echo "prepended line content" >> demo_file
$ git commit -am"prepend content to demo file"
[main 86bb32e] prepend content to demo file
1 file changed, 1 insertion(+)
$ git log --oneline
86bb32e prepend content to demo file
3602d88 add new content to demo file
299b15f initial commit
Ressource connexe
Fiche de révision sur Git
DÉCOUVRIR LA SOLUTION
Découvrir Git avec Bitbucket Cloud
Nous avons initialisé un dépôt dans un répertoire nouvellement créé appelé git_revert_test
. Nous avons fait trois commits dans le dépôt dans lequel nous avons ajouté un fichier demo_file
et modifié son contenu à deux reprises. À la fin de la procédure de configuration du dépôt, nous appelons git log
pour consulter l'historique du commit, affichant un total de trois commits. Lorsque le dépôt est à cet état, nous sommes prêts à initier git revert
.
$ git revert HEAD
[main b9cd081] Revert "prepend content to demo file" 1 file changed, 1 deletion(-)
La commande git revert
attend la transmission d'une réf de commit et ne s'exécutera pas sans. Dans cet exemple, nous avons transmis la réf HEAD
; le dernier commit est restauré. Il s'agit du même comportement que si nous restaurions le commit 3602d8815dbfa78cd37cd4d189552764b5e96c58
. À l'instar d'un merge, une restauration (revert) crée un commit qui ouvre l'éditeur du système configuré et demande un nouveau message de commit. Git reprend ses opérations lorsqu'un message de commit a été saisi et enregistré. Nous pouvons à présent examiner l'état du dépôt grâce à git log
et voir qu'un nouveau commit a été ajouté au journal précédent :
$ git log --oneline 1061e79 Revert "prepend content to demo file" 86bb32e prepend content to demo file 3602d88 add new content to demo file 299b15f initial commit
Notez que le troisième commit se trouve toujours dans l'historique du projet après le revert. Au lieu de le supprimer, git revert
a ajouté un nouveau commit pour annuler les changements. Par conséquent, les 2e et 4e commits représentent exactement la même base de code, et le 3e commit est toujours dans notre historique juste au cas où nous voudrions revenir en arrière en cours de route.
Options communes
-e
--edit
Il s'agit d'une option par défaut qui ne doit pas être spécifiée. Cette option ouvrira l'éditeur du système configuré et vous invitera à éditer le message de commit avant de commiter le revert.
--no-edit
Il s'agit de l'inverse de l'option -e
. Le revert n'ouvrira pas l'éditeur.
-n
--no-commit
En transmettant cette option, vous empêchez git revert
de créer un commit inversant le commit cible. Au lieu de créer le commit, cette option ajoutera les changements inverses à l'index de staging et au répertoire de travail. Voici les autres arborescences que Git utilise pour gérer l'état du dépôt. Pour en savoir plus, consultez la page git reset.
Reset et revert
Il est essentiel de comprendre que la commande git revert
annule un commit unique. Elle ne permet pas de « revenir » à l'état précédent d'un projet en supprimant tous les commits suivants. Dans Git, cette commande est nommée reset, et non revert.
La commande revert présente deux avantages par rapport à la commande reset. D'abord, elle ne change pas l'historique du projet, ce qui en fait une opération « sûre » pour les commits déjà publiés dans un dépôt partagé. Pour en savoir plus sur les raisons pour lesquelles l'altération de l'historique est dangereuse, consultez la page git reset.
Ensuite, git revert
peut cibler un commit individuel à un point arbitraire de l'historique, tandis que git reset
permet seulement de revenir en arrière à partir du commit actuel. Par exemple, si vous souhaitez annuler un ancien commit grâce à git reset
, vous devez supprimer tous les commits postérieurs au commit cible, le supprimer, puis commiter à nouveau tous les commits ultérieurs. Inutile de dire que cette solution d'annulation n'est pas très raffinée. Pour une discussion plus approfondie sur les différences entre git revert
et d'autres commandes « d'annulation », consultez la page dédiée aux commandes reset, check-out et revert.
Résumé
La commande git revert
est une opération d'annulation vers l'avant qui fournit un moyen sûr d'annuler les changements. Au lieu de supprimer des commits ou les rendre orphelins dans l'historique des commits, un revert créera un nouveau commit qui inverse les changements spécifiés. Git revert
est plus sûre que git reset
pour éviter les pertes de travail. Pour démontrer les effets de git revert
, nous avons exploité d'autres commandes qui présentent une documentation plus détaillée sur leurs pages : git log, git commit et git reset.
Partager cet article
Thème suivant
Lectures recommandées
Ajoutez ces ressources à vos favoris pour en savoir plus sur les types d'équipes DevOps, ou pour les mises à jour continues de DevOps chez Atlassian.