Différence entre HEAD et master

189

Quelle est la différence entre le HEADet masterdans Git?

J'ai fait un clone d'un projet sur GitHub et je souhaite transférer mes modifications vers la télécommande. Mais vers lequel dois-je pousser?

capture d'écran

Frederik Heyninck
la source

Réponses:

162

masterest une référence à la fin d'une branche. Par convention (et par défaut), il s'agit généralement de la branche d'intégration principale, mais ce n'est pas obligatoire.

HEADest en fait un type spécial de référence qui pointe vers une autre référence. Il peut pointer vers master ou non (il pointera vers la branche actuellement extraite). Si vous savez que vous voulez vous engager dans la masterbranche, poussez-le.

Voici un exemple visuel:

texte alternatif

Sur votre propre référentiel, vous pouvez vérifier où HEADpointe le en exécutant ceci:

$ git symbolic-ref HEAD
refs/heads/master

Cependant, trouver où remotes/origin/HEADpointe le est plus délicat car il se trouve sur la machine distante.

Il y a un excellent petit tutoriel sur les références git ici:

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

Lee Netherton
la source
1
+1 Réponse plus précise que la mienne. Voir aussi stackoverflow.com/questions/3301956/… et stackoverflow.com/questions/3301956/… pour des illustrations autour de ces concepts.
VonC
37

La réponse simple est qu'il HEADs'agit d'un pointeur / étiquette vers le commit le plus récent de la branche sur laquelle vous vous trouvez actuellement. masterest la branche par défaut créée lorsque vous avez initialisé un référentiel git (par exemple git init).

Vous pouvez supprimer la masterbranche (par exemple git branch -D master). Vous ne pouvez pas supprimer le HEADpointeur.

Benhorgen
la source
6
" HEADest un pointeur / étiquette vers le commit le plus récent de la branche sur laquelle vous vous trouvez actuellement." Je pense que c'est au mieux trompeur. Si vous extrayez un commit plus ancien, alors HEAD est maintenant un pointeur vers ce commit plus ancien, pas vers le commit le plus récent. Droite?
LarsH
2
Vous avez raison. HEAD est votre dernier paiement. Mais pour ma défense, pour Git, la checkoutcommande équivaut à changer de branche dans d'autres systèmes SCM courants.
benhorgen
1
Je sympathise ... J'aurais facilement pu faire la même erreur. La seule raison pour laquelle j'ai remarqué est que je suis au stade d'essayer de rechercher ce que signifie vraiment HEAD. Avez-vous une chance de modifier votre réponse pour qu'elle soit correcte? Je trouve que HEAD est un concept difficile à trouver, pour les non-experts git comme moi. Et avoir des conseils sur le Web qui donnent des informations incorrectes sur HEAD rend les choses un peu plus difficiles.
LarsH
2
Je pense que votre commentaire est une clarification fantastique pour quiconque cherche une meilleure compréhension de ce qu'est HEADvraiment le pointeur Git . J'apprécie votre commentaire et je pense que les autres aussi. Le contenu de mon article original ainsi que votre commentaire de suivi se complètent. Merci.
benhorgen
4
Un détail technique, mais si vous extrayez un commit plus ancien, vous n'êtes plus «sur» une branche. Si vous récupérez un commit au lieu d'une branche, vous avez ce qu'on appelle une "HEAD détachée", vous n'êtes plus "sur une branche". Être «sur une branche» signifie que votre HEAD fait référence à une branche, et par définition vous êtes sur le commit le plus récent de cette branche. Ce n'est pas parce que vous avez extrait le commit 'b54fe7' et que le maître pointe vers ce commit que vous êtes sur la branche maître. Il peut y avoir plusieurs branches pointant vers le même commit, vous êtes sur celui vers lequel HEAD pointe, le cas échéant.
Jason Goemaat
8

Poussez simplement les changements de votre succursale actuelle

git push origin

et cela poussera votre branche B«à changer origin/B».
Si vous êtes sur votre masterbranche, git poussera vers origin/master.
En fait, il poussera tous les changements sur les branches locales qui ont des branches distantes correspondantes à origin. Il est contrôlé par le paramètre de configuration push.default .
Voir également pousser RefSpecs dans le livre Pro Git .


Ce que vous voyez est la barre latérale représentant toutes les références de votre référentiel distant dans le fork expérimental GitX du projet GitX .

texte alternatif

Le HEADdésignera la branche par défaut pour cette télécommande.
Voir la git remote set-headpage de manuel :

Il n'est pas nécessaire d'avoir une branche par défaut pour une télécommande, mais permet de spécifier le nom de la télécommande à la place d'une branche spécifique.
Par exemple, si la branche par défaut de originest définie sur master, alors originpeut être spécifiée là où vous le spécifiez normalement origin/master.

VonC
la source