git fetch
Definition
Der Befehl git fetch wird verwendet, um Commits, Objekte und Referenzen aus einem Remote-Repository in das lokale Repository herunterzuladen. Er wird verwendet, um zu sehen, woran andere Teammitglieder gearbeitet haben.

Wie es mit Remote-Branches funktioniert
Git speichert die lokalen und entfernten Commits und trennt sie mithilfe von Branch-Referenzen. Die Referenzen für die lokalen Branches werden in /.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
solverWenn Sie den Inhalt des Verzeichnisses /.git/refs/heads/ untersuchen, erhalten Sie die 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 den Schalter -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/. Sie können die Remote-Branches mit den Befehlen git checkout und git log untersuchen. Nachdem Sie die Änderungen des Remote-Branches bestätigt haben, können Sie ihn mit dem Befehl git merge in den lokalen Branch zusammenführen. Verwenden Sie stattdessen den Befehl git pull, um den Prozess zu verkürzen.
Häufige Optionen
| --all | Ruft alle Remote-Branches ab. |
|---|---|
| -k oder --keep | Behält das heruntergeladene Pack. |
| -p oder --prune | Entfernt die Remote-Tracking-Referenzen, die vor dem Abrufen nicht auf dem Remote vorhanden waren. |
--depth=<depth> | Begrenzt die Anzahl der Commits, die vom Tip jedes Remote-Branch-Verlaufs abgerufen werden. |
Um Tracking-Referenzen für Branches zu entfernen, die auf dem Remote nicht mehr existieren, verwenden Sie --prune:
git fetch --pruneWie man den Remote-Branch mit git fetch abruft
Hier zeigen wir die Schritte zum Abrufen eines Remote-Branches und zum Aktualisieren des lokalen Arbeitszustands auf den Remote-Inhalt. Im folgenden Beispiel haben wir 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 Repositories des Kollegen haben wir eine Referenz darauf erstellt. Zum Herunterladen des Inhalts ruft git fetch den Test-Branch 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/feature_branch in das lokale Repository integriert. Verwenden Sie nun den Befehl git checkout, um den heruntergeladenen Remote-Branch auszuchecken:
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 statt 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, wobei HEAD auf den neuesten Remote-Inhalt zeigt.
Synchronisieren von origin mit git fetch
Das folgende Beispiel zeigt, wie das lokale Repository mit dem Master-Branch des zentralen Repositories synchronisiert wird:
git fetch origin
git fetch originDie Ausgabe zeigt die Branches, die heruntergeladen wurden:
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/masterPrüfen Sie die Änderungen und führen Sie sie in den lokalen Master-Branch zusammen:
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 häufiges Szenario:
Hier ist ein Szenario, das Ihnen hilft, dieses Konzept besser zu verstehen:
Nehmen wir an, es gibt ein kleines Entwicklungsteam, das aus zwei Entwicklern besteht, 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 auf dem Branch main 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 Branch main des Repositories origin:
$ git add README.md
$ git commit -m "Add README file"
$ git push origin main2- In der Zwischenzeit hat Bob einige Änderungen an feature-branch vorgenommen und sie in das Repository origin gepusht:
$ git add some_file.txt
$ git commit -m "Add new feature"
$ git push origin feature-branch3- Alice erkennt, dass sie Bobs Änderungen in ihre eigene Arbeit übernehmen muss, also ruft sie die Änderungen aus dem Repository origin ab:
$ git fetch origin4- Nach dem Abrufen kann Alice sehen, dass es neue Änderungen im Branch feature-branch gibt:
$ git branch -r
origin/HEAD -> origin/main
origin/main
origin/feature-branch5- Alice kann nun Bobs Änderungen in ihren Branch main zusammenführen:
$ git merge origin/feature-branch6- Alice löst alle Merge-Konflikte und pusht dann ihre Änderungen in das Repository origin:
$ 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 Branch main gibt:
$ git branch -r
origin/HEAD -> origin/main
origin/main
origin/feature-branch9- Bob kann die von Alice vorgenommenen Änderungen in seinen Branch feature-branch zusammenführen:
$ git merge origin/main10- Bob löst alle Merge-Konflikte und pusht dann seine Änderungen in das Repository origin:
$ git push origin feature-branchUnd so geht der Zyklus weiter, wobei sowohl Alice als auch Bob git fetch verwenden, um die von jeweils anderen vorgenommenen Änderungen zu verfolgen und ihre eigenen Änderungen in das Repository origin zu pushen. Durch die Verwendung von git fetch können sie ihr lokales Repository mit den von ihren Teamkollegen vorgenommenen Änderungen auf dem neuesten Stand halten, was hilft, Konflikte zu vermeiden und einen reibungslosen Zusammenarbeitsprozess sicherzustellen.
Git fetch vs git pull
Sowohl git fetch als auch git pull werden verwendet, um Inhalte aus dem Remote-Repository herunterzuladen. Der Befehl git fetch führt Änderungen nicht automatisch in Ihre lokalen Branches zusammen; 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 sie zusammenführen. Der Befehl git pull lädt neue Inhalte herunter und führt sie automatisch in Ihren aktuellen Branch zusammen. Dies kann zu Merge-Konflikten führen, daher wird empfohlen, git pull nur auszuführen, wenn Ihre Arbeitskopie sauber ist.
Practice
What are the correct statements about the `git fetch` command as described in the W3Docs Git Tutorial?