Notez d'abord que votre question témoigne d'une certaine incompréhension. origin/HEAD représente la branche par défaut sur le serveur distant. c'est-à-dire le HEAD qui se trouve dans le référentiel distant que vous appelez origine. Lorsque vous changez de branche dans votre dépôt, vous ne l'affectez pas. Il en va de même pour les branches distantes ; vous pouvez avoir master
y origin/master
dans votre dépôt, où origin/master
représente une copie locale de l master
dans le référentiel distant.
Le HEAD d'origine ne changera que si vous ou quelqu'un d'autre le modifie effectivement dans le référentiel distant. Vous voulez que la branche par défaut d'un dépôt public reste constante, sur la branche stable (probablement master). origin/HEAD est une référence locale représentant une copie locale du HEAD dans le référentiel distant. (Son nom complet est refs/remotes/origin/HEAD.)
Je pense que ce qui précède répond à ce que vous vouliez vraiment savoir, mais pour aller de l'avant et répondre à la question que vous avez explicitement posée... origin/HEAD est défini automatiquement lorsque vous clonez un dépôt, et c'est à peu près tout. Bizarrement, que ce soit no définies par des commandes telles que git remote update
- Je crois que le seul moyen de le modifier est de le faire manuellement. (Par changer, je veux dire pointer vers une branche différente ; évidemment le commit vers lequel il pointe change si cette branche change, ce qui peut arriver lors d'un fetch/pull/mise à jour à distance).
Editar : Le problème évoqué ci-dessous a été corrigé dans Git 1.8.4.3 ; voir cette actualisation .
Il y a cependant un petit bémol. HEAD est une référence symbolique, pointant vers une branche plutôt que directement vers un commit, mais les protocoles de transfert à distance de Git ne rapportent que les commits pour les refs. Ainsi, Git connaît le SHA1 du commit pointé par HEAD et tous les autres refs ; il doit ensuite déduire la valeur de HEAD en trouvant une branche qui pointe vers le même commit. Cela signifie que si deux branches pointent vers HEAD, c'est ambigu. (Je crois qu'il choisit master si possible, puis retombe sur la première dans l'ordre alphabétique). Vous verrez cela dans la sortie de git remote show origin
:
$ git remote show origin
* remote origin
Fetch URL: ...
Push URL: ...
HEAD branch (remote HEAD is ambiguous, may be one of the following):
foo
master
Curieusement, bien que la notion de HEAD imprimée de cette façon change si les choses changent sur le distant (par exemple si foo est supprimé), elle ne met pas réellement à jour refs/remotes/origin/HEAD
. Cela peut conduire à des situations vraiment étranges. Disons que dans l'exemple ci-dessus, origin/HEAD pointait en fait vers foo, et que la branche foo d'origin a ensuite été supprimée. Nous pouvons alors faire ceci :
$ git remote show origin
...
HEAD branch: master
$ git symbolic-ref refs/remotes/origin/HEAD
refs/remotes/origin/foo
$ git remote update --prune origin
Fetching origin
x [deleted] (none) -> origin/foo
(refs/remotes/origin/HEAD has become dangling)
Ainsi, même si le show distant sait que HEAD est master, il ne met rien à jour. La branche foo qui est périmée est correctement élaguée, et HEAD est en suspens (pointant vers une branche inexistante). toujours ne le met pas à jour pour pointer vers le maître. Si vous voulez corriger cela, utilisez git remote set-head origin -a
qui détermine automatiquement le HEAD de l'origine comme ci-dessus, puis définit effectivement origin/HEAD pour pointer vers la branche distante appropriée.
0 votes
Notez que cette question concerne les références symboliques locales sur les ordinateurs distants, comme par exemple
refs/origin/HEAD
. Il ne s'agit pas de la façon dont la référence symbolique propre à un référentielHEAD
se met en place.