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.
@ 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
.
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.
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?
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. :)
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 ..."
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.
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é.