O que é o HEAD in Git?
vês a documentação do Git a dizer coisas como
Mas o que é o Git?o ramo deve ser totalmente fundido na cabeça.
16 answers
Podes pensar na cabeça como o "ramo actual". Quando você muda de branches com git checkout
, a revisão da cabeça muda para apontar para a ponta do novo branch.
Você pode ver o que a cabeça aponta fazendo:
cat .git/HEAD
No meu caso, a saída é:
$ cat .git/HEAD
ref: refs/heads/master
É possível que o HEAD se refira a uma revisão específica que não está associada a um nome de ramo. Esta situação chama-se cabeça solta.
Para citar outras pessoas:
Uma cabeça é simplesmente uma referência a uma commit object. Cada cabeça tem um nome (nome do ramo ou nome da marca, etc.). Por por omissão, há uma cabeça em cada repositório chamado Mestre. Repositorio pode conter qualquer número de cabeças. Em em qualquer momento, uma cabeça é selecionada como a " cabeça atual."Esta cabeça é aliased to HEAD, always in capitals".
Note esta diferença: uma "cabeça" (minúsculas) refere-se a qualquer um dos chamar cabeças no repositório;"cabeça" (maiúsculas) refere-se exclusivamente ao actualmente activo. Presente a distinção é usada frequentemente no Git documentacao.
Outra boa fonte que rapidamente cobre o funcionamento interno do git (e por isso uma melhor compreensão das cabeças/cabeças) pode ser encontrada {[[14]}aqui . Referências (ref:) ou cabeças ou ramos podem ser considerados como notas post-it presas em commits no histórico de commit. Normalmente apontam para a ponta da série de commits, mas eles podem ser movidos com git checkout
ou git revert
etc.
A cabeça é o teu ramo actual. É uma referência simbólica. É uma referência a um ramo. Tens sempre cabeça, mas a cabeça vai apontar para um desses outros ponteiros, para um dos ramos em que estás. É o pai do teu próximo compromisso. É o que deve ser o que foi verificado pela última vez em seu diretório de trabalho... Este é o último estado conhecido do seu era o directório de trabalho.
Todo o vídeo dará uma introdução justa a todo o sistema git, então eu também recomendo que você assista tudo se tiver tempo para isso.
A partir do Livro Pro Git , Capítulo 3.1 Git ramifica-ramificações numa casca , na secção Criando um novo ramo:
O que acontece se criar um novo ramo? Bem, fazê-lo cria um novo apontador para te mexeres. Digamos que cria um novo ramo. chama-se Teste. Faça isto com o comando git branch:$ git branch testing
Isto cria um novo cursor no mesmo commit em que está actualmente
Como é que o Git sabe em que ramo estás? Mantém um ponteiro especial chamado cabeça. Note que isto é muito diferente do o conceito de cabeça em outros VCSs você pode ser usado para, tais como Subversion ou CVS. No Git, este é um ponteiro para o ramo local estás de momento. Neste caso, ainda estás no master. O git o comando branch só criou um novo branch - não mudou para que ramo.
Assumindo que não é um caso especial chamado "cabeça separada", então, como indicado no livro O'Reilly Git, 2ª edição, p. 69, HEAD
significa:
HEAD
refere-se sempre ao commit mais recente no actual ramo. Quando você muda de ramificações,HEAD
é actualizado para se referir ao novo o último compromisso do branch.
Por isso
HEAD
is the "tip" of the current branch .
Note que podemos usar HEAD
para nos referirmos ao mais recente commit, e use HEAD~
como o commit antes da ponta, e HEAD~~
ou HEAD~2
como o commit ainda antes, e assim por diante.
HEAD
refere-se à persistência actual para a qual a sua cópia de trabalho aponta, ou seja, a persistência para a qual já saiu. Da documentação oficial do Linux sobre a especificação das revisões do Git:
HEAD
nomeia o commit no qual você baseou as mudanças na árvore de trabalho.
Note, No entanto, que na próxima versão 1.8.4 do Git, @
também pode ser usado como uma abreviatura para {[[0]}, como observado pelo colaborador do Git Junio C Hamano no seu Git Culpar o blog:
Em vez de escrever "cabeça", pode dizer "@" em vez disso, por exemplo "git log @".
O Utilizador de Stack Overflow VonC também encontrou algumas informações interessantes sobre o porquê @
foi escolhido como uma abreviatura na sua resposta a outra pergunta .
Também de interesse, em alguns ambientes não é necessário capitalizar {[[0]}, especificamente em sistemas operativos que usam sistemas de ficheiros sem capitalização, especificamente Windows e OS X.
Olha para criar e brincar com ramos
A cabeça é na verdade um ficheiro cujo conteúdo determina onde se refere a variável da cabeça:
$ cat .git/HEAD
ref: refs/heads/master
$ cat .git/refs/heads/master
35ede5c916f88d8ba5a9dd6afd69fcaf773f70ed
Neste repositório, o conteúdo do ficheiro HEAD refere-se a um segundo ficheiro denominado refs/heads/master. O ficheiro refs/heads / master contém a hash da persistência mais recente no ramo principal.
O resultado é pontos de cabeça para o commit ramo mestre a partir do .ficheiro git/refs/heads / master.
Ramo:
O ramo em si é definido como todos os pontos acessíveis no commit graph from the named commit (the "tip" of the branch).
Cabeça: {[7] } Um tipo especial de Ref
O árbitro especial determina em que ramo estás...
Ref
Como o Greg mencionou, a cabeça pode estar em "estado isolado". Então a cabeça pode ser um árbitro simples (para uma cabeça separada) ou um symref.O Git define dois tipos de referências, ou apontadores nomeados, que ele chama "refs":
- Um ref simples, que aponta directamente para um ID de objecto (normalmente um commit ou tag)
- Um ref simbólico (ou symref), que aponta para outro ref (simples ou simbólico)
Se a cabeça é um ref simbólico para um ramo existente, então você são"on" aquele ramo. Se, por outro lado, a cabeça é uma simples ref directamente nomeando um commit pelo seu ID SHA - 1, então você não está" em " qualquer branch, mas em vez disso, no modo "cabeça separada", o que acontece quando você check-out alguns comprometo-me mais cedo a examinar.
O ponteiro da cabeça para a última fotografia da persistência, o pai seguinte
A cabeça no Git é o indicador para a referência do ramo actual, que é por sua vez um indicador para a última persistência que fez ou a última persistência que foi verificada para a sua pasta de trabalho. Isso também significa será o pai do próximo commit que você fizer. É geralmente mais simples pensar nisso como cabeça é o instantâneo de seu último commit.
A cabeça aponta para a ponta do ramo actualmente verificado.
No seu repositório, há um .pasta git. Abra o arquivo neste local:.git\refs\heads. O código (sha-1 hash) nesse arquivo (master na maioria dos casos) será o commit mais recente, ou seja, o visto no resultado do comando git log
. Mais informações sobre o .pasta git: http://gitready.com/advanced/2009/03/23/whats-inside-your-git-directory.html
Parece que {[[0]} é apenas uma etiqueta para o último commit que você saiu.
Isto pode ser a ponta de um ramo específico (como" mestre") ou algum compromisso entre um ramo ("cabeça separada")
Estes dois podem confundir-te:
Cabeça
Apontando para referências com nomes de uma sucursal recentemente submetida. A menos que você use a referência do pacote , as cabeças normalmente armazenadas em $ GIT_DIR/refs/heads/.
Cabeça
Ramo actual, ou a sua árvore de trabalho é normalmente gerada a partir da cabeça da árvore está a apontar para. A cabeça deve apontar para uma cabeça, só que estás a usar uma cabeça separada.
Olha para http://git-scm.com/book/en/Git-Branching-What-a-Branch-Is
Figura 3-5. Ficheiro principal a apontar para o ramo em que estás.
Como um conceito, o chefe é a última revisão de um ramo. Se tiver mais de uma cabeça por ramo nomeado, provavelmente criou-a ao fazer commits locais sem se fundir, criando efectivamente um ramo sem nome.
Para ter um repositório "limpo", deverá ter uma cabeça por ramo nomeado e juntar-se sempre a um ramo nomeado depois de ter trabalhado localmente.
Isto também é verdade para Mercurial.