git: Unterschied zwischen "Branchenname" und "Refs / Heads / Branchenname"

92

Am besten an einem Beispiel zu erklären: Ich bin in Zweigstelle 0.58 des Repositorys und so ziehe ich:

git pull origin 0.58

Wenn ich nur "git pull" nenne, bekomme ich:

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.

Scheint, als hätte ich wahrscheinlich eine Option (--track?) Vergessen, als ich diesen Zweig ausgecheckt habe. Jedenfalls habe ich das jetzt eingestellt:

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

Und das scheint zu funktionieren. Dann habe ich mir aus Interesse einen anderen Zweig über diese Einstellung angesehen:

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

Ich habe mich jetzt gefragt, gibt es einen Unterschied zwischen "0,58" oder sollte ich "refs / Heads / 0,58" angeben?

Was ist der Unterschied genau?

Albert
quelle
1
Nur um die Tippfehler in dem Titel zu adressieren (ohne mit einem alten Titel durcheinander , indem sie es jetzt zu ändern) , soll es lesen „refs / heads / branch“ , headsmit einem „s“.
RomainValeri

Antworten:

126

A refist alles, was auf ein Commit hinweist, z. B. Zweige (Köpfe), Tags und entfernte Zweige. Sie sollten Köpfe, Fernbedienungen und Tags in Ihrem .git/refsVerzeichnis sehen, vorausgesetzt, Sie haben alle drei Arten von Refs in Ihrem Repository.

refs/heads/0.58Gibt einen Zweig mit dem Namen 0,58 an. Wenn Sie nicht angeben, in welchem ​​Namespace sich die Referenz befindet, wird git in den Standardnamen angezeigt. Dies macht die Verwendung von nur 0,58 möglicherweise mehrdeutig - Sie könnten sowohl einen Zweig als auch ein Tag mit dem Namen 0,58 haben.

Cascabel
quelle
3
Vielen Dank, das erklärt es sehr gut. Es hat nur mit dem einfachen "0.58" funktioniert, da es kein solches benanntes Tag gibt.
Albert
1
Richtig, es wird im Wesentlichen immer völlig in Ordnung sein, aber es ist gut, sicher zu sein.
Cascabel
Diese Antwort ist ein Schatz. Endlich erklärt jemand Git und ich genieße es! Vielen Dank.
Aderchox
7
Hier sind alle aus Gründen der Klarheit: refs/heads/und refs/remotes/undrefs/tags/
Jim Aho
38

Nur für jemanden, der neugierig ist - git show-refder seit Git v1.8.2.2 verfügbar ist - zeigt Ihnen alle Referenzen, die Sie in Ihrem lokalen Repository haben.

Artem Dolobanko
quelle
3
Außerdem git log --decorate=fullwerden die vollständigen Namen der Referenzen in der Geschichte
angezeigt
17

Sehen Sie, branchNamemuss vollständig gelöst werden, bevor GIT es tatsächlich identifizieren kann. Der vollständig aufgelöste Name lautet refs/heads/branchName.

Einer der berühmten Befehle git checkout branchNamelöst ihn automatisch vollständig auf, um festzustellen, wo Sie auschecken möchten. Beachten Sie, dass dies automatisch geschieht, sodass wir es niemals vollständig selbst schreiben.

Wie macht es das? Schauen wir hier

refname : zB master, heads/master,refs/heads/master

Ein symbolischer Referenzname. Beispiel: Master bedeutet normalerweise das Festschreibungsobjekt, auf das verwiesen wird refs/heads/master. Wenn Sie beides haben heads/masterund tags/master, können Sie heads/masterGit explizit mitteilen, welches Sie meinen. Wenn mehrdeutig, <refname>wird a durch das erste Match in den folgenden Regeln eindeutig :

1. Wenn $GIT_DIR/<refname>vorhanden ist , das ist , was du meinst (dies ist in der Regel nur sinnvoll , für HEAD, FETCH_HEAD, ORIG_HEAD, MERGE_HEADund CHERRY_PICK_HEAD);

2. andernfalls, refs/<refname>wenn es existiert;

3. andernfalls, refs/tags/<refname>wenn es existiert;

4. andernfalls, refs/heads/<refname>wenn es existiert;

5. andernfalls, refs/remotes/<refname>wenn es existiert;

6. andernfalls, refs/remotes/<refname>/HEADfalls vorhanden.

Mit den obigen 6 Schritten wird versucht, das Problem zu lösen branchName. Daher müssen wir ihm niemals einen vollständig aufgelösten Branchennamen geben.

Schau hier und hier auch.

Gehen Sie auch in Ihr .gitVerzeichnis und sehen Sie in den refOrdner.

Nummer 945
quelle