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 ?
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 ?
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é .
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 ?
@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.
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 ?
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.
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".
@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.
@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.
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.
@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".
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.
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 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.
11 votes
Voir aussi stackoverflow.com/questions/964876/head-and-orig-head-in-git/
0 votes
Voir aussi comment défaire plusieurs commits en utilisant HEAD, ou comment faire un checkout vers plusieurs commits avant