Que signifient vraiment les vérifications git?

93

Que sont les checkouts dans git?

Je sais qu'une fois que vous faites checkoutà une branche particulière, les HEADpoints à cette branche. Mais qu'est-ce que cela signifie vraiment? Cela signifie-t-il que je peux ensuite travailler sur cette branche? Si oui, alors, sans avoir vérifié une succursale, je ne peux pas y travailler?

Aussi, qu'est-ce que cela remote checkoutsignifie? En quoi est-ce utile?

daehaai
la source
1
Aucun pris. Oui, je l'ai et je tombe sur la théorie de ce que cela signifie. c'est-à-dire pointez sur HEAD, etc.
daehaai
24
@antonijn - j'ai essayé de googler la question - c'est le premier résultat - un peu triste qu'une fois ici, j'ai vu que la question était close et que cette attitude folle que tout le monde a - je viens de TFS, et je Je commence à penser que "Checkout" signifie quelque chose de complètement différent dans GIT. Je veux savoir ce que cela signifie dans git-land.
BrainSlugs83

Réponses:

57

Comme vous l'avez noté, HEADest une étiquette indiquant où vous vous trouvez dans l'arborescence de validation. Il bouge avec vous lorsque vous passez d'un commit à un autre. git checkout <commit>est le mécanisme de base pour se déplacer dans l'arborescence de commit, en déplaçant votre focus ( HEAD) vers le commit spécifié.

La livraison peut être spécifiée par l' une de plusieurs façons, commettre hachage, nom de la branche, le nom de la balise, la syntaxe relative ( HEAD^, HEAD~1, etc.) et ainsi de suite. Il est souvent utile de considérer une extraction comme un changement de branche, et certaines options fonctionnent dans cette perspective, mais elles font toutes référence à des commits.

Le retrait d'un commit a des effets secondaires autres que le déplacement HEAD.

  • Le répertoire de travail est mis à jour à l'état du commit extrait.
  • si un nom de branche est spécifié, l'extraction rend cette branche active. La branche active se déplacera avec tous les nouveaux commits ajoutés.
    • avec l' -boption, une nouvelle branche sera créée en fonction du commit actuel, puis rendue active.
    • avec l' --trackoption la branche extraite peut être mise au courant d'une branche distante
    • avec l' --orphanoption une nouvelle branche est créée (comme avec -b) mais ne sera basée sur aucun commit existant.

Il y a quelques autres options, que vous pouvez lire dans la page de manuel de git checkout , qui tournent toutes autour du passage d'un commit à un autre - en variant simplement l'effet de ce mouvement en plus du déplacement HEAD.

David Culp
la source
Donc, il semble que "checkout" signifie quelque chose de complètement différent (par rapport à TFS de toute façon - l'équivalent TFS serait "d'obtenir" un "changeset" particulier). Heureux d'avoir recherché ça! - y a-t-il une constante magique pour "dernier"? (dans TFS c'est "T") - de cette façon, nous pouvons simplement télécharger la dernière version du code sans connaître l'étiquette "HEAD"?
BrainSlugs83
1
Si vous êtes sur une branche, le nom de la branche est le dernier commit pour cette branche - si vous n'êtes pas sur une branche, vous êtes sur le dernier commit. J'utiliserais la commande log pour trouver le commit le plus récent dans le référentiel sans tenir compte de la branche, puis y passer manuellement - mais je suis sûr qu'il peut être automatisé si nécessaire.
David Culp
À propos du dernier paragraphe: veuillez noter que git checkout <commit> <path>ne change pas de branche.
galath le
Votre explication n'est pas mal , mais vous avez oublié un très important (et potentiellement dangereux) cas d' utilisation: git checkout <path>.
Eric Duminil
24

Laissez-moi vous expliquer quelques cas d'utilisation de l'extraction avec un fichier, un dossier et des branches afin qu'il puisse être utile pour la compréhension.

Disons que nous avons un dossier nommé devet que index.htmltout est suivi et que le répertoire de travail est propre.

Si je change accidentellement le nom du fichier index.htmlet que je veux annuler cela, je vais simplement l'utiliser, git checkout index.htmlil récupérera cet état de fichier à partir de la branche actuellement sélectionnée du référentiel.

Maintenant, si j'ai fait un changement dans le devdossier et que je veux le récupérer. Je peux utiliser, git checkout devmais que se passe-t-il s'il y a déjà une branche nommée devau lieu de vérifier ce dossier, cela va abaisser cette branche. Pour éviter cela, je préfère le faire git checkout -- dev.

Maintenant, ici, le double tiret nu représente la branche actuelle et demande à git le dossier devde la branche actuellement sélectionnée.

De même, si je le fais git checkout alpha dev, le dossier dev sera extrait de la branche alpha.

Cette réponse est pour votre première question 'git checkout vraiment signifie'.

bawa g
la source
2
Dans votre dernière ligne Cette réponse est pour votre première question «git checkout vraiment signifie». êtes-vous en train de vérifier le dossier «vraiment» de la branche «moyenne»: P
Paramvir Singh Karwal
22

"Extraire" signifie que vous prenez n'importe quel commit donné du référentiel et recréez l'état du fichier et de l'arborescence de répertoires associés dans le répertoire de travail.

Lorsque vous extrayez un commit qui n'est pas une tête de branche (par exemple git checkout HEAD~2), vous êtes sur une tête dite détachée . Vous pouvez créer des commits ici, mais une fois que vous passez à une autre branche, ces commits ne seront pas récupérables par un nom de branche et pourraient même être supprimés par le ramasse-miettes après un certain temps.

Michael Wild
la source