Quelle est la différence entre "git reset" et "git checkout"?
j'ai toujours pensé que git reset
et git checkout
étaient les mêmes, dans le sens que les deux ramènent le projet à un engagement spécifique. Cependant, je pense qu'ils ne peuvent pas être exactement la même, ce serait redondant. Quelle est la différence réelle entre les deux? Je suis un peu confus, car le svn n'a que svn co
pour inverser la propagation.
ajouté
le qui suit le diagramme explique la différence, bien qu'en une manière peut-être trop simplifiée ou incorrecte. Qu'en pensez-vous? Est-ce mal ou trop simplifié?
ajouté 2
VonC et Charles ont très bien expliqué les différences entre git reset
et git checkout
. Mon interprétation actuelle est que git reset
ramène toutes les modifications à un commit spécifique, alors que git checkout
plus ou moins prépare pour une branche. J'ai trouvé l' voici deux diagrammes assez utiles pour en arriver à cette compréhension:
ajouté 3
de http://think-like-a-git.net/sections/rebase-from-the-ground-up/using-git-cherry-pick-to-simulate-git-rebase.html , check-out et reset peuvent émuler le rebase.
git checkout bar
git reset --hard newbar
git branch -d newbar
6 réponses
-
git reset
est spécifiquement sur mise à jour de l'index , déplacement de la tête. -
git checkout
est d'environ mise à jour de l'arbre de travail (à l'index ou l'arbre spécifié). Il mettra à jour la tête seulement si vous vérifiez une branche (sinon, vous finissez avec un tête détachée ).
By comparaison, puisque svn n'a pas d'indice, seulement un arbre de travail, svn checkout
copiera une révision donnée dans un répertoire séparé.
L'équivalent le plus proche de git checkout
serait:
-
svn update
(si vous êtes dans la même branche, ce qui signifie la même URL SVN) -
svn switch
(si vous vérifiez par exemple la même branche, mais à partir de une autre URL SVN repo)
toutes ces trois modifications de l'arbre( svn checkout
, update
, switch
) n'avoir qu'une commande en git: git checkout
.
Mais puisque git a aussi la notion d'index (cette" zone de repos "entre la repo et l'arbre de travail), vous avez aussi git reset
.
Thinkeye mentions dans les commentaires l'article " Reset Démystifiée ".
par exemple, si nous avons deux branches,"
master
"et"develop
"pointant vers des propagations différentes, et nous sommes actuellement sur"develop
"(donc la tête pointe vers elle) et nous couronsgit reset master
, "develop
"lui-même va maintenant pointer vers la même propagation que "master
" fait.par contre, si on utilise
git checkout master
,"develop
' ne bougera pas,HEAD
lui-même le fera.HEAD
pointera maintenant versmaster
.donc, dans les deux cas , nous déplaçons
HEAD
pour indiquerA
, mais la façon dont nous le faisons est très différente.reset
déplacera la brancheHEAD
points à, la caisse déplaceHEAD
lui-même pour pointer vers une autre branche.
dans sa forme la plus simple, reset
réinitialise l'index sans toucher l'arbre de travail, tandis que checkout
change l'arbre de travail sans toucher l'index.
réinitialise l'index pour correspondre à HEAD
, arbre de travail laissé seul:
git reset
sur le plan conceptuel, ceci vérifie l'indice dans l'arbre de travail. Pour qu'il fasse quoi que ce soit, vous devez utiliser -f
pour le forcer à écraser tout changement local. Ce est un dispositif de sécurité pour s'assurer que la forme "no argument" n'est pas destructive:
git checkout
une fois que vous commencez à ajouter des paramètres, il est vrai qu'il y a un certain chevauchement.
checkout
est habituellement utilisé avec une branche, une étiquette ou une propagation. Dans ce cas, il réinitialisera HEAD
et l'index de la propagation donnée ainsi que la vérification de l'index dans l'arbre de travail.
aussi, si vous fournissez --hard
à reset
vous pouvez demander reset
pour remplacer l'arbre de travail ainsi que la réinitialisation de l'index.
si vous avez fait vérifier une branche il y a une différence cruciale entre reset
et checkout
lorsque vous fournissez une branche alternative ou commit. reset
changera la branche courante pour pointer vers la propagation sélectionnée tandis que checkout
laissera la branche courante seule, mais vérifiera la branche fournie ou propagera à la place.
les autres formes de reset
et commit
impliquent des voies d'approvisionnement.
si vous fournissez des chemins vers reset
vous ne pouvez pas fournir --hard
et reset
ne modifiera la version d'index des chemins fournis que vers la version dans la propagation fournie (ou HEAD
si vous ne spécifiez pas de propagation).
si vous fournissez des chemins vers checkout
, comme reset
il mettra à jour la version d'index des chemins fournis vers correspond à la propagation fournie (ou HEAD
) mais il vérifiera toujours la version index des chemins fournis dans l'arbre de travail.
un cas d'utilisation simple lorsque le changement est inversé:
1. L'utilisation de réinitialisation si vous souhaitez annuler la mise en scène d'un fichier modifié.
2. Utilisez la commande checkout si vous voulez rejeter les changements dans le/Les fichier (s) non-enregistré (s).
Atlassian donnez-nous une excellente explication sur git reset , git checkout et donc, git revert . Dans cet article, est expliqué les différentes utilisations de ces commandes sur différents niveaux - fichier, snapshot échelonné et commit.
https://www.atlassian.com/git/tutorials/resetting-checking-out-and-reverting
la principale différence en un mot est que reset
déplace la référence actuelle de la branche , tandis que checkout
ne le fait pas (il déplace la tête).
comme le livre de bord explique sous Reset Demystified ,
La première chose que
reset
va faire bouger ce TÊTE pointe vers . Ce n'est pas la même chose que changer la tête elle-même (ce que faitcheckout
);reset
déplace la branche que la tête pointe. Cela signifie que si la tête est réglée à la branchemaster
(c'est-à-dire que vous êtes actuellement sur la branchemaster
)), la commandegit reset 9e5e6a4
commencera parmaster
.9e5e6a4
. [soulignement ajouté]
Voir aussi la réponse de VonC pour un texte très utile et extrait de diagramme de la même article, que je ne dupliquerai pas ici.
bien sûr, il y a beaucoup plus de détails sur les effets que checkout
et reset
peuvent avoir sur l'index et l'arbre de travail, selon les paramètres utilisés. Il peut y avoir beaucoup de similitudes et différences entre les deux commandes. Mais à mon avis, la différence la plus importante est de savoir s'ils déplacent la pointe de la branche actuelle.
les deux commandes (reset et checkout) sont complètement différentes.
checkout X
N'EST PAS reset --hard X
Si X est le nom d'une succursale,
checkout X
va changer la branche courante
alors que reset --hard X
ne le fera pas.