236 votes

Comment utiliser Git Revert

Comment la git revert utilisé ?

Cette question peut sembler redondante, mais lorsque les gens la posent, la réponse est souvent : "utilisez les produits de la société". git reset conformément à Revenir à un commit par un hachage SHA dans Git ? .

Ensuite, lorsque quelqu'un demande comment utiliser git reset Les gens répondent en disant qu'il faut utiliser git revert conformément à Git - comment revenir en arrière .

Avant que vous ne vous en rendiez compte, huit personnes différentes sont apparues avec leurs propres moyens de sauver les fesses de l'OP, et tout cela vous passe au-dessus de la tête.

Essayons donc de respecter le cahier des charges et de rédiger un Guide des Nuls sur les git revert .

Scénario : vous vous êtes engagé deux fois dans le master et c'est mauvais. Vous avez poussé et d'autres personnes ont reçu vos mauvais changements.

Vous voulez l'annuler. Ce n'est pas quelque chose que vous pouvez faire vous-même dans le code, par exemple un assistant ou un gestionnaire de paquets a changé des tonnes de choses partout - vous voulez juste remettre tout cela comme c'était avant.

C'est la raison d'être du contrôle de la source. Je suis sûr que c'est facile.

D'accord, vous allez utiliser git revert mais comment ?

Et après avoir couru git revert Est-ce que vous devez faire quelque chose d'autre après ? Faut-il commiter les changements effectués par revert ou revert commute-t-il directement dans le référentiel ou quoi ?

Il est évident que vous devrez insister à nouveau et probablement annoncer votre décision à l'équipe.

226voto

AD7six Points 22679

Git revert crée un nouveau commit

git revert crée simplement un nouveau commit qui est l'opposé d'un commit existant.

Il laisse les fichiers dans le même état que si le commit qui a été annulé n'avait jamais existé. Prenons l'exemple suivant :

$ cd /tmp/example
$ git init
Initialized empty Git repository in /tmp/example/.git/
$ echo "Initial text" > README.md
$ git add README.md
$ git commit -m "initial commit"
[master (root-commit) 3f7522e] initial commit
 1 file changed, 1 insertion(+)
 create mode 100644 README.md
$ echo "bad update" > README.md 
$ git commit -am "bad update"
[master a1b9870] bad update
 1 file changed, 1 insertion(+), 1 deletion(-)

Dans cet exemple, l'historique des livraisons contient deux livraisons et la dernière est une erreur. Utiliser git revert :

$ git revert HEAD
[master 1db4eeb] Revert "bad update"
 1 file changed, 1 insertion(+), 1 deletion(-)

Il y aura 3 commits dans le journal :

$ git log --oneline
1db4eeb Revert "bad update"
a1b9870 bad update
3f7522e initial commit

Il y a donc un historique cohérent de ce qui s'est passé, mais les fichiers sont comme si la mauvaise mise à jour n'avait jamais eu lieu :

cat README.md 
Initial text

L'endroit de l'historique où se trouve le commit à annuler n'a pas d'importance (dans l'exemple ci-dessus, le dernier commit est annulé - n'importe quel commit peut être annulé).

Questions de clôture

Faut-il faire quelque chose d'autre après ?

A git revert est juste un autre commit, donc par exemple pousser vers le distant pour que d'autres utilisateurs puissent tirer/récupérer/fusionner les changements et vous avez terminé.

Doit-on valider les modifications apportées par revert ou revert les valide-t-il directement dans le repo ?

git revert est un commit - il n'y a pas d'étapes supplémentaires en supposant que l'annulation d'un seul commit est ce que vous vouliez faire.

Il est évident que vous devrez insister à nouveau et probablement l'annoncer à l'équipe.

En effet, si le remote est dans un état instable, communiquer au reste de l'équipe qu'ils ont besoin de tirer pour obtenir la correction (le commit de retournement) serait la bonne chose à faire :).

72voto

Johnny Z Points 846

Utilisez Git revert comme suit :

git revert <insert bad commit hash here>

git revert crée un nouveau commit avec les modifications qui ont été annulées. git reset efface l'historique Git au lieu de faire un nouveau commit.

Les étapes suivantes sont les mêmes que pour tout autre engagement.

59voto

nnsense Points 126

La question est assez ancienne, mais le revert continue de dérouter les gens (comme moi).

