git: differenza tra "branchname" e "refs / heads / branchname"


97

Meglio essere spiegato con un esempio: sono sul ramo 0.58 del repository e questo è il modo in cui tiro:

git pull origin 0.58

Quando chiamo semplicemente "git pull", ottengo:

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.

Sembra che probabilmente ho dimenticato qualche opzione (--track?) Quando ho controllato quel ramo. Ad ogni modo, ora l'ho impostato:

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

E questo sembra funzionare. Quindi, solo per interesse, ho dato un'occhiata a qualche altro ramo su queste impostazioni:

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

Mi chiedevo ora, c'è una differenza tra "0.58" o devo specificare "refs / heads / 0.58"?

Qual è esattamente la differenza?


1
Solo per correggere l'errore di battitura nel titolo (senza fare confusione con un vecchio titolo modificandolo ora) , dovrebbe leggere "refs / heads / branchname" , headscon una "s".
RomainValeri

Risposte:


129

A refè qualsiasi cosa che punta a un commit, ad esempio rami (teste), tag e rami remoti. Dovresti vedere teste, telecomandi e tag nella tua .git/refsdirectory, supponendo che tu abbia tutti e tre i tipi di ref nel tuo repository.

refs/heads/0.58specifica un ramo denominato 0.58. Se non specifichi in quale spazio dei nomi si trova ref, git cercherà in quelli predefiniti. Questo rende l'uso di 0,58 plausibilmente ambiguo: potresti avere sia un ramo che un tag chiamato 0.58.


3
Grazie mille, questo lo spiega molto bene. Funzionava semplicemente con il semplice "0.58" in quanto non esiste un tag con questo nome.
Albert

1
Esatto, in sostanza andrà sempre del tutto bene, ma è bene essere al sicuro.
Cascabel

Questa risposta è un tesoro. Finalmente qualcuno spiega Git e mi diverto! Grazie.
aderchox

9
Eccoli tutti per chiarezza: refs/heads/e refs/remotes/erefs/tags/
Jim Aho

41

Solo per qualcuno che è curioso - git show-ref, disponibile a partire da Git v1.8.2.2, ti mostrerà tutti i riferimenti che hai nel tuo repository locale.


3
Inoltre git log --decorate=fullmostrerà i nomi completi dei riferimenti nella storia
galath

19

Vedi, branchNamedeve essere completamente risolto prima che GIT possa effettivamente identificarlo. Il nome completamente risolto sarà refs/heads/branchName.

Uno dei famosi comandi in git checkout branchNamerealtà lo risolve completamente automaticamente per identificare dove desideri effettuare il checkout. Nota che lo fa automaticamente, quindi non lo scriviamo mai completamente da soli.

Come lo fa? Diamo un'occhiata qui

refname :, ad esempio master, heads/master,refs/heads/master

Un nome di riferimento simbolico. Ad esempio, master indica tipicamente l'oggetto commit a cui fa riferimento refs/heads/master. Se ti capita di avere sia heads/mastere tags/master, puoi dire esplicitamente di dire heads/mastera Git quale intendi. Quando ambiguo, a <refname>viene disambiguato prendendo la prima corrispondenza nelle seguenti regole:

1. Se $GIT_DIR/<refname>esiste, questo è quello che vuoi dire (questo di solito è utile solo per HEAD, FETCH_HEAD, ORIG_HEAD, MERGE_HEADe CHERRY_PICK_HEAD);

2.altrimenti, refs/<refname>se esiste;

3.altrimenti, refs/tags/<refname>se esiste;

4.altrimenti, refs/heads/<refname>se esiste;

5.altrimenti, refs/remotes/<refname>se esiste;

6.altrimenti, refs/remotes/<refname>/HEADse esiste.

Quindi, superando i 6 passaggi, cerca di risolvere il problema branchName. Quindi non abbiamo mai bisogno di dargli un branchName completamente risolto.

Guarda qui e anche qui .

Inoltre, vai nella tua .gitdirectory e guarda all'interno della refcartella.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.