Quelle est la différence entre git Revert, Checkout et Reset?

J'essaie d'apprendre à restaurer ou à restaurer des fichiers et des projets à un état antérieur, et je ne comprends pas la différence entre git revert, checkout, et reset. Pourquoi y a-t-il 3 commandes différentes pour apparemment le même but, et quand quelqu'un devrait-il choisir l'une sur l'autre?

181
demandé sur ROMANIA_engineer 2011-12-02 17:37:48

6 réponses

Ces trois commandes ont des objectifs entièrement différents. Ils ne sont même pas similaires à distance.

git revert

Cette commande crée un nouveau commit qui annule les modifications d'une livraison antérieure. Cette commande ajoute un nouvel historique au projet (elle ne modifie pas l'historique existant).

git checkout

Cette commande extrait le contenu du référentiel et le place dans votre arborescence de travail. Il peut également avoir d'autres effets, en fonction de la façon dont la commande a été invoquée. Par exemple, il peut modifiez également la branche sur laquelle vous travaillez actuellement. Cette commande n'apporte aucune modification à l'historique.

git reset

Cette commande est un peu plus compliquée. Il fait en fait quelques choses différentes en fonction de la façon dont il est invoqué. Il modifie l'index (la soi-disant "zone de transit"). Ou il change qui commit une tête de branche pointe actuellement. Cette commande peut modifier l'historique existant (en modifiant le commit auquel une branche fait référence).

En utilisant ces commandes

Si un commit a été fait quelque part dans l'historique du projet, et que vous décidez plus tard que le commit est faux et n'aurait pas dû être fait, alors git revert est l'outil pour le travail. Il annulera les modifications introduites par le mauvais commit, enregistrant le "annuler" dans l'historique.

Si vous avez modifié un fichier dans votre arborescence de travail, mais que vous n'avez pas validé la modification, vous pouvez utiliser git checkout pour extraire une nouvelle copie du fichier depuis le référentiel.

Si vous avez fait un commit, mais je ne l'ai pas partagé avec quelqu'un d'autre et vous décidez que vous ne le voulez pas, alors vous pouvez utiliser git reset pour réécrire l'historique afin qu'il semble que vous n'ayez jamais fait ce commit.

Ce ne sont que quelques-uns des scénarios d'utilisation possibles. Il existe d'autres commandes qui peuvent être utiles dans certaines situations, et les trois commandes ont d'autres usages.

342
répondu Dan Moulding 2016-01-12 21:35:09
  • git revert est utilisé pour annuler une précédente livraison. Dans git, vous ne pouvez pas modifier ou effacer un commit antérieur. (En fait, vous pouvez, mais cela peut causer des problèmes.) Donc, au lieu d'éditer le commit précédent, revert introduit un nouveau commit qui inverse un précédent.
  • {[1] } est utilisé pour annuler les modifications dans votre répertoire de travail qui n'ont pas encore été validées.
  • {[2] } est utilisé pour copier un fichier d'un autre commit dans votre arborescence de travail actuelle. Il ne commit pas automatiquement le fichier.
23
répondu Jonathan 2015-04-27 09:31:22
  • git checkout modifie votre arbre de travail,
  • git reset modifie la référence vers laquelle pointe la branche sur laquelle vous vous trouvez,
  • git revert ajoute un commit annulant les modifications.
14
répondu dan_waterworth 2015-04-27 09:31:46

Disons que vous aviez commits:

C
B
A

git revert B, va créer un commit qui annule les changements dans B.

git revert A, va créer un commit qui annule les changements dans A, mais ne touchera pas à des changements dans B

Notez que si les modifications de B dépendent des modifications de A, le retour de A n'est pas possible.

git reset --soft A, va changer l'historique des commits et le référentiel; staging et le répertoire de travail seront toujours à l'état de C.

git reset --mixed A, va changer l'historique des commits, le référentiel et le répertoire de travail staging; seront toujours à l'état C.

git reset --hard A, va changer l'historique des commits, le référentiel, le staging et le répertoire de travail; vous retournerez complètement à l'état de A.

5
répondu Akavall 2017-07-16 17:51:12

Si vous avez cassé l'arbre, mais n'a pas commis le code, vous pouvez utiliser git reset, et si vous souhaitez restaurer un fichier, vous pouvez utiliser git checkout.

Si vous avez cassé l'arbre et engage le code, vous pouvez utiliser git revert HEAD.

Http://book.git-scm.com/4_undoing_in_git_-_reset,_checkout_and_revert.html

4
répondu LostMohican 2015-04-27 09:32:39

Réinitialiser - Au niveau de la validation, la réinitialisation est un moyen de déplacer la pointe d'une branche vers une validation différente. Cela peut être utilisé pour supprimer les commits de la branche actuelle.

Revert - Rétablir annule un commit en créant un nouveau commit. C'est un moyen sûr d'annuler les modifications, car il n'a aucune chance de réécrire l'historique des commits. Contrastez cela avec git reset, qui modifie l'historique de validation existant. Pour cette raison, git revert doit être utilisé pour annuler les modifications branch, et git reset doivent être réservés pour annuler les modifications sur une branche privée.

Vous pouvez jeter un oeil sur ce lien- réinitialiser, commander et rétablir

4
répondu Sachchidanand Singh 2015-11-18 10:06:12