En tant que débutant, après quelques essais et erreurs (plus d'erreurs que d'essais), je suis arrivé à un point important :

  • git revert requiert l'identifiant de l'engagement vous souhaitez supprimer l'inscrire dans votre histoire

  • git reset nécessite l'engagement vous souhaitez conserver et éliminera par conséquent de l'histoire tout ce qui suivra.

En d'autres termes, si vous utilisez revert avec le premier commit id, vous vous retrouverez avec un répertoire vide et un commit supplémentaire dans l'historique, alors qu'avec reset votre répertoire sera ramené au commit initial et votre historique sera comme si le(s) dernier(s) commit(s) n'avait(aient) jamais eu lieu.

Pour être encore plus clair, avec un journal comme celui-ci :

# git log --oneline

cb76ee4 wrong
01b56c6 test
2e407ce first commit

Utilisation git revert cb76ee4 volonté par défaut ramènera vos fichiers à 01b56c6 et ajoutera un nouveau commit à votre historique :

8d4406b Revert "wrong"
cb76ee4 wrong
01b56c6 test
2e407ce first commit

git reset 01b56c6 ramènera vos fichiers à 01b56c6 et nettoiera de votre historique tout autre commit postérieur à cette date :

01b56c6 test
2e407ce first commit

Je sais qu'il s'agit des "principes de base", mais j'ai eu du mal à m'y retrouver, car je n'ai pas eu le temps d'effectuer les démarches nécessaires. revert sur le premier identifiant ("first commit"), je m'attendais à trouver mes fichiers initiaux, il m'a fallu un certain temps pour comprendre que si vous voulez récupérer vos fichiers en tant que "first commit", vous devez utiliser l'identifiant suivant.

27voto

ToxicFrog Points 2054

La raison reset et revert La raison pour laquelle les termes "version" et "version" ont tendance à revenir souvent dans les mêmes conversations est que les différents systèmes de contrôle de version les utilisent pour signifier des choses différentes.

En particulier, les personnes habituées à Subversion o Perforce qui souhaitent supprimer les modifications non validées d'un fichier, auront souvent recours à l'option revert avant de s'entendre dire qu'ils veulent en fait reset .

De même, le revert équivalent dans d'autres VCSes est souvent appelé rollback ou quelque chose de similaire - mais "rollback" peut aussi signifier "je veux complètement annuler les dernières modifications", ce qui convient à reset mais pas revert . Il y a donc beaucoup de confusion lorsque les gens savent ce qu'ils veulent faire, mais ne savent pas exactement quelle commande ils doivent utiliser pour cela.

Pour ce qui est de vos questions sur le revert...

D'accord, vous allez utiliser git revert mais comment ?

git revert first-bad-commit^..last-bad-commit

Notez que les ^ pour le premier mauvais engagement. Il s'agit d'une référence au parent de first-bad-commit car la plage d'inversion n'est pas no inclure l'engagement de départ.

Et après avoir lancé git revert, devez-vous faire quelque chose d'autre ? Doit-on commiter les changements effectués par revert ou revert commute-t-il directement dans le dépôt ou quoi ?

Par défaut, git revert vous demande un message de validation, puis valide les résultats. Il est possible de passer outre. Je cite la page de manuel :

--Éditer

Avec cette option, git revert vous permet d'éditer le message de validation avant de valider la modification. C'est l'option par défaut si vous exécutez la commande à partir d'un terminal.

--no-commit

En général, la commande crée automatiquement des livraisons avec des messages de journal de livraison indiquant les livraisons qui ont été annulées. Cette option applique les modifications nécessaires pour annuler les livraisons nommées à votre arbre de travail et à l'index, mais ne crée pas les livraisons. De plus, lorsque cette option est utilisée, votre index n'a pas besoin de correspondre au commit HEAD. Le retour en arrière est effectué par rapport à l'état initial de votre index.

Ceci est utile pour annuler l'effet de plus d'un commit sur votre index à la suite.

En particulier, par défaut, il crée un nouveau commit pour chaque commit que vous annulez. Vous pouvez utiliser revert --no-commit pour créer des modifications qui les annulent toutes sans les livrer individuellement, puis les livrer à votre guise.

4voto

jrc16 Points 41

J'ai annulé quelques commits en lançant 'git revert commit id' comme par exemple :

git revert b2cb7c248d416409f8eb42b561cbff91b0601712

Ensuite, j'ai été invité à valider le changement (comme vous le feriez en lançant 'git commit'). Mon programme de terminal par défaut est Vim J'ai donc couru :

:wq 

Enfin, j'ai poussé le changement vers le dépôt avec :

git push

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X