git: diferença entre “branchname” e “refs / heads / branchname”

100

Melhor ser explicado em um exemplo: estou no branch 0,58 do repositório e é assim que eu puxo:

git pull origin 0.58

Quando eu chamo "git pull", recebo:

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.

Parece que provavelmente esqueci alguma opção (--track?) Quando verifiquei esse branch. De qualquer forma, eu configurei isso agora:

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

E isso parece funcionar. Então, apenas por interesse, dei uma olhada em algum outro ramo sobre essas configurações:

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

Eu queria saber agora, há uma diferença entre "0,58" ou devo especificar "refs / heads / 0,58"?

Qual é a diferença exatamente?

Albert
fonte
1
Apenas para corrigir o erro de digitação no título (sem mexer com um título antigo modificando-o agora) , ele deve ler "refs / heads / branchname" , headscom um "s".
RomainValeri de

Respostas:

131

A refé qualquer coisa apontando para um commit, por exemplo, branches (heads), tags e branches remotos. Você deve ver heads, remotes e tags em seu .git/refsdiretório, assumindo que você tenha todos os três tipos de refs em seu repositório.

refs/heads/0.58especifica uma ramificação chamada 0,58. Se você não especificar em qual namespace o ref está, o git irá procurar os padrões. Isso torna o uso de apenas 0,58 concebivelmente ambíguo - você poderia ter um branch e uma tag chamada 0,58.

Cascabel
fonte
3
Muito obrigado, isso explica muito bem. Ele apenas funcionou com o simples "0,58", pois não existe essa tag nomeada.
Albert,
1
Certo, essencialmente sempre estará tudo bem, mas é bom estar seguro.
Cascabel
Essa resposta é um tesouro. Finalmente alguém explica o Git e eu gosto disso! Obrigado.
aderchox
9
Aqui estão todos eles para maior clareza: refs/heads/e refs/remotes/erefs/tags/
Jim Aho
42

Apenas para quem está curioso - git show-ref, que está disponível desde Git v1.8.2.2, mostrará todas as referências que você tem em seu repositório local.

Artem Dolobanko
fonte
3
Também git log --decorate=fullmostrará os nomes completos das referências na história
galath
20

Veja, branchNameprecisa ser totalmente resolvido antes que o GIT possa realmente identificá-lo. O nome totalmente resolvido será refs/heads/branchName.

git checkout branchNameNa verdade, um dos comandos mais famosos o resolve totalmente para identificar onde você deseja fazer o checkout. Observe que ele faz isso automaticamente, portanto, nunca o escrevemos totalmente por conta própria.

Como isso faz? Vamos olhar aqui

RefName :, por exemplo master, heads/master,refs/heads/master

Um nome de referência simbólico. Por exemplo, master normalmente significa o objeto de confirmação referenciado por refs/heads/master. Se acontecer de você ter ambos heads/mastere tags/master, você pode dizer explicitamente heads/masterpara dizer ao Git qual você quer dizer. Quando ambíguo, a <refname>é eliminado obtendo a primeira correspondência nas seguintes regras:

1. Se $GIT_DIR/<refname>existe, que é o que você quer dizer (isso geralmente é útil apenas para HEAD, FETCH_HEAD, ORIG_HEAD, MERGE_HEADe CHERRY_PICK_HEAD);

2. refs/<refname>Caso contrário, se existir;

3. refs/tags/<refname>Caso contrário, se existir;

4. refs/heads/<refname>Caso contrário, se existir;

5. refs/remotes/<refname>caso contrário, se existir;

6. refs/remotes/<refname>/HEADcaso contrário, se existir.

Portanto, pelos 6 passos acima, ele tenta resolver o que é isso branchName. Portanto, nunca precisamos fornecer um branchName totalmente resolvido para ele.

Olhe aqui e aqui também.

Além disso, vá em seu .gitdiretório e veja dentro da refpasta.

Número945
fonte