1271 votes

Qu'est-ce que HEAD dans Git ?

Vous voyez la documentation Git dire des choses comme

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

Mais qu'est-ce que Git HEAD exactement ?

946voto

Greg Hewgill Points 356191

Vous pouvez considérer le HEAD comme la "branche actuelle". Lorsque vous changez de branche avec git checkout la révision HEAD change pour pointer vers l'extrémité de la nouvelle branche.

Vous pouvez voir ce que HEAD indique 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 HEAD détaché .

66 votes

Donc git HEAD est dépendant du contexte de la BRANCHE sur laquelle vous êtes, correct ? Encore plus loin, usted en tant que développeur ? Je suppose que je demande : est-ce que Git HEAD va être une chose globale à l'échelle du dépôt, ou individuelle pour chaque développeur ?

119 votes

@bobobo : C'est exact, HEAD est comme un pointeur qui pointe vers la branche actuelle. Lorsque vous extrayez une branche différente, HEAD change pour pointer vers la nouvelle branche. Le HEAD actuel est local à chaque dépôt, et est donc individuel pour chaque développeur.

0 votes

Cela explique aussi pourquoi, lorsqu'on pousse des révisions vers un dépôt "central" distant, qui n'a pas de HEAD puisqu'il n'a pas de copie de travail extraite, on pousse généralement le HEAD du dépôt local vers la branche master du dépôt distant, n'est-ce pas ?

232voto

Silfheed Points 2818

Je cite d'autres personnes :

Une tête est simplement une référence à un objet commit. Chaque head a un nom (nom de la branche ou nom du tag, etc). Par par défaut, il y a une tête dans chaque référentiel appelé master. Un dépôt peut contenir un nombre quelconque de têtes. A moment donné, une tête est sélectionnée comme la "tête courante". Cette tête est alias HEAD, toujours en majuscules".

Notez cette différence : une "tête" (minuscule) fait référence à n'importe laquelle des têtes têtes nommées dans le référentiel ; "HEAD" (majuscule) fait (majuscule) se réfère exclusivement à la tête tête actuellement active. Ce distinction est fréquemment utilisée dans la .

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

1 votes

De ça : "Chaque tête a un nom". Et "une tête est sélectionnée comme la "tête actuelle". Cette tête est aliasée HEAD". Donc j'en conclus que "HEAD" ne se réfère pas à la situation de l'état "detached HEAD".

2 votes

@gxyd si c'est le cas, HEAD ne pointe pas vers une 'tête', c'est un HEAD détaché. Il pointe vers le commit id du commit que vous avez spécifié (en utilisant, par exemple, git checkout HEAD~2 ), qui n'est pas l'identifiant de commit d'une tête connue. Voir l'article à eagain.net/articles/git-for-computer-scientists pour une explication plus approfondie.

3 votes

@Silfheed : En général, je pense que cette réponse est conceptuellement plus saine que celle acceptée (même si l'utilisation de la minuscule "tête" pour se référer à une branche confond beaucoup de gens). Cependant, git revert n'est pas un bon exemple de déplacement d'une branche pour ne pas être à la pointe, car git revert crée juste de nouveaux commits et laisse toujours la branche actuelle à la (nouvelle) pointe.

68voto

jasoares Points 1219

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 lesquelles vous vous trouvez. C'est le parent de votre prochain commit. C'est ce qui devrait être le dernier check-out dans votre répertoire de travail... C'est le dernier état connu de ce qu'était votre répertoire de travail.

L'ensemble de la vidéo donne une bonne introduction à l'ensemble du système git. Je vous recommande donc de la regarder en entier si vous en avez le temps.

44 votes

Donc la vraie définition est "le parent de votre prochain commit".

1 votes

Et aussi "le truc qui pointe vers la prochaine branche qui va bouger".

0 votes

@nicolas - Je ne sais pas pensez à c'est vrai. HEAD peut pointer sur n'importe quel commit, il ne doit pas nécessairement pointer sur une branche - quand ce n'est pas le cas, vous êtes en mode "detached HEAD".

46voto

動靜能量 Points 33008

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

HEAD fait toujours référence à la livraison la plus récente de la branche courante courante. Lorsque vous changez de branche, HEAD est mis à jour pour faire référence à la nouvelle pour faire référence au dernier commit de la nouvelle branche.

donc

HEAD est la "pointe" de la branche en cours .

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

29voto

Cupcake Points 22154

HEAD fait référence au commit actuel vers lequel pointe votre copie de travail, c'est-à-dire le commit que vous avez actuellement pris en check-out. 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 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 Git Junio C Hamano dans son blog Git Blame :

Au lieu de taper "HEAD", vous pouvez dire "@", par exemple "git log @".

Utilisateur de Stack Overflow VonC a également trouvé des des informations intéressantes sur les raisons pour lesquelles @ a été choisi comme 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 d'utiliser la majuscule HEAD Les systèmes d'exploitation qui utilisent des systèmes de fichiers insensibles à la casse, en particulier Windows et OS X, sont particulièrement sensibles à la casse.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X