HEAD
HEAD é uma referência especial do Git que aponta para o commit atual, aquele em que você fez checkout. Normalmente, quando você está em uma branch, o HEAD aponta para o commit mais recente dessa branch. Quando você faz um novo commit, o HEAD avança automaticamente para apontar para esse novo commit. Quando você reseta a branch para um commit diferente, o HEAD se move junto.
É parecido com o conceito de diretório atual no terminal. Assim como o diretório atual indica onde você está no sistema de arquivos, o HEAD indica onde você está no histórico de commits do seu repositório.
Ter um commit atual é necessário para saber quais arquivos mostrar no seu diretório de trabalho, onde adicionar novos commits, com o que comparar as alterações e assim por diante.
Detached HEAD
Se existisse um prêmio de pior nome possível para um conceito, detached HEAD seria o vencedor (em inglês, detached HEAD significa algo como HEAD desanexado, mas também soa literalmente como "cabeça decepada"). No Git, o HEAD não é uma cabeça, e sim a referência ao commit atual; mesmo assim, o nome passa a impressão de algo quebrado ou perigoso, quando na verdade é um estado inofensivo, que você pode usar para vários fins.
Ah, estou no estado detached HEAD! Devo ter quebrado o repositório inteiro!
Vou usar outra metáfora para explicar o que detached HEAD realmente significa.
Pense em um filme de faroeste: calor escaldante, pessoas assentando trilhos de trem (branches) pelo deserto. Novas cidades (seus commits) vão surgindo ao longo dos trilhos conforme o trabalho avança. Você pode visitar qualquer uma dessas cidades viajando de um lado para o outro pelos trilhos.
Agora suponha que existia um trilho que levava a uma cidade velha e abandonada. O trilho pode ter sumido (a branch foi excluída), mas a cidade ainda existe (o Git guarda todos os commits).
Como não há trilhos levando até aquela cidade antiga, você só consegue chegar lá andando fora dos trilhos (fazendo checkout do commit pelo hash). Quando você chega, está no estado detached HEAD.
Nesse estado, você pode explorar a cidade: olhar em volta, comparar coisas, revisar o histórico. Cidades velhas assim costumam estar abandonadas por um motivo, então não há muito o que fazer por lá. Mesmo assim, dá para construir a partir dali: começar novos trilhos (criar uma nova branch) partindo daquela cidade antiga. Você pode até construir uma nova cidade (novo commit), mas ela vai ficar isolada, a menos que você primeiro crie um novo trilho (nova branch).
.gitignoregit checkoutgit configgit taggit worktree