Git Pull führt kein Git Fetch aus

8

Mein Verständnis war immer, dass git pull im Wesentlichen eine Kombination von git fetch und git merge ... ist, aber ich habe es schon einige Male erlebt, wo ziehen, dann vergleichen zeigt Änderungen, die nicht meine sind, bis ich auch a mache fetch:

(auf Zweigblob):

%Vor%

Ist mein Verständnis von Zug falsch?

    
pinkboi 20.09.2013, 17:37
quelle

1 Antwort

15

Dies ist eine häufige Quelle der Verwirrung, so sehr, dass der #git IRC-Kanal einen vordefinierten Hilfstext dafür hat, genannt !pull4 :

  

Wir empfehlen, 'git fetch / pull & lt; remote & gt; & lt; refspec & gt; ' (d. h. mit Verzweigungsargument), weil es den & lt; remote & gt; / & lt; Zweig & gt; nicht aktualisiert; ref. Der einfache Weg, Dinge richtig zu holen, ist, alles zu bekommen: 'git fetch' oder 'git pull' sind ausreichend, wenn Sie eine Fernbedienung haben; Ansonsten empfehlen wir 'git fetch & lt; remote & gt;' (plus 'git merge & lt; remote & gt; / & lt; branch & gt;', wenn du ziehen / zusammenführen willst).

Was hier passiert ist, dass git pull ohne Argumente ein git fetch auf dem "Standard-Remote" (normalerweise origin ), dann git merge s der Remote-Zweig, der Ihrem aktuellen lokalen Zweig entspricht. git pull <remote> macht dasselbe mit einer explizit angegebenen Fernbedienung. Der "Vier-Wort-Pull", git pull <remote> <branch> , ruft jedoch die Verzweigung in einen temporären Speicherort ab, FETCH_HEAD , ohne aktualisiert Ihre Tracking-Zweige und führt dann FETCH_HEAD in Ihre aktuelle Verzweigung zusammen.

Wenn Sie also git pull origin blob verwenden, sagen Sie "Ich möchte die neueste Version des blob -Verzweigs in der entfernten origin in meinen aktuellen Zweig einbinden, ohne einen meiner Verfolgungszweige zu aktualisieren oder einen anderen zu holen Daten ".

Wenn Ihre Filialzusammenführungskonfigurationen korrekt sind (und das sind sie wahrscheinlich, da git clone und git checkout versuchen, sie automatisch einzurichten), können Sie einfach git pull oder git pull origin und es wird alles abholen und dann füge den Zweig ein, der deinem aktuell ausgecheckten Zweig entspricht. Wenn Sie eine explizitere Kontrolle wünschen, verwenden Sie git fetch und dann git merge . git pull <remote> <branch> ist selten was du willst.

(Der Grund dafür, dass git fetch die Dinge in Ihrem Beispiel korrigiert, ist, dass Ihr lokaler Zweig nach dem Pull mit den letzten Remote-Commits aktualisiert wurde, der Tracking-Zweig jedoch nicht. git fetch aktualisiert den Tracking-Zweig mit diesen Commits, an denen die Diffs wieder Sinn machen.)

    
ToxicFrog 20.09.2013, 19:19
quelle

Tags und Links