git revert – Tutoriel sur l'annulation de changements dans Git

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.

git revert – Tutoriel Git d'Atlassian

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 revert prend le commit spécifié, inverse les changements du commit, puis crée un nouveau « commit revert ». Les pointeurs de réf sont ensuite mis à jour pour pointer vers le nouveau commit 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"
[master (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"
[master 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"
[master 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

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
[master 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. Ici, 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 nouveau 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 avec git log et voir qu'un nouveau commit a été ajouté au log 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

La transmission de cette option empêchera git revert de créer un nouveau commit inversant le commit cible. Au lieu de créer le nouveau 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 rapports

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.

git revert et git reset – Tutoriels Git d'Atlassian

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, reportez-vous à 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 avec 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 élégante. Pour une discussion plus approfondie sur les différences entre git revert et d'autres commandes « d'annulation », reportez-vous à Reset, checkout et revert.  

Summary

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.

Ready to learn git revert?

Essayez ce tutoriel interactif.

Démarrez maintenant