git: différence entre «branchname» et «refs / heads / branchname»

97

Mieux vaut être expliqué par un exemple: je suis sur la branche 0.58 du référentiel et voici comment je tire:

git pull origin 0.58

Quand j'appelle simplement "git pull", j'obtiens:

ip238:openlierox az$ git pull
You asked me to pull without telling me which branch you
want to merge with, and 'branch.0.58.merge' in
your configuration file does not tell me either.  Please
name which branch you want to merge on the command line and
try again (e.g. 'git pull <repository> <refspec>').
See git-pull(1) for details on the refspec.

If you often merge with the same branch, you may want to
configure the following variables in your configuration
file:

    branch.0.58.remote = <nickname>
    branch.0.58.merge = <remote-ref>
    remote.<nickname>.url = <url>
    remote.<nickname>.fetch = <refspec>

See git-config(1) for details.

Il semble que j'ai probablement oublié une option (--track?) Quand j'ai vérifié cette branche. Quoi qu'il en soit, j'ai défini ceci maintenant:

git config branch.0.58.merge 0.58
git config branch.0.58.remote origin

Et cela semble fonctionner. Ensuite, juste à cause de mon intérêt, j'ai jeté un coup d'œil à une autre branche à propos de ces paramètres:

ip238:openlierox az$ git config branch.0.57.merge
refs/heads/0.57
ip238:openlierox az$ git config branch.0.57.remote
origin

Je me demandais maintenant, y a-t-il une différence entre "0.58" ou devrais-je spécifier "refs / heads / 0.58"?

Quelle est la différence exactement?

Albert
la source
1
Juste pour corriger la faute de frappe dans le titre (sans jouer avec un ancien titre en le modifiant maintenant) , il devrait lire "refs / heads / branchname" , headsavec un "s".
RomainValeri

Réponses:

129

A refest tout ce qui pointe vers un commit, par exemple, des branches (têtes), des balises et des branches distantes. Vous devriez voir des têtes, des télécommandes et des balises dans votre .git/refsrépertoire, en supposant que vous avez les trois types de références dans votre référentiel.

refs/heads/0.58spécifie une branche nommée 0.58. Si vous ne spécifiez pas l'espace de noms dans lequel se trouve la référence, git recherchera les espaces par défaut. Cela rend l'utilisation de seulement 0.58 peut être ambiguë - vous pourriez avoir à la fois une branche et une balise nommées 0.58.

Cascabel
la source
3
Merci beaucoup, cela explique très bien. Cela fonctionnait simplement avec le simple "0.58" car il n'y a pas de balise nommée.
Albert
1
D'accord, ce sera toujours très bien, mais il est bon d'être prudent.
Cascabel
Cette réponse est un trésor. Enfin quelqu'un explique Git et j'aime ça! Merci.
aderchox
9
Voici tous pour plus de clarté: refs/heads/et refs/remotes/etrefs/tags/
Jim Aho
41

Juste pour quelqu'un qui est curieux - git show-ref, qui est disponible depuis Git v1.8.2.2, vous montrera toutes les références que vous avez dans votre référentiel local.

Artem Dolobanko
la source
3
git log --decorate=full
Affiche
19

Voir, branchNamedoit être entièrement résolu avant que GIT puisse l'identifier. Le nom entièrement résolu sera refs/heads/branchName.

L'une des commandes les plus connues git checkout branchNamele résout automatiquement pour identifier où vous souhaitez effectuer le paiement. Notez qu'il le fait automatiquement, donc nous ne l'écrivons jamais entièrement par nous-mêmes.

Comment fait-il cela? Regardons ici

REFNAME :, par exemple master, heads/master,refs/heads/master

Un nom de référence symbolique. Par exemple, maître signifie généralement l'objet de validation référencé par refs/heads/master. Si vous avez les deux heads/masteret tags/master, vous pouvez dire explicitement de dire heads/masterà Git lequel vous voulez dire. Lorsqu'il est ambigu, a <refname>est levé en prenant le premier match dans les règles suivantes:

1.If $GIT_DIR/<refname>existe, qui est ce que vous entendez (ce qui est généralement utile que pour HEAD, FETCH_HEAD, ORIG_HEAD, MERGE_HEADet CHERRY_PICK_HEAD);

2. refs/<refname>sinon , s'il existe;

3. refs/tags/<refname>sinon , s'il existe;

4. refs/heads/<refname>sinon , s'il existe;

5. refs/remotes/<refname>sinon , s'il existe;

6. refs/remotes/<refname>/HEADsinon , s'il existe.

Donc, en plus de 6 étapes, il essaie de résoudre ce que c'est branchName. Par conséquent, nous n'avons jamais besoin de lui donner un nom de branche entièrement résolu.

Regardez ici et ici aussi.

Aussi, allez dans votre .gitrépertoire et voyez à l'intérieur du refdossier.

Numéro945
la source