Estou desenvolvendo um script de implantação para o meu projeto git e comecei a usar tags. Adicionei uma nova tag chamada v2.0
:
git tag -a v2.0 -m "Launching version 2.0"
E eu empurrei essa tag para o repositório remoto
git push --tags
Quando tento executar o script de implantação e verificar a v2.0
tag, recebo esta mensagem:
Você está no estado 'CABEÇA desanexada'. Você pode olhar em volta, fazer alterações experimentais e confirmá-las, além de poder descartar quaisquer confirmações feitas nesse estado sem impactar nenhuma ramificação executando outro checkout. Se você deseja criar uma nova ramificação para reter confirmações criadas, faça isso (agora ou mais tarde) usando -b com o comando checkout novamente. Exemplo: git checkout -b new_branch_name HEAD agora está em
Isso é normal? O repositório está no limbo porque se eu fizer:
git branch
Eu recebo esta saída:
* (no branch)
master
Desculpe se isso é óbvio, mas não consegui descobrir.
fonte
Respostas:
Ok, primeiro alguns termos um pouco simplificados.
Em
git
, atag
(como muitas outras coisas) é o que se chama de arborizado . É uma maneira de se referir a um ponto na história do projeto. Treeishes podem ser uma tag, um commit, um especificador de data, um especificador ordinal ou muitas outras coisas.Agora, a
branch
é como uma tag, mas é móvel. Quando você está "em" uma ramificação e faz uma consolidação, a ramificação é movida para a nova consolidação que você fez, indicando sua posição atual.Seu
HEAD
ponteiro é para um ramo que é considerado "atual". Geralmente, quando você clona um repositório,HEAD
aponta para omaster
qual, por sua vez, aponta para um commit. Quando você faz algo assimgit checkout experimental
, alternaHEAD
para apontar para oexperimental
ramo que pode apontar para um commit diferente.Agora a explicação.
Quando você faz a
git checkout v2.0
, está alternando para uma confirmação que não é apontada por abranch
. OHEAD
agora está "desanexado" e não está apontando para um ramo. Se você decidir fazer uma confirmação agora (como você pode), não há ponteiro de ramificação a ser atualizado para rastrear essa confirmação. Voltar para outro commit fará com que você perca esse novo commit que você fez. É isso que a mensagem está dizendo.Normalmente, o que você pode fazer é dizer
git checkout -b v2.0-fixes v2.0
. Isso criará um novo ponteiro de ramificação no commit apontado pelo treeishv2.0
(uma tag nesse caso) e depois mudará o seuHEAD
para apontar para isso. Agora, se você fizer commits, será possível rastreá-los (usando ov2.0-fixes
branch) e você poderá trabalhar como faria normalmente. Não há nada de "errado" no que você fez, especialmente se você quiser apenas dar uma olhada nov2.0
código. Se, no entanto, você quiser fazer as alterações que deseja rastrear, precisará de uma ramificação.Você deve dedicar algum tempo para entender todo o modelo do DAG do git. É surpreendentemente simples e deixa todos os comandos bem claros.
fonte
git reflog
, que é um ótimo comando para se conhecer! A menos que a coleta de lixo tenha acontecido, é aparentemente "impossível" perder uma confirmação.Sim, é normal. Isso ocorre porque você faz check-out de um único commit, que não tem cabeça. Especialmente (mais cedo ou mais tarde) não é chefe de nenhum ramo.
Mas geralmente não há problema com esse estado. Você pode criar uma nova ramificação a partir da tag, se isso fizer você se sentir mais seguro :)
fonte