J'ai toujours pensé git reset
et git checkout
comme la même chose, dans le sens où les deux ramènent le projet à un commit spécifique. Cependant, je pense qu'ils ne peuvent pas être exactement les mêmes, car cela serait redondant. Quelle est la différence réelle entre les deux? Je suis un peu confus, car le svn n'a svn co
qu'à annuler le commit.
AJOUTÉE
VonC et Charles ont expliqué les différences entre git reset
et git checkout
vraiment bien. Ma compréhension actuelle est que git reset
tous les changements reviennent à un commit spécifique, alors que se git checkout
prépare plus ou moins pour une branche. J'ai trouvé les deux diagrammes suivants très utiles pour arriver à cette compréhension:
AJOUTÉ 3
À partir de http://think-like-a-git.net/sections/rebase-from-the-ground-up/using-git-cherry-pick-to-simulate-git-rebase.html , l'extraction et la réinitialisation peuvent émuler le rebase.
git checkout bar
git reset --hard newbar
git branch -d newbar
la source
-- files
variantes; je ne suis pas sûr.) Ce diagramme donne l'impression que la principale différence est de savoir si elles affectent l'index ou le WD. Voir ma réponse à ce sujet. Les 2e et 3e diagrammes sont très utiles pour voir la vraie différence. Les 4e et 5e diagrammes sont utiles pour vérifier si vous comprenez ce que font ces commandes, mais ne vous aideront pas vraiment à y arriver.think-like-a-git.net
article lié ) sont nécessaires pour éviter la perte de données.Réponses:
git reset
concerne spécifiquement la mise à jour de l'index , le déplacement de HEAD.git checkout
concerne la mise à jour de l'arborescence de travail (vers l'index ou l'arborescence spécifiée). Il mettra à jour le HEAD uniquement si vous extrayez une branche (sinon, vous vous retrouvez avec un HEAD détaché ).(en fait, avec Git 2.23 Q3 2019, ce sera
git restore
, pas nécessairementgit checkout
)Par comparaison, puisque svn n'a pas d'index, seule une arborescence de travail
svn checkout
copiera une révision donnée sur un répertoire séparé.L'équivalent le plus proche de
git checkout
:svn update
(si vous êtes dans la même branche, c'est-à-dire la même URL SVN)svn switch
(si vous extrayez par exemple la même branche, mais à partir d'une autre URL de dépôt SVN)Toutes ces trois modifications d'arbres de travail (
svn checkout
,update
,switch
) ont une seule commande dans git:git checkout
.Mais puisque git a aussi la notion d'index (cette "zone de transit" entre le repo et l'arbre de travail), vous l'avez aussi
git reset
.Thinkeye mentionne dans les commentaires l'article " Reset Demystified ".
Sur ces points, cependant:
LarsH ajoute dans les commentaires :
De Novo souscrit aux commentaires :
la source
git reset
s'agit de modifier le "label" de la branche et éventuellement de mettre à jour l'index ou l'arbre de travail comme effet secondaire.git checkout
consiste à mettre à jour l'arborescence de travail et à changer de branche actuellement "sélectionnée" (laHEAD
).git reset
est à 100% sur leHEAD
. Il fonctionne même en mode HEAD détaché ( stackoverflow.com/a/3965714/6309 ), ce qui signifie où il n'y a pas de branche (!). git checkout fonctionne également en mode HEAD détaché, ou peut être utilisé pour extraire un SHA1 en mode HEAD détaché: là encore, aucune branche n'est impliquée dans ce cas.git checkout a839e8f
met à jour HEAD pour pointer pour validera839e8f
.Dans leur forme la plus simple,
reset
réinitialise l'index sans toucher l'arborescence de travail, tout encheckout
modifiant l'arborescence de travail sans toucher l'index.Réinitialise l'index pour correspondre
HEAD
, l'arbre de travail reste seul:Conceptuellement, cela extrait l'index dans l'arborescence de travail. Pour qu'il fasse réellement tout ce que vous devez utiliser
-f
pour le forcer à écraser les modifications locales. Il s'agit d'une fonction de sécurité pour vous assurer que le formulaire "sans argument" n'est pas destructeur: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, une balise ou un commit. Dans ce cas, il sera réinitialiséHEAD
et l'index de la validation donnée ainsi que l'exécution de l'extraction de l'index dans l'arborescence de travail.En outre, si vous fournissez
--hard
àreset
vous pouvez demanderreset
de remplacer l'arbre de travail ainsi que la réinitialisation de l'index.Si vous avez actuellement une branche extraite, il existe une différence cruciale entre
reset
etcheckout
lorsque vous fournissez une autre branche ou un commit.reset
changera la branche actuelle pour pointer sur la validation sélectionnée tandis quecheckout
laissera la branche actuelle seule mais extraira la branche ou la validation fournie à la place.Autres formes de
reset
etcommit
impliquent la fourniture de chemins.Si vous fournissez des chemins d'accès,
reset
vous ne pouvez pas fournir--hard
etreset
ne modifierez que la version d'index des chemins d'accès fournis en version dans la validation fournie (ouHEAD
si vous ne spécifiez pas de validation).Si vous fournissez des chemins à
checkout
, commereset
cela mettra à jour la version d'index des chemins fournis pour correspondre au commit fourni (ouHEAD
) mais il récupérera toujours la version d'index des chemins fournis dans l'arborescence de travail.la source
Un cas d'utilisation simple lors
de l'annulation d'une modification: 1. Utilisez reset si vous souhaitez annuler le transfert d'un fichier modifié.
2. Utilisez checkout si vous souhaitez annuler les modifications apportées aux fichiers non organisés.
la source
La principale différence en bref est que
reset
la référence de branche actuelle est déplacée , tandis quecheckout
contrairement à ce qui est le cas (elle déplace HEAD).Comme l'explique le livre Pro Git sous Réinitialiser démystifié ,
Voir aussi la réponse de VonC pour un texte très utile et un extrait du même article, que je ne reproduirai pas ici.
Bien sûr, il y a beaucoup plus de détails sur les effets
checkout
etreset
peuvent avoir sur l'index et l'arbre de travail, selon les paramètres utilisés. Il peut y avoir beaucoup de similitudes et de différences entre les deux commandes. Mais comme je le vois, la différence la plus cruciale est de savoir s'ils déplacent la pointe de la branche actuelle.la source
Les deux commandes (reset et checkout) sont complètement différentes.
checkout X
N'EST PASreset --hard X
Si X est un nom de branche,
checkout X
changera la branche actuelle tandis quereset --hard X
non.la source
brèves mnémoniques:
la source