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 resetest spécifiquement sur mise à jour de l'index , déplacement de la tête. -
git checkoutest 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,HEADlui-même le fera.HEADpointera maintenant versmaster.donc, dans les deux cas , nous déplaçons
HEADpour indiquerA, mais la façon dont nous le faisons est très différente.resetdéplacera la brancheHEADpoints à, la caisse déplaceHEADlui-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
resetva 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);resetdé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 9e5e6a4commencera 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.