348 votes

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

J'essaie d'apprendre comment restaurer ou rétablir des fichiers et des projets à un état antérieur, et je ne comprends pas la différence entre git revert , checkout et reset . Pourquoi existe-t-il trois commandes différentes pour un objectif apparemment identique, et quand doit-on choisir l'une plutôt que l'autre ?

551voto

Dan Moulding Points 46866

Ces trois commandes ont des objectifs totalement différents. Ils ne se ressemblent même pas du tout.

git revert

Cette commande crée un nouveau commit qui annule les changements d'un commit précédent. 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 arbre de travail. Elle peut également avoir d'autres effets, selon la façon dont la commande a été invoquée. Par exemple, elle peut aussi changer la branche sur laquelle vous travaillez actuellement. Cette commande n'apporte aucun changement à l'historique.

git reset

Cette commande est un peu plus compliquée. Elle fait en fait deux choses différentes selon la façon dont elle est invoquée. Elle modifie l'index (la "zone de transit"). Ou elle change le commit sur lequel une tête de branche pointe actuellement. Cette commande peut modifier l'historique existant (en changeant 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 incorrect et n'aurait pas dû être fait, alors git revert est l'outil idéal pour ce travail. Il va annuler les changements introduits par le mauvais commit, en enregistrant le "undo" dans l'historique.

Si vous avez modifié un fichier dans votre arbre de travail, mais que vous n'avez pas validé la modification, vous pouvez utiliser la commande git checkout pour extraire une copie fraîche du dépôt du fichier.

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

Ce ne sont là 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 ci-dessus ont également d'autres utilisations.

25 votes

Les trois commandes peuvent donc être utilisées pour annuler un travail, ce qui signifie qu'elles ne sont pas si "totalement différentes". Même concept, contextes différents.

26 votes

@BrunoSantos : Les chandeliers, les tuyaux de plomb, les poignards et la corde peuvent tous être utilisés pour assassiner des gens, mais cela ne signifie pas que ces choses sont particulièrement similaires.

18 votes

@Dan Mounlding - En fait, il y a beaucoup de cas où git reset y git checkout peuvent faire exactement la même chose. Dire qu'elles ne sont "pas du tout similaires" n'est pas seulement une exagération : ce n'est même pas vrai. Ces deux commandes peuvent faire tellement de choses différentes, dont certaines se chevauchent complètement. Exemple : git reset --hard y git checkout -- . fera exactement la même chose. Et logiquement parlant, git reset --hard <path> y git checkout <path> devrait également faire exactement la même chose - git vous empêche cependant de le faire. Il est TRÈS facile de confondre ces deux commandes.

90voto

Akavall Points 7357

Disons que vous avez des engagements :

C
B
A

git revert B créera un commit qui annulera les changements dans le fichier B .

git revert A créera un commit qui annulera les changements dans le fichier A mais ne touchera pas aux changements dans B

Notez que si des changements dans B dépendent des changements dans A le retour de A n'est pas possible.

git reset --soft A modifiera l'historique des livraisons et le référentiel ; les répertoires de travail et de préparation seront toujours à l'état de C .

git reset --mixed A modifiera l'historique des livraisons, le dépôt et la mise à disposition ; le répertoire de travail sera toujours à l'état de C .

git reset --hard A modifiera l'historique des livraisons, le dépôt, le répertoire de travail et le répertoire de transit ; vous reviendrez à l'état d'origine. A complètement.

30voto

Jonathan Points 620
  • git revert est utilisé pour annuler un commit précédent. Dans git, vous ne pouvez pas modifier ou effacer un commit précédent. (En fait, vous pouvez le faire, mais cela peut poser des problèmes). Ainsi, au lieu de modifier le commit précédent, revert introduit un nouveau commit qui annule le précédent.
  • git reset est utilisé pour annuler les changements dans votre répertoire de travail qui n'ont pas encore été effectués.
  • git checkout est utilisé pour copier un fichier depuis un autre commit vers votre arbre de travail actuel. Il ne commet pas automatiquement le fichier.

8 votes

Je crois que vous avez tort au sujet de "git reset". "git reset" réinitialise votre HEAD à l'un des commits précédents, il ne réinitialise pas votre répertoire de travail. Le répertoire de travail est "réinitialisé" par "git checkout [nom du fichier]".

11 votes

git reset --soft réinitialise uniquement le HEAD, git reset --hard réinitialise le HEAD et votre répertoire de travail.

0 votes

Git reset --mixed (default) : uncommit + unstage des changements

25voto

dan_waterworth Points 3169
  • 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 changements.

4 votes

git reset ne modifie pas seulement le commit vers lequel pointe une branche il est également utilisé pour déstocker des fichiers de l'index, et peut modifier la copie de travail avec git reset --mixed (par défaut).

0 votes

Git reset --soft : annule les changements, les changements sont laissés dans l'arbre de travail. git reset --mixed (par défaut) : annule les changements + les déstocke, les changements sont laissés dans l'arbre de travail. git reset --hard : annule les changements + les déstocke + les supprime, rien n'est laissé.

7voto

Remise à zéro - Au niveau du commit, la réinitialisation est un moyen de déplacer l'extrémité d'une branche vers un commit différent. Cela peut être utilisé pour supprimer des commits de la branche courante.

Revenir en arrière - Le retour en arrière annule un commit en créant un nouveau commit. C'est un moyen sûr d'annuler des changements, car il n'y a aucune chance de réécrire l'historique des livraisons. Comparez cela avec git reset, qui modifie l'historique des livraisons existantes. Pour cette raison, git revert devrait être utilisé pour annuler les changements sur une branche publique, et git reset devrait être réservé à l'annulation des changements sur une branche privée.

Vous pouvez jeter un coup d'oeil sur ce lien- Réinitialisation, sortie et retour en arrière

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