Acabei hoje com uma cabeça desanexada, o mesmo problema descrito em: git push diz tudo atualizado, mesmo que eu tenha alterações locais
Até onde eu sei, não fiz nada fora do comum, apenas comete e empurra meu repositório local.
Então, como eu acabei com um detached HEAD
?
branch-name@{n}
, a nona posição anterior debranch-name
. Mas não importa o que, em algum momento deve ter havido umgit checkout <rev>
. Se isso não tocar, provavelmente você fez o que Will mencionou - tentou fazergit checkout <file>
e conseguiu especificar uma revisão por acidente.git status
:all conflicts fixed: run "git rebase --continue"
git checkout remotes/origin/my-branch
vez degit checkout my-branch
ougit checkout origin/my-branch
.Respostas:
Qualquer verificação de uma confirmação que não seja o nome de uma de suas filiais, resultará em um HEAD desanexado. Um SHA1 que representa a ponta de um ramo ainda fornece uma CABEÇA desanexada. Somente uma verificação de um nome de filial local evita esse modo.
Veja confirmação com um HEAD desanexado
Por exemplo, se você fizer check-out de uma "ramificação remota" sem rastrear primeiro, poderá terminar com um HEAD desanexado.
Veja git: switch branch sem destacar a cabeça
Com o Git 2.23 (agosto de 2019), você não precisa usar o comando confuso
git checkout
.git switch
também pode fazer checkout de uma filial e obter um HEAD desanexado, exceto:--detach
opção explícitaVejo:
Vs. usando o novo
git switch
comando:Se você deseja criar uma nova filial local, rastreando uma filial remota:
Não há mais erro!
Não há mais CABEÇA destacada e indesejada!
fonte
git commit files creates a new commit containing the contents of the latest commit, plus a snapshot of files taken from the working directory. Additionally, files are copied to the stage.
O que significa "arquivos são copiados para o palco"? Eu pensei que os arquivos foram confirmados, o que significa que o palco está limpo?master
esteja noed489
diagrama acima,git checkout ed489
você receberá um HEAD desanexado, enquantogit checkout master
não."You can think of this as an anonymous branch"
:) Eu gosto da analogiaReproduzi isso agora por acidente:
lista as ramificações remotas
Quero fazer o checkout um localmente, então corto a pasta:
Presto! Estado HEAD desanexado
Solução 1:
Não inclua
origin/
na parte da frente das especificações da minha filial ao fazer o check-out:Solução 2:
Adicione
-b
parâmetro que cria uma filial local a partir do controle remotogit checkout -b origin/Feature/f1234
ougit checkout -b Feature/f1234
ele voltará à origem automaticamentefonte
git checkout -b Feature/f1234
<=>git branch Feature/f1234
egit checkout Feature/f1234
.origin/branchname
, procuraorigin/origin/branchname
dizer que o primeiro é o nome remoto que você usa-b
; caso contrário, ele cria umanonymous
ramo que é desanexado. Da mesma forma, para fazer o check-out de um controle remoto diferente, você teria que mencionar o-b
parâmetro, caso contrário, o git não tem como saber que é de um novo controle remoto, ele procuraráorigin/remote/branchname
.tentar
isso fornece um histórico de como os ponteiros HEAD e ramo foram movidos no passado.
por exemplo :
88ea06b HEAD @ {0}: finalização da compra: movendo-se de DEVELOPMENT para controles remotos / origem / SomeNiceFeature e47bf80 HEAD @ {1}: pull origin DEVELOPMENT: Avanço rápido
o topo desta lista é um dos motivos em que se pode encontrar um estado DETACHED HEAD ... verificando um ramo de rastreamento remoto.
fonte
Isso pode acontecer facilmente se você tentar desfazer as alterações feitas ao verificar novamente os arquivos e não conseguir obter a sintaxe correta.
Você pode ver a saída de
git log
- você pode colar o final do log aqui desde a última confirmação bem-sucedida, e todos pudemos ver o que você fez. Ou você pode colocá-lo em uma lixeira e pedir muito bem no#git
IRC do freenode.fonte
Isso pode acontecer se você tiver uma tag com o mesmo nome de um ramo.
Exemplo: se "release / 0.1" for o nome da tag,
produz HEAD desanexado em "release / 0.1". Se você espera que release / 0.1 seja um nome de filial, fica confuso.
fonte
Detached HEAD
significa que o que foi retirado no momento não é uma filial local.Alguns cenários que resultarão em um
Detached HEAD
estado:Se você fizer check-out de uma filial remota , digamos
origin/master
. Este é um ramo somente leitura. Portanto, ao criar um commit a partirorigin/master
dele, será flutuante , ou seja, não conectado a nenhum ramo.Se você fizer o checkout de uma tag específica ou confirmar . Ao fazer um novo commit a partir daqui, ele será flutuante novamente , ou seja , não estará conectado a nenhum ramo. Observe que quando uma ramificação é retirada, novas confirmações sempre são colocadas automaticamente na ponta.
Quando você quiser voltar e efetuar o check-out de uma confirmação ou marca específica para começar a trabalhar a partir daí, poderá criar uma nova ramificação originada a partir dessa confirmação e alternar para ela
git checkout -b new_branch_name
. Isso impedirá oDetached HEAD
estado, pois agora você tem uma ramificação com check-out e não uma confirmação.fonte
Uma maneira acidental simples é fazer
git checkout head
um erro de digitaçãoHEAD
.Tente o seguinte:
que dá
fonte
checkout -b
que parece um checkout, mas na verdade ramifica), mas outra lista é bem-vinda.A outra maneira de entrar no estado principal desanexado do git é tentar se comprometer com uma ramificação remota. Algo como:
Observe que, se você fizer isso, qualquer tentativa adicional de verificar a origem / foo o levará de volta ao estado principal desanexado!
A solução é criar sua própria ramificação foo local que rastreia a origem / foo e, opcionalmente, empurre.
Provavelmente, isso não tem nada a ver com o seu problema original, mas esta página está no topo dos resultados do google para "git detached head" e esse cenário está muito sub-documentado.
fonte
Quando você faz o checkout para um commit
git checkout <commit-hash>
ou para um branch remoto, o HEAD será desanexado e tentará criar um novo commit nele.As confirmações que não são alcançáveis por nenhuma ramificação ou marca serão coletadas e removidas do lixo após 30 dias.
Outra maneira de resolver isso é criando uma nova ramificação para o commit recém-criado e finalizando a compra.
git checkout -b <branch-name> <commit-hash>
Este artigo ilustra como você pode obter o estado HEAD desanexado .
fonte