Eu tenho um ramo configurado para rastrear uma referência na origem. git checkout <branchname>
alterna para esse ramo, e um git status
me mostrará o quão à frente ou atrás do meu ramo é de origem, mas estou surpreso que origin/HEAD
ainda aponte para origin/master
, e nãoorigin/<branchname>
Então, minha pergunta é: em que circunstâncias a origem / HEAD é movida?
EDITAR:
Agradeço as respostas sobre como mover a origem / HEAD, mas estou interessado no que "organicamente" a move, fora de mim explicitamente dizendo para fazê-lo.
Por exemplo, quando troco de ramificação, o git faz com que HEAD aponte para a ramificação que estou verificando, então fico surpreso que origem / HEAD não se mova da mesma maneira.
refs/origin/HEAD
. Não se trata de como a referência simbólica do repositórioHEAD
é definida.Respostas:
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
master
eorigin/master
em seu repositório , ondeorigin/master
representa uma cópia local damaster
ramificaçã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
: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: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.fonte
git remote set-head origin -a
fez o trabalho para mimÉ a sua configuração como proprietário do seu repo local. Altere assim:
E origin / HEAD apontará para o seu ramo em vez do mestre. Isso se aplicaria apenas ao seu repositório e não a outros. Por padrão, ele apontará para mestre, a menos que algo mais tenha sido configurado no repositório remoto.
A entrada manual para o cabeçote remoto fornece algumas boas informações sobre isso.
Edit: para enfatizar: sem você dizer, a única maneira de "mover" seria um caso como renomear o ramo principal , que eu não acho que seja considerado "orgânico". Então, eu diria organicamente que não se move.
fonte
O que move a origem / CABEÇA "organicamente"?
git clone
define uma vez para o local em que HEAD está na origemgit clone
O que representa HEAD na origem?
git clone
utiliza de tal maneiraO que define origem / HEAD?
git clone
busca e definegit fetch
atualizá-lo como qualquer outra referência, mas nãogit remote set-head origin -a
busca e defineCuriosidades
origin/HEAD
também pode ser definido para qualquer outro valor sem entrar em contato com o controle remoto:git remote set-head origin <branch>
fonte
origin/HEAD
e sua solução ajudou. Obrigado!git fetch
atualizá-lo, pois ele permite configurar um atalho (local). Citando o documento: "Não é necessário ter uma ramificação padrão para um controle remoto, mas permite que o nome do controle remoto seja especificado no lugar de uma ramificação específica". Seria estranho se uma alteração remota atualizasse atalhos configurados localmente.origin/HEAD
é um nome ruim. E issogit clone
usa um nome remoto como padrão para uma "ramificação configurada localmente" também contradiz isso. Em repositórios não vazios, nem faz sentido usar a corrente do controle remotoHEAD
.Isenção de responsabilidade : esta é uma atualização da resposta de Jefromi , que estou escrevendo para poupar algum tempo os curiosos.
Tentei em vão replicar (no Git 2.0.1) a
remote HEAD is ambiguous
mensagem que Jefromi menciona em sua resposta; então eu pesquisei um pouco (clonando https://github.com/git/git e pesquisando no log). Costumava ser isso(Confirmação
4229f1fa325870d6b24fe2a4c7d2ed5f14c6f771
, datada de 27 de fevereiro de 2009, encontrada comgit log --reverse --grep="HEAD is ambiguous"
)No entanto, a ambiguidade em questão foi levantada desde então :
(Confirmação
9196a2f8bd46d36a285bdfa03b4540ed3f01f671
, 8 de novembro de 2013, encontrada comgit log --grep="ambiguous" --grep="HEAD" --all-match
)Editar (graças a torek ):
Isso significa que, se você estiver usando o Git v1.8.4.3 ou posterior , não deverá encontrar nenhum problema ambíguo-remoto-HEAD.
fonte
Lembre-se de que estamos falando de dois repositórios git independentes. Seu repositório local com seu código e o controle remoto sendo executado em outro lugar.
Você está certo, quando você altera uma ramificação, HEAD aponta para sua ramificação atual. Tudo isso está acontecendo no seu repositório git local. Não o repositório remoto, que poderia pertencer a outro desenvolvedor, ou localização em um servidor no seu escritório, ou github, ou outro diretório no sistema de arquivos, etc.
Seu computador (repositório local) não pode alterar o ponteiro HEAD no repositório remoto do git. Poderia pertencer a um desenvolvedor diferente, por exemplo.
Mais uma coisa, o que o computador chama de origem / XXX é o entendimento do computador sobre o estado do controle remoto no momento da última busca.
Então, o que "organicamente" atualizaria a origem / HEAD? Seria atividade no repositório remoto do git. Não é o seu repo local.
As pessoas mencionaram
Normalmente, isso é usado quando há um repositório git central compartilhado em um servidor para ser usado pela equipe de desenvolvimento. Seria um comando executado no computador remoto. Você veria isso como atividade no repositório remoto do git.
fonte
Execute os seguintes comandos no git CLI:
fonte