Pergunta
Parece haver uma diferença entre a última confirmação, a cabeça e o estado do arquivo que posso ver no meu diretório.
O que é a cabeça, o que posso fazer com isso e que erro devo evitar?
Solução
Head é uma referência à última confirmação na filial de check-out atualmente.
Há uma pequena exceção a isso, que é a cabeça isolada. UMA cabeça destacada é a situação em que você acaba sempre que verifica um comprometer-se (ou tag) em vez de uma ramificação. Nesse caso, você deve imaginar isso como um ramo temporário sem nome; Então, em vez de ter uma referência de filial nomeada, nós só tem cabeça. Ele ainda permitirá que você faça compromissos (que atualizarão a cabeça), para que a definição curta acima ainda seja verdadeira se você pensar em uma cabeça isolada como uma ramificação temporária sem nome.
Outras dicas
HEAD
é uma referência para o comprometimento atualmente verificado.
Nos estados normais, na verdade é um referência simbólica para o ramo que você fez o check -out - se você olhar para o conteúdo do .git/cabeça, verá algo como "Ref: Refs/Heads/Master". A ramificação em si é uma referência à confirmação na ponta do ramo. Portanto, no estado normal, HEAD
refere -se efetivamente à confirmação na ponta do ramo atual.
Também é possível ter uma "cabeça isolada". Isso acontece quando você verifica algo além de uma ramificação (local), como uma ramificação remota, uma confirmação específica ou uma tag. O lugar mais comum para ver isso é durante uma rebase interativa, quando você escolhe editar um compromisso. No estado de cabeça isolada, sua cabeça é uma referência direta a uma confirmação - o conteúdo do .git/cabeça será um hash sha1.
De um modo geral, Head é apenas um nome conveniente para significar "o que você checou" e você realmente não precisa se preocupar muito com isso. Esteja ciente do que você fez o check -out e lembre -se de que provavelmente não quer se comprometer se não estiver em um ramo (estado de cabeça destacado), a menos que saiba o que está fazendo (por exemplo, está em uma rebase interativa) .
Ponteiro da cabeça no git
O Git mantém uma variável de referência chamada Head. E chamamos essa variável de ponteiro, porque seu objetivo é referência ou apontar uma confirmação específica no repositório. À medida que fazemos novas confirmações, o ponteiro vai mudar ou passar para apontar para uma nova confirmação. A cabeça sempre aponta para a ponta da filial atual em nosso repositório. Agora, isso tem a ver com nosso repositório, não com o nosso índice de estadiamento ou nosso diretório de trabalho.
Outra maneira de pensar nisso é o último estado de nosso repositório ou o que foi o check -out pela última vez, e porque é onde o repositório parou ou o último estado, você também pode dizer que a cabeça aponta para o pai da próxima confirmação ou é onde a escrita commit vai acontecer.
Eu acho que uma boa metáfora para pensar sobre isso é a reprodução e a cabeça de gravação em um gravador de fitas cassete. Quando começamos a gravar áudio, a fita passa pela cabeça e registra nela. Quando pressionamos, pare o local onde a cabeça do registro é interrompida é o lugar em que começará a gravar novamente quando pressionarmos o registro pela segunda vez. Agora podemos nos mover, podemos mover a cabeça para lugares diferentes, mas onde quer que a cabeça esteja posicionada Quando atingimos o registro novamente, é onde ele começará a gravar.
O ponteiro da cabeça no Git é muito semelhante, aponta para o local onde começaremos a gravar a seguir. É o lugar onde paramos em nosso repositório para as coisas que cometemos.
Isso deveria ter sido um comentário, mas é muito longo para um compromisso
Eu sempre pensei HEAD~5
significa ir para 5 compromissos antes. Mas não leva a parte do comando. Ele só carrega a referência/'onde' papel do comando.
Em termos leigos, é usado para responder à pergunta de: ONDE devo ir? Para qual comprometimento?
Se você diz
HEAD
significa (a referência ao) commit atual
HEAD~1
significa (a referência a) 1 comprometimento antes
HEAD~87
significa (a referência a) 87 compromissos antes
git checkout HEAD~1
irá realmente ir para essa referência/compromisso
Em termos simples, Head é uma referência à última confirmação na filial de check-out atualmente.
Pense na cabeça como o "ramo atual". Quando você troca de ramificações com o checkout do Git, a revisão da cabeça muda para apontar para a ponta da nova ramificação.
Você pode ver o que a cabeça aponta fazendo:
cat .git/HEAD
É possível que a cabeça consulte uma revisão específica que não está associada a um nome de ramificação. Esta situação é chamada de cabeça isolada.