Se o Git exibir HEAD detached, seus arquivos ainda estarão no estado de um commit específico, mas novos commits não farão um branch avançar até que você crie um. Em um Mac, abra o Terminal, vá para o repositório, verifique se há alterações não confirmadas e, em seguida, vincule seu trabalho atual a um novo branch ou retorne com segurança para o branch que pretendia usar. O comando switch do Git suporta ambos os caminhos. O guia do Terminal da Apple explica como abrir o Terminal; a documentação do switch no Git detalha o comportamento de branches e do estado de HEAD desanexado.
1. Verifique o que o Git carregou
Abra o Terminal em Aplicativos > Utilitários e, em seguida, navegue até o seu repositório. Substitua o caminho de exemplo pela pasta onde o seu projeto está localizado; as aspas permitem espaços no caminho. O Terminal do macOS usa o zsh por padrão, e esses comandos funcionam tanto no zsh quanto em outros shells comuns.
cd "/path/to/your/repository"
git status
Se o git status informar "HEAD detached" ou "not on any branch", você está no estado de HEAD desanexado. O Git fez o checkout diretamente de um commit em vez de um branch. O commit e os arquivos de trabalho continuam disponíveis; o risco é que os commits feitos aqui não ficam automaticamente vinculados a um branch. O manual do checkout no Git descreve esse estado e como um branch pode preservar os commits feitos nele.
Antes de mudar para qualquer lugar, leia o restante do git status. Se ele listar arquivos modificados ou não rastreados (untracked), essas são alterações que ainda não foram confirmadas (commit). Você pode continuar trabalhando no local ou criar um branch agora; criar um branch no commit atual não descarta edições por si só. Evite opções de forçar ou descartar durante a recuperação.
2. Mantenha o trabalho atual em um branch
Se você fez um commit enquanto estava com o HEAD desanexado — ou deseja continuar trabalhando a partir dessa captura exata —, crie um branch onde você está agora:
git switch -c recovered-work
git status
Use um nome de branch descritivo no lugar de recovered-work. O Git cria o branch no commit atual e alterna para ele, de modo que os commits posteriores pertencerão a esse branch. Confirme que o git status agora exibe o nome do branch. Essa é a recuperação mais rápida quando o snapshot desanexado é o trabalho que você deseja manter. O Git documenta que switch -c cria e alterna para um branch.
Se você tiver alterações não confirmadas, elas normalmente permanecerão na árvore de trabalho (working tree) quando você criar o branch. Verifique o git status depois para confirmar se elas ainda estão presentes. Se o comando recusar a operação porque um branch com esse nome já existe, escolha um nome diferente; não adicione -C, pois isso pode redefinir um branch existente para um novo ponto de partida.
3. Retorne ao branch que você pretendia usar
Se você apenas inspecionou um commit e não tem alterações para preservar, mude para o branch pretendido pelo nome. Por exemplo:
git switch main
Use o nome real do branch do seu repositório se não for main. Se o Git informar que alterações locais seriam sobrescritas, pare e preserve-as primeiro: crie um branch de recuperação como descrito acima ou confirme o trabalho. O Git normalmente bloqueia a troca de branch quando isso causaria a perda de modificações locais; evite --discard-changes durante a recuperação, pois isso redefine o índice e a árvore de trabalho para corresponder ao branch de destino. O manual do git switch explica essas proteções e opções.
Se você acabou de sair de um branch por engano, git switch - retorna ao branch ou commit anterior registrado pelo histórico recente de troca do Git. Verifique o git status após a troca para confirmar onde você está.
4. Encontre um commit desanexado que você deixou para trás
Se você já mudou de branch e não se lembra para onde foi o commit desanexado, inspecione o reflog local:
git reflog
O reflog registra atualizações locais recentes de referências, e o reflog do HEAD também registra trocas de branch. Procure uma entrada com uma mensagem de commit ou horário que corresponda ao seu trabalho. Para inspecionar um candidato sem alterar nada, copie o ID curto do commit no reflog e execute:
git show --stat COMMIT_ID
Substitua COMMIT_ID pelo ID real — não digite o placeholder literalmente. Se for o commit correto, preserve-o criando um branch a partir dele:
git switch -c recovered-work COMMIT_ID
Isso torna o commit acessível por um branch novamente. Os reflogs são registros locais e as entradas podem expirar; a documentação do Git os descreve como registros de atualizações recentes de referências e explica o comportamento de expiração. Consulte git reflog.
5. Verifique antes de continuar
Execute git status e git log -1 --oneline para confirmar o branch atual e o commit mais recente. Se o seu trabalho não havia sido confirmado, verifique se os arquivos ainda aparecem na saída de status. Se nenhum candidato aparecer no reflog, a recuperação pode exigir o exame de objetos órfãos (dangling objects); esse é um passo separado e mais cuidadoso, e você deve evitar executar comandos de limpeza como git gc durante a busca.
Um HEAD desanexado não significa que seu trabalho desapareceu. A recuperação adequada depende de você precisar preservar o commit atual, retornar a um branch existente ou localizar um commit após ter trocado de branch. Um branch criado no commit correto oferece ao Git uma referência nomeada para seguir à medida que você continua.
Fontes
Abrir ou encerrar o Terminal no Mac — Suporte da Apple