web-dev-qa-db-fra.com

Qu'est-ce que le HEAD dans git?

Il semble y avoir une différence entre le dernier commit, le HEAD) et l'état du fichier que je peux voir dans mon répertoire.

Qu'est-ce que HEAD, que puis-je en faire et quelle erreur dois-je éviter?

217
e-satis

HEAD est une référence au dernier commit de la branche actuellement extraite.


Il y a une petite exception à cela, qui est la tête détachée. Un tête détachée est la situation dans laquelle vous vous retrouvez chaque fois que vous extrayez un commit (ou une balise) au lieu d'une branche. Dans ce cas, vous devez imaginer ceci comme une branche temporaire sans nom; Ainsi, au lieu d'avoir une référence de branche nommée, nous niquement avons HEAD. Cela vous permettra toujours de faire des commits (ce qui mettra à jour HEAD), donc la définition courte ci-dessus est toujours vraie si vous pensez à un détaché HEAD comme une branche temporaire sans nom.

173
poke

HEAD est une référence (référence) au commit actuellement extrait.

Dans des états normaux, il s’agit en fait d’une référence symbolique à la branche que vous avez extraite. Si vous regardez le contenu de .git/HEAD, vous verrez quelque chose comme "ref: refs/heads/master". La branche elle-même est une référence au commit situé au sommet de la branche. Par conséquent, dans l'état normal, HEAD fait effectivement référence au commit à la pointe de la branche actuelle.

Il est également possible d'avoir une "tête détachée". Cela se produit lorsque vous extrayez quelque chose en plus d'une branche (locale), comme une branche distante, une validation spécifique ou une balise. L'endroit le plus courant pour voir cela est lors d'une modification de base interactive, lorsque vous choisissez de modifier un commit. Dans détaché HEAD état, votre HEAD est une référence directe à un commit - le contenu de .git/HEAD sera un hachage SHA1.

De manière générale, HEAD est un nom commode pour signifier "ce que vous avez emprunté" et vous n'avez pas vraiment à vous inquiéter à ce sujet. Soyez juste conscient de ce que vous avez emprunté, et rappelez-vous que vous ne voulez probablement pas vous engager si vous n'êtes pas sur une branche (état détaché HEAD)), sauf si vous savez ce que vous faites (par exemple, vous vous trouvez dans une base interactive).

84
Cascabel

Pointeur HEAD dans Git

Git maintient une variable de référence appelée HEAD. Et nous appelons cette variable un pointeur, car son objectif est de référencer ou de pointer vers un commit spécifique du référentiel. Au fur et à mesure que nous faisons de nouveaux commits, le pointeur va changer ou se déplacer pour pointer vers un nouveau commit. HEAD pointe toujours vers le sommet de la branche actuelle de notre référentiel. À présent, cela concerne notre référentiel, et non notre index de transfert, ou notre répertoire de travail.

Une autre façon de penser est le dernier état de notre référentiel ou ce qui a été extrait, et comme c'est là où le référentiel s'est arrêté ou le dernier état, vous pouvez également dire que le HEAD points au parent du prochain commit ou à l’endroit où l’écriture du commit aura lieu.

Je pense qu'une bonne métaphore à penser à cela est la tête de lecture et d'enregistrement sur un magnétophone à cassettes. Lorsque nous commençons l’enregistrement audio, la bande passe au-delà de la tête et elle enregistre sur celle-ci. lorsque nous appuierons sur Stop, le lieu où la tête d’enregistrement est arrêtée est l’endroit où l’enregistrement reprendra lorsque nous appuierons une seconde fois sur Enregistrer. Maintenant, nous pouvons nous déplacer, nous pouvons déplacer la tête à différents endroits, lorsque nous cliquons à nouveau sur Record, c'est là que l'enregistrement commencera.

Le pointeur HEAD dans Git est très similaire, il pointe à l'endroit où nous allons commencer l'enregistrement suivant. C'est l'endroit où nous avons laissé dans notre référentiel les éléments que nous avons déjà enregistrés. engagé.

14
Suhail Gupta

Cela aurait dû être un commentaire, mais c'est trop long pour un commit

J'ai toujours pensé HEAD~5 signifie GO à 5 commits avant. Mais il ne porte pas la partie GO de la commande. Il ne porte que la référence/'où aller' de la commande .

En termes simples, il est utilisé pour répondre à la question de: dois-je aller? A quel commit?

Si tu le dis

HEAD signifie (la référence au) commit en cours

HEAD~1 _ signifie (la référence à) 1 commit avant

HEAD~87 _ signifie (la référence à) 87 commet avant

git checkout HEAD~1 va réellement aller à cette référence/commettre

13
Honey

En termes simples, HEAD est une référence au dernier commit de la branche de sortie actuelle.

Considérez le HEAD comme la "branche actuelle". Lorsque vous changez de branche avec git checkout, la révision HEAD change pour indiquer la pointe de la nouvelle branche. .

Vous pouvez voir ce que HEAD pointe en faisant:

cat .git/HEAD

Il est possible pour HEAD de faire référence à une révision spécifique qui n'est pas associée à un nom de branche. Cette situation est appelée une HEAD détachée.

0
Tester Man