Frage Was ist der Unterschied zwischen "git pull" und "git fetch"?


Moderator Hinweis: Da diese Frage bereits gestellt wurde vierundsechzig Antworten gepostet, darüber nachdenken, ob Sie es sind oder nicht etwas neues beisteuern bevor du einen anderen postest.

Was sind die Unterschiede zwischen? git pull und git fetch?


10125
2017-11-15 09:51


Ursprung


Antworten:


In den einfachsten Worten, git pull tut ein git fetch gefolgt von einem git merge.

Sie können a git fetch jederzeit aktualisieren Sie Ihre Remote-Tracking-Filialen unter refs/remotes/<remote>/.

Diese Operation ändert niemals eigene lokale Zweige unter refs/headsund ist sicher, ohne Ihre Arbeitskopie zu ändern. Ich habe sogar von Leuten gehört, die rannten git fetch regelmäßig in einem Cron-Job im Hintergrund (obwohl ich das nicht empfehlen würde).

EIN git pull ist, was Sie tun würden, um eine lokale Zweigstelle mit ihrer Remote-Version auf den neuesten Stand zu bringen und gleichzeitig Ihre anderen Zweigstellen für die Fernüberwachung zu aktualisieren.

Git Dokumentation: git ziehen


8455
2017-11-15 09:52



  • Wenn Sie verwenden pull, Git versucht automatisch deine Arbeit für dich zu erledigen. Es ist kontextsensitiv, damit Git alle gezogenen Commits in den Zweig mischt, in dem Sie gerade arbeiten. pull  Fügt die Commits automatisch zusammen, ohne sie vorher prüfen zu lassen. Wenn Sie Ihre Filialen nicht genau verwalten, können Sie häufig Konflikte verursachen.

  • Wenn du fetch, Git sammelt alle Commits vom Zielzweig, die in Ihrem aktuellen Zweig nicht existieren und speichert sie in Ihrem lokalen Repository. Jedoch, Sie werden nicht mit Ihrer aktuellen Zweigstelle zusammengeführt. Dies ist besonders nützlich, wenn Sie Ihr Repository auf dem neuesten Stand halten müssen, aber an etwas arbeiten, das beim Aktualisieren Ihrer Dateien möglicherweise beschädigt wird. Um die Commits in Ihren Masterzweig zu integrieren, verwenden Sie merge.


1849
2017-08-18 08:53



Es ist wichtig, die Designphilosophie von Git mit der Philosophie eines traditionelleren Quellcodeverwaltungswerkzeugs wie SVN zu vergleichen.

Subversion wurde mit einem Client / Server-Modell entworfen und gebaut. Es gibt ein einzelnes Repository, das der Server ist, und mehrere Clients können Code vom Server abrufen, daran arbeiten und ihn dann zurück auf den Server übertragen. Die Annahme ist, dass der Client den Server immer kontaktieren kann, wenn er eine Operation ausführen muss.

Git wurde entwickelt, um ein verteilteres Modell zu unterstützen, ohne dass ein zentrales Repository benötigt wird (obwohl Sie sicherlich eines verwenden können, wenn Sie möchten). Auch Git wurde so konzipiert, dass der Client und der "Server" nicht gleichzeitig online sein müssen. Git wurde so konzipiert, dass Menschen auf einem unzuverlässigen Link sogar per E-Mail Code austauschen können. Es ist möglich, völlig getrennt zu arbeiten und eine CD zu brennen, um Code über Git auszutauschen.

Um dieses Modell zu unterstützen, unterhält git ein lokales Repository mit Ihrem Code und ein zusätzliches lokales Repository, das den Status des Remote-Repositorys widerspiegelt. Indem eine Kopie des Remote-Repositorys lokal gespeichert wird, kann git die erforderlichen Änderungen selbst dann ermitteln, wenn das Remote-Repository nicht erreichbar ist. Später, wenn Sie die Änderungen an jemand anderen senden müssen, kann git sie als eine Reihe von Änderungen von einem bekannten Zeitpunkt an das Remote-Repository übertragen.

  • git fetchist der Befehl, der besagt "bringe meine lokale Kopie des Remote-Repository auf den neuesten Stand."

  • git pull sagt: "Bring die Änderungen in das Remote-Repository, wo ich meinen eigenen Code behalten."

