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

The git revert command is used for undoing changes to a repository's commit history. Other 'undo' commands like, git checkout and git reset, move the HEAD and branch ref pointers to a specified commit. Git revert also takes a specified commit, however, git revert does not move ref pointers to this commit. A revert operation will take the specified commit, inverse the changes from that commit, and create a new "revert commit". The ref pointers are then updated to point at the new revert commit making it the tip of the branch.

To demonstrate let’s create an example repo using the command line examples below:

$ 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(-)

Git revert expects a commit ref was passed in and will not execute without one. Here we have passed in the HEAD ref. This will revert the latest commit. This is the same behavior as if we reverted to commit 3602d8815dbfa78cd37cd4d189552764b5e96c58. Similar to a merge, a revert will create a new commit which will open up the configured system editor prompting for a new commit message. Once a commit message has been entered and saved Git will resume operation. We can now examine the state of the repo using git log and see that there is a new commit added to the previous log:

$ 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 .

Resetting vs. reverting

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