2012-08-09 9 views
18

Dies ist vor allem von der Natur einer Kuriosität, wie ich versuche, mit Git vertraut zu werden. Ich habe mir die Dokumentation für "git fetch" angesehen, aber ich sehe keine offensichtliche Erklärung für das Folgende. Vielen Dank im Voraus, und Entschuldigung, wenn das heulend offensichtlich ist.git fetch vs. git fetch ursprung master haben verschiedene effekte auf tracking zweig

1) Von einem zentralen Repository, sagen wir GitHub, klone ich ein Repository namens website auf jeder der zwei Maschinen, HostA und HostB.

2) auf HostA, mache ich eine Änderung an einer Datei, sagen README.txt, und begehen Sie es.
An diesem Punkt auf HostA die Commits für Zweige master und origin/master sind, so unterschiedlich zu erwarten, da ich noch nicht

git show master 
git show origin/master 

Bericht unterschiedlichen Hashes geschoben habe (da master hat die Änderung und origin/master nicht)

3) Sobald ich drücke, sind sie danach gleich.


4) nun über auf HostB, wenn ich wie folgt vorgehen:

git fetch 
git merge FETCH_HEAD 

danach auf HostB master und origin/master Bericht den gleichen Hash bei einer Abfrage mit git show

ABER

wenn ich stattdessen getan hätte, unter HostB:

git fetch origin master 
git merge FETCH_HEAD 

zu diesem Zeitpunkt unterscheiden sich die Hashes noch.

git show origin 
git show origin/master 

Bericht verschiedene Hashes

Die Tracking-Zweig origin/master wird nicht aktualisiert, bis ich ein git fetch

Ebene tun Warum ist das?

+0

Fast doppelt: (die Tatsache, dass es Pull ist, nicht holen, macht keinen wesentlichen Unterschied) http://stackoverflow.com/questions/1741143/git-pull-origin-mybranch-leaves-local-mybranch-n- commits-ahead-of-origin-warum –

Antwort

20

Wenn der Zweig hat eine zugeordnete remote tracking branch das heißt seine Konfiguration ist wie:

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

Der Schlüsselteil git fetch die den Unterschied zwischen den beiden Befehlen erklären:

<refspec> 

Das Format eines <refspec> Parameters ist ein optionales Plus +, gefolgt von der Quellenreferenz <src>, gefolgt von einem Doppelpunkt :, gefolgt von dem Ziel Ref <dst>. mit <src>
Der Remote-ref, die <src> Spiele geholt und wenn <dst> nicht leere Zeichenkette, die lokale ref, die es pult passt ist.

Lassen Sie es mich wiederholen:

wenn <dst> nicht leere Zeichenfolge ist, die lokale ref, die es passt ist pult mit <src>.
Zu wissen, dass:

  • git fetch zu git fetch origin master:master entspricht (vom Standardwert Ihrer Niederlassung config), so dass es den Remote-Tracking-Zweig aktualisieren: das Ziel der Refspec für angegeben ist Sie.

  • git fetch origin master ist äquivalent zu "git fetch origin master:", nicht auf "git fetch origin master:master"; speichert er geholt Wert von 'master' Zweig (Remote 'origin ') in FETCH_HEAD, und nicht in' master' Zweig oder Remote-Tracking 'remotes/origin/master' Zweig (von Jakub Narębski ‚s answer)
    Mit anderen Worten, Sie didn ‚t das Ziel Ihrer Refspec angeben

+0

Hi VonC: Vielen Dank, genau das musste ich wissen. – Xoanon93

+0

@ Xoanon93 Gern geschehen. Ich gehe immer zurück zu http://stackoverflow.com/questions/1070496/having-a-hard-time-understanding-git-fetch, wenn Zweifel über Remote-Tracking-Filialen sind. – VonC

+2

mein Gehirn tut weh. –

0

Die Antwort liegt in den Nachrichten, die Sie von git fetch erhalten. Im ersten Fall, wenn Sie holen, ohne eine Refspec bietet, werden Sie sehen, dass der Remote-Tracking-Zweig aktualisiert:

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 

Hinweis, wie die Nachricht sagt, dass Herkunft/Master mit dem Master vom Ursprung aktualisiert wird.

nun im zweiten Fall, in dem Sie die 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 

Also, wenn Sie die Refspec angeben, den Remote-Tracking-Zweig (origin/master) nicht aktualisiert wird, nur FETCH_HEAD.

Das Endergebnis ist, dass Sie vor dem Ursprung/Master zu sein scheinen, wenn Sie nicht wirklich sind.Ich kann mir nicht vorstellen, warum dieses Verhalten wünschenswert wäre, aber es ist definitiv eine interessante kleine Eigenart des Befehls fetch.

0

Wenn Sie sich fasten wollen vorwärts fusionieren oder git pull verwenden. Sie scheinen nicht zu verstehen, dass der Zweck von git fetch NICHT darin besteht, Ihren Arbeitsbaum zu aktualisieren. Fetch dient dazu, Ihre Tracking-Zweige zu aktualisieren.