Question Qu'est-ce que HEAD dans Git?


Vous voyez la documentation de Git disant des choses comme

La branche doit être entièrement fusionnée dans HEAD.

Mais qu'est-ce que Git HEAD exactement?


835
2018-02-20 22:58


origine


Réponses:


Vous pouvez penser à la tête comme la «branche actuelle». Lorsque vous changez de branche avec git checkout, la révision HEAD change pour pointer vers la pointe de la nouvelle branche.

Vous pouvez voir ce que HEAD pointe en faisant:

cat .git/HEAD

Dans mon cas, la sortie est:

$ cat .git/HEAD
ref: refs/heads/master

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


618
2018-02-20 23:00



Citer les autres gens:

Une tête est simplement une référence à un   commit objet. Chaque tête a un nom   (nom de la branche ou nom de l'étiquette, etc.) Par   par défaut, il y a une tête dans chaque   référentiel appelé maître. Un référentiel   peut contenir n'importe quel nombre de têtes. À   à tout moment, une tête est sélectionnée   comme la "tête actuelle". Cette tête est   alias à HEAD, toujours en majuscules ".

Notez cette différence: une "tête"   (minuscule) fait référence à l'un des   têtes nommées dans le référentiel; "TÊTE"   (majuscule) se réfère exclusivement à   tête actuellement active. Ce   distinction est utilisée fréquemment dans Git   Documentation.

Une autre bonne source qui couvre rapidement le fonctionnement interne de git (et donc une meilleure compréhension des têtes / HEAD) peut être trouvée ici. Les références (ref :) ou têtes ou branches peuvent être considérées comme des notes post-it collées sur des commits dans l'historique des commit. Habituellement, ils pointent vers le bout de la série de commits, mais ils peuvent être déplacés avec git checkout ou git revert etc.


143
2017-12-07 21:03



Je recommande cette définition du développeur github Scott Chacon [référence vidéo]:

Head est votre branche actuelle. C'est une référence symbolique. C'est une référence à une branche. Vous avez toujours HEAD, mais HEAD pointera vers l'un de ces autres pointeurs, vers l'une des branches sur laquelle vous vous trouvez. C'est le parent de votre prochain commit. C'est ce qui devrait être ce qui a été extrait pour la dernière fois dans votre répertoire de travail ... C'est le dernier état connu de votre répertoire de travail.

L'ensemble de la vidéo donnera une bonne introduction à l'ensemble du système git donc je vous recommande également de regarder tout si vous avez le temps de le faire.


44
2017-08-26 15:01



HEAD est juste un pointeur spécial qui pointe vers la branche locale sur laquelle vous êtes actuellement.

Du Pro Git Chapitre du livre 3.1 Branchement Git - Branches en bref, dans la section Créer une nouvelle branche:

Que se passe-t-il si vous créez une nouvelle succursale? Eh bien, cela crée une nouvelle   pointeur pour vous déplacer. Disons que vous créez une nouvelle branche   appelé test. Vous faites cela avec la commande git branch:

$ git branch testing 

Cela crée un nouveau pointeur sur le même commit que celui sur lequel vous êtes actuellement

enter image description here

Comment Git sait-il dans quelle branche vous êtes actuellement? Il garde un pointeur spécial appelé HEAD. Notez que c'est très différent de   le concept de HEAD dans d'autres VCS auxquels vous pourriez être habitué, comme   Subversion ou CVS. Dans Git, ceci est un pointeur vers la branche locale   vous êtes actuellement sur. Dans ce cas, vous êtes toujours maître. Le git   La commande de branche a seulement créé une nouvelle branche - elle n'est pas passée à cette branche   branche.

enter image description here


35
2018-03-09 20:02



En supposant qu'il ne s'agit pas d'un cas spécial appelé "détaché HEAD", alors, comme indiqué dans le livre O'Reilly Git, 2ème édition, p.69, HEAD veux dire:

HEAD se réfère toujours à la plus récente validation sur le courant   branche. Lorsque vous changez de branche, HEAD est mis à jour pour faire référence à la nouvelle   dernier commit de la branche.

alors

HEAD est la "pointe" de la branche actuelle.

Notez que nous pouvons utiliser HEAD pour faire référence à la validation la plus récente et utiliser HEAD~ comme le commit avant le pourboire, et HEAD~~ ou HEAD~2 comme le commettre encore plus tôt, et ainsi de suite.


26
2018-05-06 09:37



HEAD fait référence à la validation en cours vers laquelle pointe votre copie de travail, c'est-à-dire le commit que vous avez actuellement extrait. Du documentation officielle du noyau Linux sur la spécification des révisions Git:

HEAD nomme le commit sur lequel vous avez basé les changements dans l'arbre de travail.

Notez, cependant, que dans la prochaine version 1.8.4 de Git, @ peut également être utilisé comme un raccourci pour HEAD, comme noté par le contributeur de Git Junio ​​C Hamano dans son blog Git Blame:

Au lieu de taper "HEAD", vous pouvez dire "@" à la place, par ex. "git log @".

Utilisateur de débordement de pile VonC a également trouvé quelques des informations intéressantes sur pourquoi @ a été choisi comme un raccourci dans sa réponse à une autre question.

Il est également intéressant de noter que dans certains environnements, il n'est pas nécessaire de capitaliser HEAD, en particulier dans les systèmes d'exploitation qui utilisent des systèmes de fichiers insensibles à la casse, en particulier Windows et OS X.


17
2017-07-26 01:18



Jeter un coup d'œil à Créer et jouer avec des branches

HEAD est en fait un fichier dont le contenu détermine où la variable HEAD fait référence:

$ cat .git/HEAD
ref: refs/heads/master
$ cat .git/refs/heads/master
35ede5c916f88d8ba5a9dd6afd69fcaf773f70ed

Dans ce référentiel, le contenu du fichier HEAD fait référence à un second fichier nommé refs / têtes / maître. Le fichier refs / têtes / maître contient le hachage du commit le plus récent sur la branche master.

Le résultat est HEAD points à la validation de branche maître de la .git / refs / heads / master fichier.

enter image description here


12
2017-12-09 07:20



Je voudrais juste détailler quelques points dans la réponse acceptée de Greg Hewgil. Selon le Git Pocket Guide

Branche:

la branche elle-même est définie comme tous les points atteignables dans le commit   graphe du commit nommé (la "pointe" de la branche).

TÊTE: Un type spécial de Ref

La référence spéciale HEAD détermine la branche sur laquelle vous vous trouvez ...

Refs

Git définit deux types de références, ou des pointeurs nommés, qu'il appelle   "Refs":

  • Une référence simple, qui pointe directement vers un identifiant d'objet (généralement un commit ou un tag)
  • Un ref symbolique (ou symref), qui pointe vers un autre ref (simple ou symbolique)

Comme Greg l'a mentionné, HEAD peut être dans un "état détaché". Donc HEAD peut être soit un simple ref (pour une tête détachée) ou un symref.

si HEAD est une référence symbolique pour une branche existante, alors vous êtes "sur"   cette branche. Si, d'autre part, HEAD est un ref simple directement   nommer un commit par son ID SHA-1, alors vous n'êtes "sur" aucune branche, mais   plutôt en mode "détaché HEAD", ce qui se produit lorsque vous consultez certains   plus tôt s'engager à examiner.


8
2017-08-05 16:04



Je pense que 'HEAD' est en cours de validation. En d'autres termes, HEAD pointe vers le commit actuellement extrait.

Si vous venez de cloner et que vous n'avez pas vérifié, je ne sais pas à quoi il renvoie, probablement un endroit invalide.


4
2017-07-18 09:57