git-reset hash
définit la référence de la branche au hachage donné, et éventuellement la vérifie, avec --hard
.
git-checkout hash
définit l'arbre de travail au hash donné ; et à moins que hash soit un nom de branche, vous vous retrouverez avec une tête détachée.
En fin de compte, git s'occupe de 3 choses :
working tree (your code)
-------------------------------------------------------------------------
index/staging-area
-------------------------------------------------------------------------
repository (bunch of commits, trees, branch names, etc)
git-checkout
par défaut ne met à jour que l'index et l'arbre de travail, et peut optionnellement mettre à jour quelque chose dans le référentiel (avec la commande -b
option)
git-reset
par défaut ne fait que mettre à jour le référentiel et l'index, et optionnellement l'arbre de travail (avec la commande --hard
option)
Vous pouvez penser au dépôt comme ceci :
HEAD -> master
refs:
master -> sha_of_commit_X
dev -> sha_of_commit_Y
objects: (addressed by sha1)
sha_of_commit_X, sha_of_commit_Y, sha_of_commit_Z, sha_of_commit_A ....
git-reset
manipule ce vers quoi pointent les références de la branche.
Supposons que votre histoire ressemble à ceci :
T--S--R--Q [master][dev]
/
A--B--C--D--E--F--G [topic1]
\
Z--Y--X--W [topic2][topic3]
Gardez à l'esprit que les branches sont juste des noms qui avancent automatiquement lorsque vous livrez.
Vous avez donc les branches suivantes :
master -> Q
dev -> Q
topic1 -> G
topic2 -> W
topic3 -> W
Et votre branche actuelle est topic2
c'est-à-dire que le HEAD pointe vers le sujet 2.
HEAD -> topic2
Ensuite, git reset X
réinitialisera le nom topic2
pour pointer vers X ; ce qui signifie que si vous faites un commit P sur la branche topic2, les choses ressembleront à ceci :
T--S--R--Q [master][dev]
/
A--B--C--D--E--F--G [topic1]
\
Z--Y--X--W [topic3]
\
P [topic2]
1 votes
J'ai abordé ce sujet dans une mise à jour de ma réponse à l'une de vos questions précédentes - regardez l'art ascii près du sommet, en particulier là où il est écrit "Digression : ...". (même si j'aimerais bien être plus représenté pour répondre à nouveau à cette question ici)
0 votes
Je pense que vous pouvez poster votre réponse ici et gagner en réputation. Si quelqu'un recherche cette connaissance particulière, il ne trouvera pas l'autre message. Celui-ci vise un sujet très spécifique, et il mérite d'avoir sa propre page. BTW, il semble que vous soyez mon mentor Git :-) harigato, senseï !
1 votes
Mais si je comprends bien, la différence est que reset déplace la branche et non le checkout.
0 votes
@e-satis : Oui, tu as raison. La réponse est là maintenant, et je retirerais mon vote serré si je le pouvais ! Et je vous en prie, je suis heureux d'utiliser toutes les connaissances que j'ai accumulées en dehors de mon travail.
0 votes
Voir aussi progit.org/2011/07/11/reset.html