Por que meu repository do Git entrou em um estado HEAD separado?

Eu acabei com uma cabeça desconectada hoje, o mesmo problema descrito em: git push diz tudo atualizado mesmo que eu tenha alterações locais

Tanto quanto eu sei que eu não fiz nada fora do comum, apenas comete e empurra do meu repository local.

Então, como acabei com uma detached HEAD ?

Qualquer checkout de um commit que não seja o nome de um de seus branches lhe dará um HEAD separado. Um SHA1 que representa a ponta de um ramo ainda fornece um HEAD separado. Apenas um checkout de um nome de filial local evita esse modo.

Veja comprometendo-se com uma CABEÇA desanexada

Quando o HEAD é desanexado, os commits funcionam normalmente, exceto que nenhuma ramificação nomeada é atualizada. (Você pode pensar nisso como um ramo anônimo.)

texto alternativo

Por exemplo, se você fizer o checkout de um “branch remoto” sem rastreá-lo primeiro, você pode acabar com um HEAD separado.

Veja git: switch branch sem desappend a cabeça

Eu reproduzi isso agora por acidente:

  1. lista os ramos remotos

     git branch -r origin/Feature/f1234 origin/master 
  2. Eu quero verificar um localmente, então eu cortei colar:

     git checkout origin/Feature/f1234 
  3. Presto! Estado HEAD separado

     You are in 'detached HEAD' state. [...]) 

Solução # 1:

Não inclua origin/ na frente da especificação da minha agência ao fazer o check out:

 git checkout Feature/f1234 

Solução 2:

Adicione o parâmetro -b que cria um ramo local a partir do controle remoto

git checkout -b origin/Feature/f1234 ou

git checkout -b Feature/f1234 voltará a origem automaticamente

experimentar

 git reflog 

Isso lhe dá um histórico de como seus pointers HEAD e Branch foram movidos no passado.

por exemplo :

88ea06b HEAD @ {0}: checkout: mudança de DESENVOLVIMENTO para remotas / origin / SomeNiceFeature e47bf80 HEAD @ {1}: origem pull DESENVOLVIMENTO: Avanço rápido

O topo desta lista é um reasone que pode encontrar um estado DETACHED HEAD … verificando um branch de rastreamento remoto.

Isso pode acontecer facilmente se você tentar desfazer as alterações feitas ao refazer o check-out dos arquivos e não conseguir obter a syntax corretamente.

Você pode ver a saída do git log – você pode colar a parte final do log aqui desde o último commit bem-sucedido, e todos nós poderíamos ver o que você fez. Ou você pode colar-bin e pedir muito bem em #git no IRC freenode.

Isso pode acontecer se você tiver uma tag com o mesmo nome de uma ramificação.

Exemplo: se “release / 0.1” for o nome da tag, então

 git checkout release/0.1 

produz HEAD separado em “release / 0.1”. Se você espera que o release / 0.1 seja um nome de ramificação, ficará confuso.

Uma maneira acidental simples é fazer um git checkout head como um erro de digitação de HEAD .

Tente isto:

 git init touch Readme.md git add Readme.md git commit git checkout head 

que dá

 Note: checking out 'head'. You are in 'detached HEAD' state. You can look around, make experimental changes and commit them, and you can discard any commits you make in this state without impacting any branches by performing another checkout. If you want to create a new branch to retain commits you create, you may do so (now or later) by using -b with the checkout command again. Example: git checkout -b  HEAD is now at 9354043... Readme 

A outra maneira de entrar em um estado de head git destacado é tentar se comprometer com um branch remoto. Algo como:

 git fetch git checkout origin/foo vi bar git commit -a -m 'changed bar' 

Observe que, se você fizer isso, qualquer nova tentativa de fazer o checkout de origem / foo o levará de volta a um estado de cabeça desanexada!

A solução é criar o seu próprio branch foo local que rastreia origem / foo, depois, opcionalmente, push.

Isso provavelmente não tem nada a ver com o seu problema original, mas esta página está no topo do google hits para “git desvinculado” e este cenário está seriamente sub documentado.

Quando você faz o checkout para um commit git checkout commit git checkout ou para um branch remoto, seu HEAD será separado e tentará criar um novo commit nele.

Confirmações que não podem ser acessadas por qualquer ramificação ou tag serão coletadas e removidas do repository após 30 dias.

Outra maneira de resolver isso é criando uma nova ramificação para a confirmação e checkout recém-criada. git checkout -b

Este artigo ilustra como você pode obter o estado HEAD separado .