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

275

Je suis en train d'apprendre comment restaurer ou les fichiers rollback et des projets à un état antérieur, et ne comprennent pas la différence entre git revert, checkoutet reset. Pourquoi y a-t-il 3 commandes différentes pour apparemment le même but, et quand doit-on choisir l'une plutôt que l'autre?

Haziz
la source

Réponses:

461

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

git revert

Cette commande crée un nouveau commit qui annule les modifications 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 arborescence de travail. Il peut également avoir d'autres effets, selon la façon dont la commande a été invoquée. Par exemple, il peut également changer 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 deux ou trois choses différentes selon la façon dont il est invoqué. Il modifie l'index (ce que l'on appelle la "zone de transit"). Ou il change le point sur lequel un chef de branche est actuellement pointé. Cette commande peut modifier l'historique existant (en modifiant le commit référencé par une branche).

Utilisation de ces commandes

Si une validation a été effectuée quelque part dans l'historique du projet et que vous décidez plus tard que la validation est incorrecte et qu'elle n'aurait pas dû être effectuée, git revertl'outil de travail est alors l'outil. Il annulera les modifications apportées par le mauvais commit, enregistrant l '"annulation" 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 checkoutpour extraire une copie fraîche du référentiel du fichier.

Si vous avez fait un commit, mais ne l'avez partagé avec personne d'autre et que vous décidez de ne pas le vouloir, vous pouvez utiliser git resetpour réécrire l'historique afin 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.

Dan Moulding
la source
13
Ainsi, les trois commandes peuvent être utilisées pour annuler certains travaux, ce qui signifie qu'elles ne sont pas si "entièrement différentes". Même concept, contextes différents.
Bruno Santos
16
@BrunoSantos: les chandeliers, les tuyaux en 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.
Dan Moulding du
12
@Dan Mounlding - En fait, il existe de nombreux cas où git resetet git checkoutpeuvent faire exactement la même chose. Dire qu'ils ne sont "même pas à distance similaires" n'est pas simplement une exagération excessive: ce n'est même pas vrai à distance. Ces deux commandes peuvent faire tellement de choses différentes, dont certaines se chevauchent complètement. Exemple: git reset --hardet git checkout -- .fera exactement la même chose. Et logiquement parlant, git reset --hard <path>et git checkout <path>devrait également faire exactement la même chose - git vous en empêche cependant. Il est TRÈS facile de confondre ces deux commandes.
DanGordon
5
@DanGordon Je me rends compte que nous aurons probablement juste une différence d'opinion ici. Néanmoins, je pense que je devrais fournir quelques explications. Vous ne pouvez pas faire git reset --hard <path>comme vous le pouvez git checkout <path>précisément parce que les deux commandes font quelque chose de complètement différent. git resetindique à Git de déplacer HEAD vers un autre commit. git checkoutd'un autre côté, ne demande pas du tout à Git de faire quoi que ce soit avec HEAD. Il laisse HEAD seul et extrait simplement un fichier. Oui, vous pouvez les fabriquer de manière à ce qu'ils aient des effets similaires. Mais ce qu'ils font en réalité est totalement différent.
Dan Moulding du
46

Disons que vous avez commis des commits:

C
B
A

git revert B, créera un commit qui annule les modifications B.

git revert A, créera un commit qui annule les modifications dans A, mais ne touche pas les modifications dansB

Notez que si les changements de Bdépendent des changements de A, la restauration de An'est pas possible.

git reset --soft A, modifiera l'historique des validations et le référentiel; le répertoire intermédiaire et de travail sera toujours à l'état C.

git reset --mixed A, modifiera l'historique des validations, le référentiel et le transfert; le répertoire de travail sera toujours à l'état de C.

git reset --hard A, modifiera l'historique de validation, le référentiel, le répertoire intermédiaire et le répertoire de travail; vous reviendrez à l'état de Acomplètement.

Akavall
la source
1
Réponse si intuitive .. que diriez-vous de commander
MJ Studio
29
  • git revertest utilisé pour annuler une validation précédente. Dans git, vous ne pouvez pas modifier ou effacer un commit antérieur. (En fait, vous pouvez, mais cela peut causer des problèmes.) Ainsi, au lieu de modifier la validation précédente, revert introduit une nouvelle validation qui annule une précédente.
  • git reset est utilisé pour annuler les modifications de votre répertoire de travail qui n'ont pas encore été validées.
  • git checkoutest utilisé pour copier un fichier d'un autre commit dans votre arborescence de travail actuelle. Il ne valide pas automatiquement le fichier.
Jonathan
la source
7
Je crois que vous vous trompez sur "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 [filename]"
luigi7up
11
git reset --softréinitialise le HEAD uniquement, git reset --hardréinitialise le HEAD et votre répertoire de travail.
Ehryk
git reset --mixed (par défaut): changements non validés + unstage
NattyC
21
  • 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.
dan_waterworth
la source
4
git reset ne modifie pas seulement la validation vers laquelle pointe une branche , elle est également utilisée pour décompresser les fichiers de l'index et peut modifier la copie de travail avec git reset --mixed(la valeur par défaut).
git reset --soft: annuler les modifications, les modifications sont laissées par étapes (index). git reset --mixed (par défaut): annuler les modifications + annuler l'étape, les modifications sont laissées dans l'arborescence de travail. git reset --hard: annuler les modifications + annuler l'étape + supprimer, il ne reste plus rien.
NattyC
6

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

Revert - La restauration annule une validation en créant une nouvelle validation. Il s'agit d'un moyen sûr d'annuler les modifications, car il n'a aucune chance de réécrire l'historique de validation. Comparez cela avec git reset, qui modifie l'historique de validation existant. Pour cette raison, git revert doit être utilisé pour annuler les modifications sur une branche publique, et git reset doit être réservé pour annuler les modifications sur une branche privée.

Vous pouvez jeter un oeil sur ce lien - Reset, Checkout and Revert

Sachchidanand Singh
la source
5

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

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

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

LostMohican
la source