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 revert
l'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 checkout
pour 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 reset
pour 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.
git reset
etgit checkout
peuvent 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 --hard
etgit checkout -- .
fera exactement la même chose. Et logiquement parlant,git reset --hard <path>
etgit 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.git reset --hard <path>
comme vous le pouvezgit checkout <path>
précisément parce que les deux commandes font quelque chose de complètement différent.git reset
indique à Git de déplacer HEAD vers un autre commit.git checkout
d'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.Disons que vous avez commis des commits:
git revert B
, créera un commit qui annule les modificationsB
.git revert A
, créera un commit qui annule les modifications dansA
, mais ne touche pas les modifications dansB
Notez que si les changements de
B
dépendent des changements deA
, la restauration deA
n'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'étatC
.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 deC
.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 deA
complètement.la source
git revert
est 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 checkout
est utilisé pour copier un fichier d'un autre commit dans votre arborescence de travail actuelle. Il ne valide pas automatiquement le fichier.la source
git reset --soft
réinitialise le HEAD uniquement,git reset --hard
réinitialise le HEAD et votre répertoire de travail.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.la source
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 avecgit reset --mixed
(la valeur par défaut).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
la source
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 utilisergit 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
la source