137 votes

git : différence entre "branchname" et "refs/heads/branchname"

Il est préférable de l'expliquer à l'aide d'un exemple : Je suis sur la branche 0.58 du dépôt et voici comment je tire :

git pull origin 0.58

Lorsque 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 ?) lorsque j'ai vérifié cette branche. Quoi qu'il en soit, j'ai mis cela en place maintenant :

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

Et cela semble fonctionner. Ensuite, par intérêt, j'ai jeté un coup d'œil à d'autres branches concernant 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 s'il y avait une différence entre "0.58" et "refs/heads/0.58".

Quelle est la différence exacte ?

177voto

Jefromi Points 127932

A ref est tout ce qui pointe vers un commit, par exemple les branches (heads), les tags et les branches distantes. Vous devriez voir les têtes, les branches distantes et les étiquettes dans votre fichier .git/refs en supposant que vous ayez les trois types de refs dans votre référentiel.

refs/heads/0.58 spécifie un branche nommé 0.58. Si vous ne précisez pas dans quel espace de noms se trouve le ref, git cherchera dans les espaces de noms par défaut. Cela rend l'utilisation de 0.58 ambiguë - vous pourriez avoir à la fois une branche et une balise nommées 0.58.

56voto

Artem Dolobanko Points 705

Juste pour les 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 dépôt local.

35voto

Breaking Benjamin Points 1361

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

L'un des célèbres commandements git checkout branchName le résout automatiquement afin d'identifier l'endroit où vous souhaitez passer à la caisse. Notez qu'il le fait automatiquement, ce qui signifie que nous ne l'écrivons jamais complètement nous-mêmes.

Comment cela se passe-t-il ? Regardons aquí

nom de référence : par exemple master , heads/master , refs/heads/master

Un nom de ref symbolique. Par exemple, master signifie typiquement l'objet commit référencé par refs/heads/master . S'il vous arrive de heads/master y tags/master vous pouvez dire explicitement heads/master à de dire à Git de quoi il s'agit. En cas d'ambiguïté, un <refname> i est désambiguïsé en prenant la première correspondance dans les règles suivantes :

1.Si $GIT_DIR/<refname> existe, c'est ce que vous voulez dire (cela n'est généralement utile que pour les HEAD , FETCH_HEAD , ORIG_HEAD , MERGE_HEAD y CHERRY_PICK_HEAD ) ;

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

3.2.2.2, refs/tags/<refname> s'il existe ;

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

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

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

En suivant les 6 étapes ci-dessus, il tente de résoudre le problème suivant branchName . Il n'est donc pas nécessaire de lui attribuer un nom de branche entièrement résolu.

Regarder aquí y aquí aussi.

De même, allez dans votre .git et voir à l'intérieur du répertoire ref dossier.

0voto

Faizan Makandar Points 11

Considérons que "Branchname" est Harry, Alors

Harry est un pointeur qui est simplement utilisé pour indiquer le dernier commit de cette branche.

Alors que refs/heads/Harry est une sorte de traceur d'historique qui suit chaque activité réalisée à l'aide du pointeur Harry. Il peut s'agir de n'importe quelle activité comme le commit, le passage à une autre branche, le transfert du contenu de la branche, etc.

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