git fetch
Erfahren Sie alles über den Befehl git fetch, den Unterschied zu git pull und sehen Sie viele praktische Beispiele.
Der Befehl git fetch lädt Commits, Dateien und Referenzen aus einem Remote-Repository in Ihr lokales Repository herunter, ohne dabei Ihre eigene Arbeit zu verändern. Es ist die sichere Methode, um zu sehen, was Ihre Teammitglieder gemacht haben: Nichts in Ihrem Arbeitsverzeichnis oder Ihren lokalen Branches wird berührt, bis Sie sich entscheiden, einen Merge durchzuführen.
Diese Seite erklärt, was git fetch macht, wie es Remote-Tracking-Branches aktualisiert, die nützlichsten Optionen, wie man einen bestimmten Branch oder ein ganzes Remote abruft, und wie sich git fetch von git pull unterscheidet.
Definition
Der Befehl git fetch wird verwendet, um Commits, Objekte und Referenzen aus einem Remote-Repository in das lokale Repository herunterzuladen. Er wird eingesetzt, um zu sehen, woran andere Teammitglieder gearbeitet haben. Im Gegensatz zu git pull führt er die heruntergeladene Arbeit niemals automatisch mit Ihrem aktuellen Branch zusammen.

Funktionsweise mit Remote-Branches
Git speichert lokale und Remote-Commits und trennt diese durch Branch-Referenzen. Die Referenzen für lokale Branches werden im Verzeichnis /.git/refs/heads/ gespeichert. Um die Liste der lokalen Branch-Referenzen anzuzeigen, führen Sie den Befehl git branch aus.
git branch
git branch
* master
crossword
solverDas Untersuchen des Inhalts des Verzeichnisses /.git/refs/heads/ ergibt folgende Ausgabe:
ls ./.git/refs/heads/
ls ./.git/refs/heads/
master
crossword
solverRemote-Branch-Referenzen werden im Verzeichnis ./.git/refs/remotes/ gespeichert. Um die Remote-Branches anzuzeigen, verwenden Sie das Flag -r mit git branch. Hier ist die Ausgabe nach dem Abrufen eines Remote-Repositorys:
git branch -r
git branch -r
origin/master
origin/crossword
origin/solver
remote-repo/master
remote-repo/other-featureDie Ausgabe zeigt Remote-Branches mit dem Präfix origin/. Diese sind Remote-Tracking-Branches — schreibgeschützte lokale Kopien, die aufzeichnen, wo sich jeder Branch beim letzten Fetch auf dem Remote befand. Sie können diese mit den Befehlen git checkout und git log untersuchen. Nach der Überprüfung der Änderungen können Sie einen Remote-Tracking-Branch mit git merge in Ihren lokalen Branch zusammenführen. Verwenden Sie git pull, um Fetch und Merge in einem einzigen Schritt zu kombinieren.
Häufig verwendete Optionen
| Option | Funktion |
|---|---|
--all | Ruft alle konfigurierten Remotes ab, nicht nur eines. |
-k, --keep | Behält die heruntergeladene Pack-Datei, anstatt sie zu entpacken. |
-p, --prune | Entfernt Remote-Tracking-Referenzen, die auf dem Remote nicht mehr existieren. |
--depth=<depth> | Begrenzt die Anzahl der von der Spitze jedes Branches abgerufenen Commits (ein flacher Fetch). |
--dry-run | Zeigt an, was abgerufen würde, ohne tatsächlich etwas herunterzuladen. |
Um Tracking-Referenzen für Branches zu entfernen, die auf dem Remote nicht mehr existieren, verwenden Sie --prune:
git fetch --pruneUm von allen konfigurierten Remotes gleichzeitig abzurufen, verwenden Sie --all:
git fetch --allEinen Remote-Branch mit git fetch abrufen
Im Folgenden zeigen wir die Schritte zum Abrufen eines Remote-Branches und zur Aktualisierung des lokalen Arbeitsstands auf den Remote-Inhalt. Im folgenden Beispiel gibt es ein zentrales Repository origin, von dem das lokale Repository mit dem Befehl git clone geklont wurde. Es gibt ein weiteres Remote-Repository namens test_repo, das feature_branch enthält und konfiguriert sowie abgerufen werden muss.
Der erste Schritt besteht darin, das Remote-Repository mit git remote zu konfigurieren:
git remote
git remote add test_repo git@hostname:test/test_repo.gitMithilfe der URL des Kollegen-Repositorys haben wir eine Referenz darauf erstellt. Um den Inhalt herunterzuladen, rufen wir git fetch für den test feature_branch ab:
git fetch
git fetch test_repo feature_branch
From hostname:test/test_repo
* [new branch] feature_branch -> test_repo/feature_branchDadurch wird der Inhalt von test_repo/feature_branch als Remote-Tracking-Branch in Ihr lokales Repository heruntergeladen — er wird nicht mit Ihrem aktuellen Branch zusammengeführt. Verwenden Sie nun den Befehl git checkout, um den heruntergeladenen Remote-Branch zu untersuchen:
git checkout test_repo/feature_branch
git checkout test_repo/feature_branch
Note: checking out 'test_repo/feature_branch'.
You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can drop all the commits you make in this
state without influencing branches by executing another checkout.
If you want to generate a new branch for maintaining commits you create, you may
do so (now or later) if you use -b with the checkout command again. Example:
git checkout -b <new-branch-name>Die Ausgabe zeigt, dass wir uns im detached HEAD-Zustand befinden, was bedeutet, dass die HEAD-Referenz direkt auf einen Commit anstatt auf einen Branch zeigt.
Mit dem Befehl git checkout kann ein neuer lokaler Branch aus der Referenz test/feature_branch erstellt werden:
git checkout -b local_feature_branch test_repo/feature_branch
git checkout -b local_feature_branch test_repo/feature_branchDer neue lokale Branch wird erstellt und HEAD zeigt auf den neuesten Remote-Inhalt.
origin mit git fetch synchronisieren
Das folgende Beispiel zeigt, wie das lokale Repository mit dem master-Branch des zentralen Repositorys synchronisiert wird:
git fetch origin
git fetch originDie Ausgabe zeigt die heruntergeladenen Branches:
git fetch origin output
b341bc3..32a45b1 master -> origin/master
b341bc3..7a52a22 develop -> origin/develop
* [new branch] some-feature -> origin/some-featureRufen Sie git log mit origin/master als Filter auf, um die Commits anzuzeigen, die dem upstream master hinzugefügt wurden:
git log --oneline master..origin/master
git log --oneline master..origin/masterÜberprüfen Sie die Änderungen und führen Sie diese in den lokalen master-Branch ein:
git checkout master && git log origin/master
git checkout master
git log origin/masterFühren Sie git merge origin/master aus, um mit den upstream-Entwicklungen zu synchronisieren:
git merge
git merge origin/masterEin typisches Zusammenarbeitsszenario
Hier ist ein Szenario, das Ihnen hilft, dieses Konzept besser zu verstehen.
Angenommen, es gibt ein kleines Entwicklungsteam, bestehend aus zwei Entwicklern, Alice und Bob. Sie arbeiten an einem Projekt, das in einem Remote-Git-Repository namens origin gehostet wird. Alice klont das Repository auf ihren lokalen Rechner und beginnt, am main-Branch zu arbeiten, während Bob an einem separaten Branch namens feature-branch arbeitet.
1- Alice erstellt eine neue Datei namens README.md und nimmt einige Änderungen daran vor. Anschließend committet und pusht sie ihre Änderungen in den main-Branch des origin-Repositorys:
$ git add README.md
$ git commit -m "Add README file"
$ git push origin main2- Inzwischen hat Bob einige Änderungen am feature-branch vorgenommen und diese in das origin-Repository gepusht:
$ git add some_file.txt
$ git commit -m "Add new feature"
$ git push origin feature-branch3- Alice bemerkt, dass sie Bobs Änderungen in ihre eigene Arbeit integrieren muss, und ruft daher die Änderungen aus dem origin-Repository ab:
$ git fetch origin4- Nach dem Fetch kann Alice sehen, dass es neue Änderungen im feature-branch gibt:
$ git branch -r
origin/HEAD -> origin/main
origin/main
origin/feature-branch5- Alice kann nun Bobs Änderungen in ihren main-Branch zusammenführen:
$ git merge origin/feature-branch6- Alice löst alle Merge-Konflikte und pusht dann ihre Änderungen in das origin-Repository:
$ git push origin main7- Bob kann nun die von Alice vorgenommenen Änderungen abrufen:
$ git fetch origin8- Bob kann nun sehen, dass es neue Änderungen im main-Branch gibt:
$ git branch -r
origin/HEAD -> origin/main
origin/main
origin/feature-branch9- Bob kann die von Alice vorgenommenen Änderungen in seinen feature-branch zusammenführen:
$ git merge origin/main10- Bob löst alle Merge-Konflikte und pusht dann seine Änderungen in das origin-Repository:
$ git push origin feature-branchUnd so setzt sich der Zyklus fort, wobei sowohl Alice als auch Bob git fetch verwenden, um die Änderungen des jeweils anderen zu verfolgen und eigene Änderungen in das origin-Repository zu pushen. Durch die Verwendung von git fetch können sie ihr lokales Repository mit den Änderungen ihrer Teammitglieder auf dem neuesten Stand halten, was dazu beiträgt, Konflikte zu vermeiden und einen reibungslosen Kollaborationsprozess sicherzustellen.
Git fetch vs. git pull
Sowohl git fetch als auch git pull werden zum Herunterladen von Inhalten aus dem Remote-Repository verwendet. Der Befehl git fetch führt Änderungen nicht automatisch in Ihre lokalen Branches ein; er aktualisiert lediglich Ihre Remote-Tracking-Branches. Der abgerufene Inhalt beeinflusst Ihr lokales Arbeitsverzeichnis nicht, sodass Sie Commits sicher überprüfen können, bevor Sie diese zusammenführen. Der Befehl git pull lädt neue Inhalte herunter und führt diese automatisch in Ihren aktuellen Branch ein. Dies kann zu Merge-Konflikten führen, daher wird empfohlen, git pull nur auszuführen, wenn Ihre Arbeitskopie sauber ist.
Kurz gesagt ist git pull in etwa äquivalent zu git fetch gefolgt von git merge:
git pull origin main
# is similar to:
git fetch origin
git merge origin/mainWann git fetch verwendet werden sollte
Greifen Sie auf git fetch zurück, wenn Sie:
- Änderungen sehen möchten, bevor Sie diese integrieren. Führen Sie zuerst einen Fetch durch, untersuchen Sie dann mit
git log origin/main..odergit diff main origin/main, und führen Sie den Merge erst durch, wenn Sie bereit sind. - Remote-Tracking-Branches aktualisieren möchten, ohne Ihre Arbeit zu berühren. Nützlich in der Mitte einer Aufgabe, wenn Ihr Arbeitsverzeichnis nicht committete Änderungen enthält, die ein
git pullstören könnte. - Veraltete Branches bereinigen möchten.
git fetch --pruneentfernt Remote-Tracking-Referenzen für Branches, die auf dem Remote gelöscht wurden. - Den Branch eines Teammitglieds überprüfen möchten. Rufen Sie ihn ab, checken Sie ihn aus, um den Code zu lesen, und entscheiden Sie dann, ob Sie einen Merge durchführen möchten.