QU'est-ce que HEAD in Git?

vous voyez la documentation Git dire des choses comme

la succursale doit être entièrement fusionnée dans le chef.

mais qu'est-ce que git HEAD exactement?

855
git
demandé sur nbro 2010-02-21 01:58:13

16 réponses

vous pouvez penser à la tête comme la"branche courante". 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 la TÊTE de points en faisant:

cat .git/HEAD

Dans mon cas, la sortie est:

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

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 un tête détachée .

634
répondu Greg Hewgill 2010-02-20 23:00:49

pour citer autres personnes :

une tête est simplement une référence à un objet commit. Chaque tête a un nom (nom de la branche ou de l'étiquette, etc.). Par par défaut, il y a une tête dans chaque référentiel appelé le maître. Référentiel peut contenir n'importe quel nombre de têtes. À un moment donné, une tête est sélectionné le "courant de tête."Cette tête est un alias de la TÊTE, toujours en capitales".

noter ce différence: une "tête" (en minuscules) se réfère à l'un quelconque des têtes nommées dans le dépôt; " tête" (en majuscules) se réfère exclusivement à l' actuellement active de la tête. Ce la distinction est utilisée fréquemment dans le Git documentation.

une autre bonne source qui couvre rapidement le fonctionnement interne de git (et donc une meilleure compréhension de têtes/tête) peut être trouvé ici . Les références (réf:) ou têtes ou branches peuvent être considérées comme similaires notes post-it collé sur s'engage dans la validation de l'histoire. Généralement 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.

150
répondu Silfheed 2013-05-07 23:25:48

je recommande cette définition de Scott Chacon, développeur de github [ référence vidéo ]:

chef est votre branche actuelle. C'est une référence symbolique. C'est une référence à une branche. Vous avez toujours la tête, mais la tête pointera vers l'un de ces autres indices, vers l'une des branches sur lesquelles vous êtes. C'est le parent de votre prochain engagement. C'est ce qui devrait être ce qui a été vérifié pour la dernière fois dans votre répertoire de travail... Ce est le dernier état connu de ce que votre répertoire de travail a été.

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

45
répondu jasoares 2018-04-18 16:21:23

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

De la Pro Git livre, chapitre 3.1 Git Ramification des Branches en un Mot , dans la section Création d'une Nouvelle Branche :

que se passe-t-il si vous créez une nouvelle branche? Bien, cela crée une nouvelle pointeur pour vous déplacer. Disons que vous créez une nouvelle branche appelle test. Vous faites cela avec la commande de la branche git:

$ git branch testing 

cela crée un nouveau pointeur à la même propagation que vous êtes actuellement sur

enter image description here

comment Git sait-il sur quelle branche vous êtes actuellement? Il garde un pointeur spécial appelé tête. Notez que c'est très différent que d' le concept de tête dans D'autres VCSs vous pouvez être habitués, tels que Subversion ou CVS. Dans Git, c'est un pointeur vers la branche locale vous êtes actuellement sur. Dans ce cas, vous êtes toujours maître. Git le commandement de branche n'a créé qu'une nouvelle branche - il n'est pas passé à cela direction.

enter image description here

39
répondu Alexandr 2018-07-18 20:24:54

en présumant qu'il ne s'agit pas d'un cas spécial appelé "tête détachée", alors, comme il est indiqué dans le O'Reilly Git book, 2e édition, p. 69, HEAD means:

HEAD se réfère toujours à l'engagement le plus récent sur le courant direction. Lorsque vous changez de branche, HEAD est mis à jour pour se référer à la nouvelle le dernier engagement de branch.

donc

HEAD est l' "conseil" de la branche .

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

28
répondu 太極者無極而生 2016-05-10 12:01:08

HEAD se réfère à la commit courante à laquelle renvoie votre copie de travail, c'est-à-dire la commit que vous avez actuellement cochée. De la documentation officielle du noyau Linux sur la spécification des révisions Git :

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

noter, 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 Git Junio C. Hamano dans son blog de blâme Git :

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

Stack Overflow user VonC a également trouvé quelques informations intéressantes sur la raison pour laquelle @ a été choisi comme raccourci dans sa réponse à une autre question .

également intéressant, 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 non sensibles à la casse, en particulier Windows et OS X.

19
répondu Community 2017-05-23 12:10:48

regardez créer et jouer avec des branches

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

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

dans ce dépôt, le contenu du fichier principal fait référence à un second fichier appelé refs/heads/master . Le fichier refs/heads / master contient le hachage du plus récent commit sur la branche master.

le résultat est des HEAD points à la commit master branch du .git/refs/heads/master "151990920 de fichier".

enter image description here

14
répondu onmyway133 2013-12-09 07:25:50

J'aimerais juste détailler quelques détails dans la réponse acceptée de Greg Hewgil. Selon le Git Guide de poche

branche:

la branche elle-même est définie comme tous les points accessibles dans le commit graphique de la commettre (le "conseil" de la branche).

tête: un type spécial de Ref

le chef de la réf spéciale détermine sur quelle branche vous êtes...

Réfs

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

  • Un simple ref, qui pointe directement vers un ID de l'objet (généralement un commit ou tag)
  • un ref symbolique (ou symref), qui pointe vers un autre ref (soit simple ou symbolique)

comme Greg l'a mentionné, tête peut être dans un"état détaché". Ainsi la tête peut être soit un simple réf (pour une tête détachée) ou un symref.

si HEAD est un réf symbolique pour une branche existante, alors vous êtes " sur" cette branche. Si, d'autre part, la tête est un simple ref directement nommer un commit par son ID SHA-1, alors vous n'êtes pas "sur" n'importe quelle branche, mais plutôt en mode "tête détachée", ce qui arrive quand vous découvrez quelques-uns des plus tôt s'engagent à examiner.

10
répondu mike 2013-08-05 23:54:58

je pense que le "CHEF" est en cours découvrez commettre. En d'autres termes, "HEAD" renvoie à l'engagement qui est actuellement vérifié.

si vous venez de cloner et n'avez pas vérifié, Je ne sais pas ce qu'il indique, probablement un endroit invalide.

5
répondu Nataraj 2012-07-18 09:57:29

une excellente façon de conduire à la maison le point fait dans les bonnes réponses est de courir git reflog HEAD , vous obtenez une histoire de tous les endroits tête a pointé.

4
répondu tjb 2012-05-12 19:27:21

après avoir lu toutes les réponses précédentes, je voulais encore plus de clarté. Ce blog sur le site officiel de git http://git-scm.com/blog m'a donné ce que je cherchais:

La TÊTE: Pointeur vers le dernier commit instantané, à côté des parents

La TÊTE dans Git est le pointeur à la branche de référence, qui est à son tour un pointeur à la dernière validation que vous fait ou le dernier commit qui a été vérifié dans votre répertoire de travail. Cela signifie également qu'il sera le parent du prochain commit que vous ferez. Il est généralement plus simple de penser à lui comme tête est le cliché de votre dernier commit.

4
répondu user3751385 2014-09-27 15:42:41

pointe vers l'extrémité de la branche actuellement vérifiée.

enter image description here

dans votre dépôt, il y a un .dossier git. Ouvrez le fichier à cet emplacement: .git\ref\têtes. Le code (SHA-1 hash) dans ce fichier (master dans la plupart des cas) sera le plus récent, I. e celui vu dans la sortie de la commande git log . Plus d'infos sur le .dossier git: http://gitready.com/advanced/2009/03/23/whats-inside-your-git-directory.html

4
répondu stack1 2015-11-13 19:43:02

on dirait que HEAD n'est qu'une balise pour le dernier commit que vous avez vérifié.

Cela peut être l'extrémité d'une branche spécifique (comme le "maître") ou de certains d'entre commit de la branche ("isolé")

1
répondu Vertexwahn 2018-08-15 01:10:54

ces deux - là peuvent vous confondre:

tête

pointant vers des références nommées qu'une direction générale a récemment soumises. Sauf si vous utilisez la référence du paquet , les têtes sont typiquement stockées dans $ GIT_DIR/refs/heads/.

HEAD

branche courante, ou votre arbre de travail est généralement généré à partir de la tête de l'arbre pointe. Tête doit pointer vers une tête, sauf que vous utilisez une tête détachée.

0
répondu Marcus Thornton 2013-08-16 12:26:04

regardez http://git-scm.com/book/en/Git-Branching-What-a-Branch-Is

à la Figure 3-5. Le fichier principal indique la branche sur laquelle vous êtes.

-1
répondu Ting Wang 2014-08-07 20:27:52

comme un concept, la tête est la dernière révision dans une branche. Si vous avez plus d'une tête par branche nommée, vous l'avez probablement créée en faisant des propagations locales sans fusionner, créant effectivement une branche non nommée.

pour avoir un dépôt" propre", vous devez avoir une tête par branche nommée et toujours fusionner à une branche nommée après avoir travaillé localement.

C'est également vrai pour Mercurial .

-4
répondu dukeofgaming 2012-03-26 20:44:07