wake-up-neo.com

git fetch vs. git fetch Origin Master haben unterschiedliche Auswirkungen auf den Tracking-Zweig

Dies ist meistens eine Neugier, da ich versuche, mich mit Git vertraut zu machen. Ich habe mir die Dokumentation für 'git fetch' angesehen, sehe aber keine offensichtliche Erklärung für das Folgende. Vielen Dank im Voraus und entschuldigen Sie, wenn dies offensichtlich offensichtlich ist.

1) Von einem zentralen Repository aus, z. B. GitHub, klone ich ein Repository mit dem Namen website auf jeder der beiden Maschinen HostA und HostB

2) Bei HostA ändere ich eine Datei, sage README.txt, und übergebe sie.
An diesem Punkt auf HostA sind die Commits für die Zweige master und Origin/master wie erwartet anders, da ich noch nicht gepusht habe

git show master
git show Origin/master

verschiedene Hashes melden (da master die Änderung hat und Origin/master nicht)

3) Sobald ich schiebe, sind sie danach gleich.


4) Nun über HostB, wenn ich Folgendes mache:

git fetch
git merge FETCH_HEAD

danach melden Sie auf HostB master und Origin/master denselben Hash, wenn Sie mit git show abgefragt werden.

ABER

wenn ich es stattdessen getan hätte, auf HostB:

git fetch Origin master
git merge FETCH_HEAD

zu diesem Zeitpunkt unterscheiden sich die Hashes noch.

git show Origin
git show Origin/master

report different Hashes

Der Tracking-Zweig Origin/master wird erst aktualisiert, wenn ich einen einfachen git fetch mache.

Warum ist das?

22
Xoanon93

Wenn Ihrem Zweig ein Fernverfolgungszweig zugeordnet ist, bedeutet dies, dass die Konfiguration wie folgt lautet:

git config branch.[branch-name].remote [remote-name]
git config branch.[branch-name].merge [remote-master]

Der Schlüsselteil von git fetch, der den Unterschied zwischen den beiden Befehlen erklärt, ist:

<refspec>

Das Format eines <refspec>-Parameters ist ein optionales Pluszeichen +, gefolgt von der Quellreferenz <src>, gefolgt von einem Doppelpunkt :, gefolgt von der Zielreferenz <dst>.
Die ferne Referenz, die mit <src> übereinstimmt, wird abgerufen, und , wenn <dst> keine leere Zeichenfolge ist, wird die lokale Referenz, die mit <src> übereinstimmt, schnell weitergeleitet.

Lass es mich wiederholen:

Wenn <dst> keine leere Zeichenfolge ist, wird die zugehörige lokale Referenz mit <src> vorgespult.
Wissend, dass:

  • git fetch entspricht git fetch Origin master:master (vom Standardwert Ihrer Zweigkonfiguration), sodass der Zweig für die Fernverfolgung aktualisiert wird: Das Ziel der Refspec ist für Sie angegeben .

  • git fetch Origin master entspricht "git fetch Origin master:", nicht "git fetch Origin master:master"; Der abgerufene Wert des Zweigs "master" (des Zweigs "Origin") wird in FETCH_HEAD gespeichert und nicht in dem Zweig "master" oder dem Zweig "remotes/Origin/master" zur Fernverfolgung (von - Jakub Narębski 's Antwort )
    Mit anderen Worten, Sie haben das Ziel Ihrer Referenz nicht angegeben

23
VonC

Die Antwort liegt in den Nachrichten, die Sie von git fetch erhalten. Im ersten Fall werden Sie beim Abrufen ohne Angabe eines refspecs feststellen, dass die Remote-Tracking-Zweige aktualisiert werden:

remote: Counting objects: 5, done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
From /depot
   c67d1c8..1941673  master     -> Origin/master

Beachten Sie, wie in der Meldung angezeigt wird, dass Origin/Master vom Origin aus mit dem Master aktualisiert wurde.

Im zweiten Fall, in dem Sie den refspec angeben, erhalten Sie etwas ganz anderes:

remote: Counting objects: 5, done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
From /depot
 * branch            master     -> FETCH_HEAD

Wenn Sie also den refspec angeben, wird der Remote-Tracking-Zweig (Origin/Master) NICHT aktualisiert, sondern nur FETCH_HEAD.

Das Endergebnis ist, dass Sie vor Origin/Master zu sein scheinen, wenn Sie nicht wirklich sind. Ich kann mir nicht vorstellen, warum dieses Verhalten wünschenswert wäre, aber es ist auf jeden Fall eine interessante kleine Besonderheit des Abrufbefehls.

0
Ethan Brown

Wenn Sie schnell vorspulen möchten, fügen Sie sich zusammen, oder verwenden Sie git pull. Sie scheinen nicht zu verstehen, dass der Zweck von git fetch NICHT darin besteht, Ihren Arbeitsbaum zu aktualisieren. Fetch dient zur Aktualisierung Ihrer Tracking-Zweige.

0
UpAndAdam