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é?

http://a.imageshack.us/img192/5440/screenshot20100903at416.png

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:

http://a.imageshack.us/img651/1559/86421927.png http://a.imageshack.us/img801/1986/resetr.png

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.

enter image description here

git checkout bar 
git reset --hard newbar 
git branch -d newbar 

enter image description here

360
demandé sur prosseek 2010-09-04 00:21:43

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 courons git 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 vers master .

donc, dans les deux cas , nous déplaçons HEAD pour indiquer A , mais la façon dont nous le faisons est très différente. reset déplacera la branche HEAD points à, la caisse déplace HEAD lui-même pour pointer vers une autre branche.

http://git-scm.com/images/reset/reset-checkout.png

156
répondu VonC 2018-02-20 16:40:38

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.

58
répondu CB Bailey 2014-02-17 13:09:38

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).

21
répondu John Doe 2016-01-28 02:54:56

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

8
répondu Rochadsouza 2015-03-21 15:55:41

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 fait checkout ); reset déplace la branche que la tête pointe. Cela signifie que si la tête est réglée à la branche master (c'est-à-dire que vous êtes actuellement sur la branche master )), la commande git reset 9e5e6a4 commencera par master . 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.

4
répondu LarsH 2018-09-22 19:27:04

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.

1
répondu wiki1000 2016-01-26 12:17:52