web-dev-qa-db-fra.com

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

Lorsque vous exécutez git branch -r pourquoi les flammes font-elles la liste Origin/HEAD? Par exemple, il y a un dépôt à distance sur GitHub, disons, avec deux branches: master et awesome-feature. Si je fais git clone pour le saisir puis aller dans mon nouveau répertoire et lister les branches, je vois ceci:

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

Ou quel que soit l'ordre dans lequel il se trouverait (alpha? Je simule cet exemple pour garder secrète l'identité d'un repo innocent). Alors, quelle est l'activité de HEAD? Est-ce la dernière personne à Push qui a fait pointer son HEAD lorsqu'elle a poussé? Cela ne sera-t-il pas toujours ce qu'ils étaient Push ed? HEAD se déplace ... pourquoi est-ce que je me soucie de ce que quelqu'un HEAD pointe sur une autre machine?

Je reçois juste une poignée sur le suivi à distance et autres, c'est donc une confusion persistante. Merci!

EDIT: J'avais l'impression que les dépôts distants dédiés (comme GitHub où personne ne ssh et travaillerait sur ce code, mais seulement pull ou Push, etc.) n'avaient pas et ne devraient pas avoir de HEAD parce qu'il n'y avait, fondamentalement, aucune copie de travail.

146
Ben Hamill

@ robinst est correct.

Dans git, vous pouvez sélectionner quelle branche est extraite par défaut (c'est-à-dire lorsque vous clonez). Par défaut, Origin/HEAD le montrera.

Sur GitHub, Vous pouvez changer cela dans les paramètres Admin 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 supprimez-le complètement via

git remote set-head Origin -d

Exemple . Regardez le menu déroulant "Switch Branches". trunk est cochée, donc Origin/HEAD suit trunk.

129
cdunn2001

La raison pour laquelle un référentiel nu peut avoir une HEAD, c'est parce qu'il détermine quelle branche est initialement extraite après un clone du référentiel.

Normalement, HEAD pointe vers master, et c'est la branche qui est extraite lorsque les gens clonent le référentiel. Le paramétrer sur une autre branche (en modifiant HEAD dans le dépôt nu) entraîne le retrait de cette branche sur le clone.

57
robinst

J'avais l'impression que les référentiels distants dédiés (comme GitHub où personne ne ssh ne travaillera sur ce code, mais ne tirera ou poussera, etc.) n'avaient pas et ne devraient pas avoir un HEAD = parce qu'il n'y avait, fondamentalement, aucune copie de travail.

J'ai eu exactement la même impression que vous l'avez dit.

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

git branch -d -r Origin/HEAD

Cela n'a eu aucun effet.

Quelqu'un peut-il me dire comment supprimer cette branche de suivi à distance Origin/HEAD?

mise à jour

Bien que je n'aie pas trouvé pourquoi il y a une origine/HEAD créée lors du clonage de github, je trouve un moyen de le supprimer.

La nouvelle version de git fournit

git remote set-head <name> -d

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

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

git remote rename Origin <new_name>

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

23
boblu

Vous avez raison de dire que pousser vers les dépôts distants dédiés fonctionnent beaucoup mieux lorsqu'ils sont "nus", c'est-à-dire lorsqu'ils n'ont pas de répertoires de travail. L'architecture de Git est conçue pour être mise à jour par des correctifs ou pull (fetch), ce qui est logique dans un VCS distribué. Comme le disent les documents quelque part, pousser vers une branche qui est actuellement extraite peut entraîner des "résultats inattendus" .

Le HEAD fait partie des exigences pour un référentiel valide. Git Repository Layout dit, en partie:

HEAD

A symref (see glossary) to the refs/heads/ namespace describing the currently active  
branch. It does not mean much if the repository is not associated with any working tree  
(i.e. a bare repository), but a valid git repository must have the HEAD file; some  
porcelains may use it to guess the designated "default" branch of the repository  
(usually master). It is legal if the named branch name does not (yet) exist.

Vous allez donc voir HEAD dans le cadre de la liste des branches, même si "cela ne signifie pas grand-chose ..."

13
Paul

Si "Origin" est un référentiel distant, Origin/HEAD identifie la branche par défaut sur ce référentiel distant.

Exemple:

$ git remote show
Origin
$ git remote show Origin
* remote Origin
  Fetch URL: [email protected]:walkerh/pipe-o-matic.git
  Push  URL: [email protected]:walkerh/pipe-o-matic.git
  HEAD branch: master
  Remote branch:
    master tracked
  Local branch configured for 'git pull':
    master merges with remote master
  Local ref configured for 'git Push':
    master pushes to master (fast-forwardable)

Notez la ligne qui dit "HEAD branch: master". C'est là que le référentiel distant indique aux clients la branche à retirer par défaut.

3
Walker Hale IV

Il y a toujours un HEAD qui pointe vers la branche actuellement extraite du référentiel distant (qui peut ou non être maître). Même les référentiels distants ont des branches actuelles. Généralement il est maître, et du haut de ma tête, je ne vois aucune raison pour laquelle on voudrait le changer, mais il peut être changé.

2
codelogic