git: różnica między „branchname” a „refs / heads / branchname”

100

Najlepiej wyjaśnić to na przykładzie: jestem na gałęzi 0.58 repozytorium i tak go wyciągam:

git pull origin 0.58

Kiedy nazywam „git pull”, otrzymuję:

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.

Wygląda na to, że zapomniałem jakiejś opcji (--track?), Kiedy sprawdzałem tę gałąź. W każdym razie ustawiłem to teraz:

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

I wydaje się, że to działa. Następnie, tylko ze względu na zainteresowanie, przyjrzałem się innej gałęzi dotyczącej tych ustawień:

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

Zastanawiałem się teraz, czy jest różnica między „0,58”, czy powinienem określić „refs / heads / 0.58”?

Jaka jest dokładnie różnica?

Albert
źródło
1
Wystarczy adresuje literówkę w tytule (nie brudząc ze starym tytułem modyfikując go teraz) , powinien przeczytać „pozycje literatury / głowice / BRANCHNAME” , headsz „S”.
RomainValeri,

Odpowiedzi:

131

A refto wszystko, co wskazuje na zatwierdzenie, na przykład gałęzie (głowy), tagi i zdalne gałęzie. Powinieneś widzieć głowy, piloty i tagi w swoim .git/refskatalogu, zakładając, że masz wszystkie trzy typy referencji w swoim repozytorium.

refs/heads/0.58określa gałąź o nazwie 0.58. Jeśli nie określisz, w której przestrzeni nazw znajduje się ref, git będzie szukał domyślnych. To sprawia, że ​​użycie tylko 0,58 jest niejednoznaczne - możesz mieć zarówno gałąź, jak i tag o nazwie 0,58.

Cascabel
źródło
3
Wielkie dzięki, to bardzo dobrze to wyjaśnia. Po prostu działało z prostym „0.58”, ponieważ nie ma takiego nazwanego tagu.
Albert
1
Racja, zasadniczo zawsze będzie w porządku, ale dobrze jest być bezpiecznym.
Cascabel
Ta odpowiedź to skarb. Wreszcie ktoś wyjaśnia Git i podoba mi się to! Dzięki.
aderchox
9
Oto wszystkie z nich dla jasności: refs/heads/i refs/remotes/irefs/tags/
Jim Aho
42

Tylko dla kogoś, kto jest zaciekawiony - git show-refdostępne od wersji Git v1.8.2.2, pokaże wszystkie odniesienia, które masz w swoim lokalnym repozytorium.

Artem Dolobanko
źródło
3
git log --decorate=full
Pokaże
20

Widzisz, branchNamemusi zostać w pełni rozwiązany, zanim GIT będzie mógł to zidentyfikować. W pełni rozpoznana nazwa to refs/heads/branchName.

Jedno ze słynnych poleceń w git checkout branchNamerzeczywistości automatycznie rozwiązuje go w pełni, aby zidentyfikować, gdzie chcesz zapłacić. Zwróć uwagę, że robi to automatycznie, dlatego nigdy nie piszemy go w pełni samodzielnie.

Jak to się dzieje? Spójrzmy tutaj

refname : np master, heads/master,refs/heads/master

Symboliczna nazwa odniesienia. Np. Master zazwyczaj oznacza obiekt zatwierdzenia, do którego się odwołuje refs/heads/master. Jeśli masz oba heads/masteri tags/master, możesz wyraźnie heads/masterpowiedzieć Gitowi, który z nich masz na myśli. Gdy jest niejednoznaczne, a <refname>jest ujednoznaczniane przez wybranie pierwszego dopasowania według następujących reguł:

1.Jeżeli $GIT_DIR/<refname>istnieje, to jest to, co masz na myśli (zazwyczaj jest to przydatne tylko dla HEAD, FETCH_HEAD, ORIG_HEAD, MERGE_HEADi CHERRY_PICK_HEAD);

2. w przeciwnym refs/<refname>razie , jeśli istnieje;

3. w przeciwnym refs/tags/<refname>razie , jeśli istnieje;

4. w przeciwnym refs/heads/<refname>razie , jeśli istnieje;

5. w przeciwnym refs/remotes/<refname>razie , jeśli istnieje;

6. w przeciwnym refs/remotes/<refname>/HEADrazie , jeśli istnieje.

Tak więc, wykonując powyższe 6 kroków, próbuje rozwiązać, co to jest branchName. Dlatego nigdy nie musimy podawać mu w pełni rozwiązanej nazwy branchName.

Spójrz tutaj i tutaj .

Przejdź również do swojego .gitkatalogu i zajrzyj do reffolderu.

Numer945
źródło