Observe primeiro que sua pergunta mostra um pouco de mal-entendido. origin / HEAD representa o ramo padrão no controle remoto , ou seja, o HEAD que está no repositório remoto que você está chamando de origem. Quando você muda de ramificação no seu repositório, não está afetando isso. O mesmo vale para ramificações remotas; você pode ter mastere origin/masterem seu repositório , onde origin/masterrepresenta uma cópia local da masterramificação no repositório remoto.
O HEAD da origem só mudará se você ou alguém realmente o alterar no repositório remoto , o que basicamente nunca deve acontecer - você deseja que o ramo padrão de um repositório público permaneça constante, no ramo estável (provavelmente mestre). origin / HEAD é uma referência local que representa uma cópia local da HEAD no repositório remoto. (Seu nome completo é refs / remotes / origin / HEAD.)
Eu acho que as respostas acima respondem ao que você realmente queria saber, mas para ir em frente e responder à pergunta que você fez explicitamente ... origin / HEAD é definido automaticamente quando você clona um repositório, e é isso. Estranhamente, que é não definir por comandos como git remote update- Eu acredito que a única maneira que vai mudar é se você alterá-lo manualmente. (Por mudança, quero dizer apontar para um ramo diferente; obviamente, o commit aponta para alterações se esse ramo mudar, o que pode acontecer na busca / retirada / atualização remota.)
Edit : O problema discutido abaixo foi corrigido no Git 1.8.4.3 ; veja esta atualização .
Há uma pequena ressalva, no entanto. HEAD é uma referência simbólica, apontando para uma ramificação em vez de diretamente para uma confirmação, mas os protocolos de transferência remota do git somente confirmam para refs. Portanto, o Git conhece o SHA1 do commit apontado pelo HEAD e todos os outros árbitros; ele deve deduzir o valor de HEAD localizando um ramo que aponte para o mesmo commit. Isso significa que, se dois ramos apontarem para lá, é ambíguo. (Acredito que ele seleciona o mestre, se possível, e volta ao primeiro em ordem alfabética.) Você verá isso relatado na saída 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
Estranhamente, embora a noção de HEAD impressa dessa maneira mude se as coisas mudarem no controle remoto (por exemplo, se o foo for removido), ele não será atualizado refs/remotes/origin/HEAD. Isso pode levar a situações realmente estranhas. Diga que, no exemplo acima, origin / HEAD realmente apontou para foo, e o ramo foo da origem foi removido. Podemos então fazer o seguinte:
$ 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)
Portanto, mesmo que o programa remoto saiba que HEAD é mestre, ele não atualiza nada. O ramo foo obsoleto é podado corretamente e o HEAD fica danificado (apontando para um ramo inexistente), e ainda não o atualiza para apontar para o mestre. Se você deseja corrigir isso, use git remote set-head origin -a, que determina automaticamente o HEAD da origem como acima e, em seguida, defina o origin / HEAD para apontar para o ramo remoto apropriado.
refs/origin/HEAD. Não se trata de como a referência simbólica do repositórioHEADé definida.