Normalerweise git pull tut dies, indem er a git fetch um die lokale Kopie des Remote-Repositorys auf den neuesten Stand zu bringen und dann die Änderungen in Ihr eigenes Code-Repository und möglicherweise Ihre Arbeitskopie zu integrieren.

Das Mitnehmen ist zu bedenken, dass es oft mindestens gibt drei Kopien eines Projekts auf Ihrer Workstation. Eine Kopie ist Ihr eigenes Repository mit Ihrem eigenen Commit-Verlauf. Die zweite Kopie ist Ihre Arbeitskopie, wo Sie bearbeiten und erstellen. Die dritte Kopie ist Ihre lokale "zwischengespeicherte" Kopie eines Remote-Repository.


1007
2018-03-31 18:43



Hier ist Oliver Steele's Image, wie alles zusammenpasst:

enter image description here

Wenn es genügend Interesse gibt, nehme ich an, ich könnte das hinzuzufügende Bild aktualisieren git clone und git merge...


660
2018-06-09 13:30



Ein Anwendungsfall von git fetch Das Folgende wird Ihnen alle Änderungen in der Remote-Verzweigung seit Ihrem letzten Pull mitteilen ... so können Sie überprüfen, bevor Sie einen tatsächlichen Pull ausführen, der Dateien in Ihrem aktuellen Zweig und Ihrer Arbeitskopie ändern könnte.

git fetch
git diff ...origin

427
2018-05-07 19:23



Es hat mich ein bisschen gekostet zu verstehen, was der Unterschied war, aber das ist eine einfache Erklärung. master in Ihrem localhost ist eine Niederlassung.

Wenn Sie ein Repository klonen, holen Sie das gesamte Repository auf Ihren lokalen Host. Dies bedeutet, dass Sie zu diesem Zeitpunkt einen Ursprung / Master-Zeiger auf haben HEAD und Master zeigt auf dasselbe HEAD.

Wenn Sie anfangen zu arbeiten und Commits ausführen, rücken Sie den Master-Zeiger auf HEAD + Ihre Verpflichtungen. Aber der Ursprung / Master-Zeiger zeigt immer noch an, was es war, als Sie klonten.

Also wird der Unterschied sein:

  • Wenn Sie ein tun git fetch Es werden nur alle Änderungen im Remote-Repository abgerufen (GitHub) und verschieben Sie den Ursprung / Master-Zeiger auf HEAD. In der Zwischenzeit zeigt Ihr lokaler Zweigmeister immer wieder an, wo er sich befindet.
  • Wenn Sie ein tun git pull, wird es im Prinzip holen (wie zuvor erklärt) und füge alle neuen Änderungen zu deinem Hauptzweig hinzu und verschiebe den Zeiger zu HEAD.

341
2018-05-11 18:37



Manchmal hilft eine visuelle Darstellung.

enter image description here


179
2018-01-25 17:28



Kurz

git fetch ist ähnlich wie pull aber fusioniert nicht. d. h. es ruft Remote-Updates ab (refs und objects) aber Ihr lokaler bleibt der gleiche (d. h. origin/master wird aktualisiert aber master bleibt gleich) .

git pull zieht von einer Fernbedienung herunter und verschmilzt sofort.

Mehr

git clone Klont ein Repo.

git rebase speichert Daten von Ihrem aktuellen Zweig, der sich nicht im Upstream-Zweig befindet, in einen temporären Bereich. Ihr Zweig ist jetzt derselbe wie vor dem Beginn Ihrer Änderungen. Damit, git pull -rebase Ziehen Sie die Remote-Änderungen herunter, spulen Sie Ihren lokalen Zweig zurück und wiederholen Sie Ihre Änderungen über den Anfang Ihres aktuellen Zweiges, bis Sie auf dem neuesten Stand sind.

Ebenfalls, git branch -a zeigt Ihnen genau, was mit all Ihren Filialen passiert - lokal und remote.

Dieser Blogbeitrag war nützlich:

