Diferença entre HEAD e mestre

188

Qual é a diferença entre the HEADe masterin Git?

Eu fiz um clone de um projeto no GitHub e quero enviar minhas alterações para o controle remoto. Mas para qual deles devo empurrar?

captura de tela

Frederik Heyninck
fonte

Respostas:

162

masteré uma referência ao final de um ramo. Por convenção (e por padrão), esse geralmente é o principal ramo de integração, mas não precisa ser.

HEADé realmente um tipo especial de referência que aponta para outra referência. Pode apontar para master ou não (apontará para o ramo que está atualmente com check-out). Se você sabe que deseja se comprometer com o masterramo, pressione para isso.

Aqui está um exemplo visual:

texto alternativo

Em seu próprio repositório, você pode verificar para onde HEADestá apontando, executando o seguinte:

$ git symbolic-ref HEAD
refs/heads/master

No entanto, descobrir para onde remotes/origin/HEADestá apontando é mais complicado, pois está na máquina remota.

Há um ótimo pequeno tutorial sobre referências ao git aqui:

http://people.gnome.org/~federico/news-2008-11.html#pushing-and-pulling-with-git-1

Lee Netherton
fonte
1
+1 Resposta mais precisa que a minha. Consulte também stackoverflow.com/questions/3301956/… e stackoverflow.com/questions/3301956/… para obter ilustrações sobre esses conceitos.
VonC
37

A resposta simples é que HEADé um ponteiro / rótulo para o commit mais recente do ramo em que você está atualmente. masteré o ramo padrão criado quando você inicializou um repositório git (por exemplo git init).

Você pode excluir o masterramo (por exemplo git branch -D master). Você não pode excluir o HEADponteiro.

benhorgen
fonte
6
" HEADé um ponteiro / rótulo para o commit mais recente do ramo em que você está atualmente." Eu acho que isso é enganoso, na melhor das hipóteses. Se você efetuar o check-out de uma confirmação mais antiga, o HEAD agora é um ponteiro para essa confirmação mais antiga, não para a confirmação mais recente. Certo?
LarsH 17/03/16
2
Você está certo. HEAD é sua última compra. Mas, em minha defesa, para o Git, o checkoutcomando é equivalente a alternar ramificações em outros sistemas SCM comuns.
benhorgen
1
Eu simpatizo ... Eu poderia facilmente ter cometido o mesmo erro. A única razão pela qual notei foi porque estou tentando pesquisar o que realmente significa HEAD. Alguma chance de você poder editar sua resposta para estar correta? Acho HEAD um conceito difícil de encontrar descrições precisas de, para não-especialistas do Git como eu. E ter conselhos disponíveis na Web que fornecem informações incorretas sobre o HEAD torna um pouco mais difícil.
LarsH
2
Eu acho que seu comentário é um esclarecimento fantástico para quem procura uma compreensão mais precisa do que HEADrealmente é o ponteiro do Git . Agradeço o seu comentário e acho que os outros também. O conteúdo da minha postagem original, juntamente com o seu comentário de acompanhamento, se complementam. Obrigado.
benhorgen
4
Um tecnicismo, mas se você finalizar uma confirmação mais antiga, não estará mais 'em' uma ramificação. Se você fizer o checkout de um commit em vez de um branch, você terá o que é chamado de "HEAD desanexado", não estará mais 'em um branch'. Estar 'em um ramo' significa que o seu HEAD está fazendo referência a um ramo e, por definição, você está no commit mais recente desse ramo. Só porque você fez o check-out do 'b54fe7' e os pontos principais desse commit, não significa que você está no ramo principal. Pode haver vários ramos apontando para o mesmo commit, você está 'ligado' ao que o HEAD está apontando, se houver.
21716 Jason Goemaat
8

Simplesmente envie as alterações de sua filial atual

git push origin

e empurrará o seu ramo ' B' muda para ' origin/B'.
Se você estiver no seu masterramo, o git pressionará para origin/master.
Na verdade, ele enviará todas as alterações nas ramificações locais que possuem ramificações remotas correspondentes origin. É controlado pela configuração push.default .
Veja também empurrando RefSpecs no livro Pro Git .


O que você está vendo é a barra lateral que representa todos os refspecs de seu repo remoto no fork Experimental GitX do projeto GitX .

texto alternativo

O HEADdesignará a ramificação padrão para esse controle remoto.
Veja a git remote set-headpágina de manual :

Não é necessário ter uma ramificação padrão para um controle remoto, mas permite que o nome do controle remoto seja especificado no lugar de uma ramificação específica.
Por exemplo, se a ramificação padrão para originestiver definida como master, originpoderá ser especificada onde quer que você especifique normalmente origin/master.

VonC
fonte