155 votes

Pourquoi "origin/HEAD" s'affiche-t-il lors de l'exécution de "git branch -r"?

Lorsque vous exécutez git branch -r, pourquoi diable répertorie-t-il origin/HEAD? Par exemple, il y a un dépôt distant sur GitHub, disons, avec deux branches : master et awesome-feature. Si je fais un git clone pour le récupérer, puis vais dans mon nouveau répertoire et liste les branches, je vois ceci :

$ git branch -r
origin/HEAD
origin/master
origin/awesome-feature

Ou dans l'ordre dans lequel il serait (alpha ? Je simule cet exemple pour préserver l'identité d'un dépôt innocent). Alors, qu'est-ce que c'est que cette affaire de HEAD? Est-ce ce à quoi la dernière personne à faire un push avait son HEAD pointé quand elle a poussé? Ne sera-t-il pas toujours le même que celui sur lequel elle a fait un push? Les HEAD se déplacent... pourquoi devrais-je me soucier de ce à quoi le HEAD de quelqu'un pointait sur une autre machine?

Je suis en train de m'habituer au suivi à distance et ainsi de suite, donc c'est une confusion persistante. Merci!

EDIT : j'étais sous l'impression que les dépôts distants dédiés (comme GitHub où personne ne se connectera en SSH pour travailler sur ce code, mais seulement pour tirer ou pousser, etc.) n'avaient pas et ne devraient pas avoir de HEAD car il n'y avait pratiquement pas de copie de travail. Est-ce incorrect?

136voto

cdunn2001 Points 3597

@robinst est correct.

Dans git, vous pouvez sélectionner quelle branche est vérifiée par défaut (c'est-à-dire lorsque vous clonez). Par défaut, origin/HEAD pointera sur cela.

Sur GitHub, Vous pouvez changer cela dans les paramètres d'administration de votre dépôt GitHub. Vous pouvez également le faire à partir de la ligne de commande via

git remote set-head origin trunk

ou le supprimer complètement via

git remote set-head origin -d

Exemple. Regardez le menu déroulant 'Changer de branche'. trunk est sélectionné, donc origin/HEAD suit trunk.

57voto

robinst Points 9249

La raison pour laquelle un dépôt nu peut avoir un HEAD, c'est parce qu'il détermine la branche qui est initialement vérifiée après un clonage du dépôt.

Normalement, HEAD pointe vers master, et c'est la branche qui est vérifiée lorsque les gens clonent le dépôt. Le modifier pour pointer vers une autre branche dans le dépôt nu entraîne alors que cette branche soit vérifiée lors du clonage.

24voto

boblu Points 171

J'avais l'impression que les dépôts distants dédiés (comme GitHub où personne ne se connectera en ssh pour travailler sur ce code, mais seulement tirer ou pousser, etc.) n'avaient pas et ne devraient pas avoir de HEAD car il n'y avait pratiquement aucun copie de travail. Pas vrai?

J'avais exactement la même impression que ce que tu as dit.

Et je ne peux même pas supprimer cette branche de suivi à distance origin/HEAD clonée depuis github en faisant

git branch -d -r origin/HEAD

Cela n'a eu aucun effet.

Quelqu'un pourrait-il me dire comment je peux supprimer cette branche de suivi à distance origin/HEAD?

mise à jour

Bien que je n'aie pas trouvé pourquoi il y a un origin/HEAD créé lors du clonage depuis github, j'ai trouvé un moyen de le supprimer.

La nouvelle version de git fournit

git remote set-head  -d

pour supprimer le pointeur HEAD inutile de la branche de suivi à distance.

Et nous pouvons également changer le nom par défaut stupide 'origin' en ce que nous voulons en utilisant

git remote rename origin 

J'espère que cela peut aider. :)

13voto

Paul Points 12977

Vous avez raison, envoyer vers des dépôts distants dédiés fonctionne beaucoup mieux lorsqu'ils sont "vides", c'est-à-dire lorsqu'ils n'ont pas de répertoires de travail. L'architecture de Git est conçue pour les mises à jour par des correctifs ou des pull (fetch), ce qui a du sens dans un VCS distribué. Comme le disent les docs quelque part, envoyer vers une branche qui est actuellement vérifiée peut entraîner des "résultats inattendus".

La HEAD fait partie des exigences pour un dépôt valide. Disposition du Dépôt Git indique, en partie :

HEAD

Un symref (voir glossaire) vers l'espace de noms refs/heads/ décrivant la branche active  
actuellement. Cela ne signifie pas grand chose si le dépôt n'est pas associé à un arbre de  
travail (c'est-à-dire un dépôt vide), mais un dépôt Git valide doit avoir le fichier HEAD ;  
certains outils peuvent l'utiliser pour deviner la branche "par défaut" désignée du dépôt  
généralement master). Il est légal si le nom de la branche nominale n'existe pas encore.

Donc vous allez voir HEAD comme faisant partie de la liste des branches, même si "cela ne signifie pas grand-chose..."

2voto

codelogic Points 22722

Il y a toujours une HEAD qui indique la branche actuellement vérifiée sur le dépôt distant (qui peut être ou non master). Même les dépôts distants ont des branches actuelles. Habituellement, c'est master, et je ne trouve pas de raison immédiate pour laquelle on voudrait le changer, mais cela peut être modifié.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X