Quelle est la différence entre “git reset” et “git checkout”?
J'ai toujours pensé git reset
et git checkout
comme le même, en ce sens que les deux porter le projet jusqu'au commit. Cependant, je pense qu'ils ne peuvent pas être exactement la même, ce serait redondant. Quelle est la réelle différence entre les deux? Je suis un peu confus, comme le svn seulement a svn co
pour revenir à la commettre.
AJOUTÉ
VonC et Charles expliqué les différences entre git reset
et git checkout
vraiment bien. Ma compréhension est que git reset
reprend toutes les modifications apportées à un certain commettre, alors que git checkout
plus ou moins se prépare à une branche. J'ai trouvé le suivant deux schémas très 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, checkout et de réinitialisation peut émuler le rebase.
git checkout bar
git reset --hard newbar
git branch -d newbar
- jetez un oeil à git-scm.com/blog/2011/07/11/reset.html
- Re: "Est-ce mal ou trop simplifié?" Oui, ce premier diagramme est trompeuse quant à la différence entre la caisse et la réinitialisation. (Il peut être OK concernant la
-- files
variantes; je ne suis pas sûr.) Ce diagramme fait qu'il ressemble à la différence principale est de savoir si elles affectent l'index ou le WD. Voir ma réponse au sujet de cette. Les 2e et 3e diagrammes sont très utiles pour voir la vraie différence. La 4e et de la 5e diagrammes sont utiles pour vérifier si vous comprenez ce que font ces commandes, mais ne sera pas vraiment vous aider à y arriver. - J'ai trouvé la section "Check it out" de la "Outils Git Reset Démystifiée", afin de donner le plus utile résumé.
- prosseek: Si vous êtes d'accord avec @LarsH que le premier diagramme est trompeuse, peut vous l'enlever, s'il vous plaît?
Vous devez vous connecter pour publier un commentaire.
git reset
est précisément à propos de la mise à jour de l'index, le déplacement de la TÊTE.git checkout
est d'environ la mise à jour de l'arbre de travail (à l'indice ou l'arborescence spécifiée). Il mettra à jour la TÊTE que si vous commander une branche (si pas, vous vous retrouvez avec un détaché de la TÊTE).(en fait, avec Git 2.23 T3 2019, ce sera
git restauration
, pas nécessairementgit checkout
)Par comparaison, depuis svn a pas d'index, seulement un arbre de travail,
svn
copie une révision sur un répertoire séparé.Le plus proche équivalent pour
git checkout
serait:svn update
(si vous êtes dans la même direction, ce qui signifie la même URL SVN)svn switch
(si vous commandez par exemple la même branche, mais à partir d'un autre repo SVN URL)Tous ces trois arbre de travail modifications (
svn checkout
,update
,switch
) ont une seule commande git:git checkout
.Mais depuis git a aussi la notion d'index (qui "zone de transit" entre les pensions et l'arbre de travail), vous avez également
git reset
.Thinkeye mentionne dans les commentaires l'article "Réinitialiser Démystifié ".
Sur ces points, même s':
LarsH ajoute dans les commentaires:
De Novo est d'accord dans les commentaires:
git reset
est sur la modification de la direction de la "label", et éventuellement la mise à jour de l'index ou de l'arbre de travail comme un effet secondaire.git checkout
est à propos de la mise à jour de l'arbre de travail et de commutation actuellement "sélectionné" (laHEAD
).git reset
est de 100% sur leHEAD
. Il fonctionne même dans un décollement de la TÊTE mode (stackoverflow.com/a/3965714/6309), sens où il est aucun de la branche(!). git checkout travaille également à un décollement de la mode, ou peut être utilisé pour commander un SHA1 dans un décollement de la TÊTE mode: encore une fois, aucune branche impliquée dans cette affaire.git reset
se déplaceHEAD
si le fichier.git/HEAD
contient un SHA-1. Toutefois, si elle contient unref:
, il déplace la direction pointée par cette référence à la place. Par exemple,git checkout master && git reset --soft HEAD^
déplace lemaster
branche "label" pour le parent SHA-1 du commit courant indiqué par la direction de lamaster
, droit? Et le contenu du fichier.git/HEAD
estref: refs/heads/master
peu importe sigit reset
est fait ou pas..git/HEAD
contenu ne change pas, maisHEAD
fait indirectement référence à un nouveau SHA1 (même lorsque l'index et worktree restent inchangés pour unreset --soft
, comme dans stackoverflow.com/a/5203843/6309)HEAD
points deref:
, le direction pointée par le ref est modifié pargit reset
et dans ce cas,git reset
est sur la modification de la direction de la "label", pas leHEAD
lui-même. Dans la pratique,HEAD
fait le point sur différents s'engager après la modification (en raison de modifié direction), et si--mixed
ou--hard
est utilisé, l'index et, éventuellement, le répertoire de travail est modifié, trop.git checkout a839e8f
les mises à jour de la TÊTE au point de commettrea839e8f
.HEAD
est dans mettra à jour la TÊTE que si vous commander une branche.HEAD
va partout où vous en êtes, comme une ombre. De vérifier quelques non-branche ref (par exemple, une balise), ou de s'engager directement, se déplaceraHEAD
. Détaché de la tête ne signifie pas que vous avez détaché de laHEAD
, cela signifie que la tête est détachée d'une branche ref, que vous pouvez voir, par exemple,git log --pretty=format:"%d" -1
. attaché à la tête des états allons commencer avec(HEAD ->
, détachée montrent encore(HEAD
, mais pas une flèche à une branche réf.HEAD
est, voir ma réponse pour le "qu'est-ce que la TÊTE" question.Dans leur forme la plus simple,
reset
réinitialise l'index, sans toucher à l'arbre de travail, tandis quecheckout
changements de l'arbre de travail sans toucher à l'index.Réinitialise l'indice de match
HEAD
, arbre de travail abandonnés:Sur le plan conceptuel, ce qui vérifie l'index de l'arbre de travail. Pour l'obtenir, il faut réellement faire quelque chose que vous auriez à utiliser
-f
pour le forcer à remplacer tous les changements locaux. C'est une fonction de sécurité pour s'assurer que le "pas d'argument" n'est pas destructrice:Une fois que vous commencez à ajouter des paramètres, il est vrai qu'il y a un certain chevauchement.
checkout
est généralement utilisé avec une branche, de l'étiquette ou de la validation. Dans ce cas, il sera réinitialiséHEAD
et l'index pour la validation donnée ainsi que l'exécution de la caisse de l'indice dans le travail à l'arbre.Aussi, si vous fournissez
--hard
àreset
vous pouvez demanderreset
pour remplacer l'arbre de travail ainsi que la réinitialisation de l'index.Si vous ont une branche vérifié out il est essentiel différentes entre
reset
etcheckout
lorsque vous fournissez une branche alternative ou de commettre.reset
change la direction du point à l'engager alors quecheckout
laissera la branche courante seul mais la caisse de la livrée de la succursale ou de s'engager à la place.D'autres formes de
reset
etcommit
impliquent la fourniture de chemins.Si vous fournissez des chemins de
reset
vous ne pouvez pas fournir--hard
etreset
ne fait que changer l'indice de version des chemins d'accès à la version dans la commettre (ouHEAD
si vous ne spécifiez pas un commit).Si vous fournissez des chemins de
checkout
, commereset
il va mettre à jour l'index de la version de la fourniture des chemins de match fournis commit (ouHEAD
) mais il sera toujours la caisse de l'index de la version de la fourniture des chemins dans l'arbre de travail.Un cas simple d'utilisation quand le retour de changement:
1. L'utilisation de réinitialisation si vous souhaitez annuler la mise en scène d'un fichier modifié.
2. Utiliser la caisse si vous souhaitez annuler les modifications apportées à unstaged fichier/s.
Atlassian nous donner 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 les différents niveaux de fichier, mise en scène d'instantané et de s'engager.
https://www.atlassian.com/git/tutorials/resetting-checking-out-and-reverting
La clé de la différence en un mot, c'est que
reset
déplace la branche courante de référence, tandis quecheckout
ne pas (il bouge la TÊTE).Que le Pro Git livre explique en vertu de Réinitialiser Démystifié,
Voir aussi VonC réponse à une très utile de texte et diagramme de l'extrait à partir du même article, que je ne dupliquez pas ici.
Bien sûr, il ya beaucoup plus de détails sur les effets de
checkout
etreset
peut avoir sur l'index et l'arbre de travail, en fonction de quels paramètres sont utilisés. Il peut y avoir beaucoup de similitudes et différences entre les deux commandes. Mais comme je le vois, la différence la plus fondamentale est de savoir si ils se déplacent à la pointe de la branche courante.Les deux commandes (réinitialisation et de départ) sont complètement différents.
checkout X
N'EST PASreset --hard X
Si X est un nom de branche,
checkout X
change la direction de laalors que
reset --hard X
ne sera pas.