Der Unterschied zwischen git pull, git fetch und git clone (und git rebase) - Mike Pearce

und deckt git pull, git fetch, git clone und git rebase.

====

AKTUALISIEREN

Ich dachte, ich würde das aktualisieren, um zu zeigen, wie Sie das in der Praxis anwenden würden.

  1. Aktualisieren Sie Ihren lokalen Repo von der Remote (aber nicht zusammenführen):

    git holen

  2. Nach dem Herunterladen der Updates sehen wir uns die Unterschiede an:

    Git Diff Master Herkunft / Master

  3. Wenn Sie mit diesen Updates zufrieden sind, führen Sie folgende Schritte durch:

    git ziehen

Anmerkungen:

Schritt 2: Weitere Informationen zu Diffs zwischen lokalen und Remote-Computern finden Sie unter: Vergleichen Sie lokale Git-Zweig mit Remote-Zweig?

In Schritt 3: Es ist wahrscheinlich genauer (z. B. bei einem schnell wechselnden Repo), a git rebase origin Hier. Siehe @Justin Ohms Kommentar in einer anderen Antwort.

Siehe auch: http://longair.net/blog/2009/04/16/git-fetch-and-merge/ 


165
2018-04-13 17:31



git-pull - Abrufen von und Zusammenführen mit einem anderen Repository oder einer lokalen Verzweigung
ZUSAMMENFASSUNG

git ziehen ...
BESCHREIBUNG

Führt git-fetch mit den angegebenen Parametern aus und ruft git-merge auf, um die Datei zusammenzuführen
Kopf (e) in den aktuellen Zweig übernommen. Mit --rebase ruft git-rebase auf
anstelle von git-merge.

Beachten Sie, dass Sie verwenden können. (aktuelles Verzeichnis) als das <repository> zu ziehen
aus dem lokalen Repository - dies ist nützlich beim Zusammenführen lokaler Zweige
in den aktuellen Zweig.

Beachten Sie auch, dass Optionen für git-pull selbst und zugrunde liegende git-merge gedacht sind
muss vor den Optionen für Git-Fetch gegeben werden.

Sie würden ziehen, wenn Sie möchten, dass die Historien zusammengeführt werden, würden Sie holen, wenn Sie nur den Codez wollen, weil irgendeine Person einige Artikel hier getaggt hat.


155
2017-11-15 09:52



Sie können von einem Remote-Repository abrufen, die Unterschiede anzeigen und dann ziehen oder zusammenführen.

Dies ist ein Beispiel für ein Remote-Repository namens origin und eine Filiale angerufen master Verfolgen der Remote-Zweigstelle origin/master:

git checkout master                                                  
git fetch                                        
git diff origin/master
git rebase origin master

143
2018-03-21 11:07



Die kurze und einfache Antwort ist das git pull ist einfach git fetch gefolgt von git merge.

Es ist sehr wichtig, das zu beachten git pull werden automatisch zusammenführen, ob Sie es mögen oder nicht. Dies könnte natürlich zu Konflikten führen. Nehmen wir an, Ihre Fernbedienung ist origin und deine Filiale ist master. Wenn du git diff origin/master Bevor Sie ziehen, sollten Sie eine Vorstellung von potenziellen Konflikten haben und Ihre lokale Niederlassung darauf vorbereiten.

Zusätzlich zum Ziehen und Schieben einige Arbeitsabläufe involvieren git rebasewie diese, die ich aus dem verlinkten Artikel umschreibe:

git pull origin master
git checkout foo-branch
git rebase master
git push origin foo-branch

Wenn Sie sich in einer solchen Situation befinden, könnten Sie versucht sein git pull --rebase. Wenn Sie nicht wirklich wissen, was Sie tun, würde ich davon abraten. Diese Warnung stammt von man Seite für git-pull, Ausführung 2.3.5:

Dies ist eine potentiell gefährliche Arbeitsweise. Es schreibt um   Geschichte, die nichts Gutes verheißt, als du diese Geschichte veröffentlichst   bereits. Verwenden Sie diese Option nur, wenn Sie git-rebase (1) gelesen haben   vorsichtig.


132
2018-05-15 20:53