15/01/2020 | Autor: Claudio Romão | Categoria: Técnico | Comentários

Detached Head, Como sair ileso disso ?

Não é um cenário tão comum, mas nas consultorias da vida, já vi isso acontecer e gerar alguns problemas no trabalho do desenvolvedor.

As vezes queremos voltar em um ponto específico da nossa aplicação para fazer alguma análise. Um modo de fazer isso é identificar o commit que queremos analisar e dar um checkout nele. E é aí que acontece o detached head.

Continuando com o exemplo acima, imagina que você tenha o seguinte histórico no seu repositório:

Exemplo do comando git log
Exemplo do comando git log

Agora queremos ver algo no commit 2 que possui a hash f414facf0. Para podermos ver o código daquela versão, podemos fazer um checkout apontando para aquele hash com o seguinte comando:

git checkout f414facf0

Feito isso, o git vai alertar que você está no “estado” detached head, conforme imagem:

Exemplo aviso da detached head
Exemplo aviso da detached head

Até aqui nenhum problema, pois as vezes queremos apenas ver o código e voltar para a versão normal. O problema começa se começarmos a fazer commits.

O Problema com a Detached Head

A HEAD no git representa a versão que você está trabalhando no momento. Normalmente quando fazemos checkout de uma branch normal, o git automaticamente coloca o ponteiro da HEAD no local certo com a ultima versão daquela branch. E com isso podemos continuar trabalhando sem problemas.

Quando fazemos um checkout em um commit específico e temos a detached head o git não vai posicionar a HEAD no local certo e qualquer commit feito depois disso ficará sem pertencer a uma branch específica.

Não tendo nenhuma branch específica nós poderemos acabar perdendo todo o trabalho feito para tentar resolver o problema identificado pois não conseguiremos fazer um merge desse código alterado na master ou em qualquer outra branch.

Se nesse momento você simplesmente trocar de branch com o comando git checkout, suas alterações serão perdidas.

Caso você esteja nessa situação de Detached Head e queira manter as alterações, devemos criar uma nova branch a partir desse ponto e continuar o trabalho para depois fazer o merge normal.

Para fazer isso, execute o seguinte comando para criar uma nova branch chamada “acerto” e com isso mantermos as alterações realizadas.

git branch acerto “hash”

Pronto, agora você tem seu trabalho salvo e pode continuar a trabalhar sem risco de perder suas alterações.

Espero que tenha gostado e se tiver alguma dúvida específica me manda um e-mail ou deixe nos comentários.

Até a próxima, Claudio Romão