git fetch
Objekte und Refs aus einem anderen Repository herunterladen
Der Befehl 'git fetch' lädt Commits, Dateien und Refs aus einem Remote-Repository in dein lokales Repo. So siehst du, woran andere gearbeitet haben, ohne diese Änderungen in deine lokalen Branches zu mergen. Anders als 'git pull' ist fetch sicher – es ändert nie dein Arbeitsverzeichnis oder deinen aktuellen Branch. Nach dem Fetch kannst du die Änderungen prüfen und entscheiden, ob du sie mergst.
Syntax
git fetch [<options>] [<repository> [<refspec>...]]
git fetch [<options>] <group>
git fetch --multiple [<options>] [(<repository> | <group>)...]
git fetch --all [<options>]Optionen
Die richtige Option wählen
Fetch oder Pull
Den entscheidenden Unterschied zwischen fetch und pull verstehen
| Befehl | Lädt Commits herunter | Aktualisiert lokalen Branch | Jederzeit sicher |
|---|---|---|---|
git fetch | Ja | Nein – nur Remote-Tracking | Ja – ändert nie das Arbeitsverzeichnis |
git pull | Ja | Ja – mergt in den aktuellen | Vorsicht – kann Konflikte verursachen |
git pull --rebase | Ja | Ja – rebast den aktuellen | Vorsicht – schreibt lokale Commits um |
Fetch-Optionen zum Aufräumen
Optionen, um dein Repository ordentlich zu halten
| Befehl | Entfernt veraltete Branches | Holt Tags | Anwendungsfall |
|---|---|---|---|
git fetch | No | Einige (erreichbare) | Normales Update |
git fetch --prune | Ja | Einige (erreichbare) | Gelöschte Branches aufräumen |
git fetch --tags | No | Alle Tags | Release-Tags holen |
git fetch --prune --tags | Ja | Alle Tags | Branches aufräumen + alle Tags holen (rein lokale Tags bleiben) |
Umfang des Fetch
Steuern, was geholt wird
| Befehl | Holt von | Am besten für |
|---|---|---|
git fetch | Standard-Remote (origin) | Häufigster Einsatz |
git fetch origin | Bestimmtes Remote | Wenn du mehrere Remotes hast |
git fetch --all | Alle Remotes | Fork mit upstream synchronisieren |
git fetch origin main | Nur ein Branch | Minimaler Download |
Beispiele
Vom Standard-Remote fetchen
git fetchLädt neue Commits vom Standard-Remote (meist 'origin') herunter, ohne zu mergen.
Von einem bestimmten Remote fetchen
git fetch originAusdrücklich vom Remote 'origin' fetchen.
Alle Remotes fetchen
git fetch --allVon allen konfigurierten Remotes auf einmal fetchen.
Fetchen und veraltete Branches entfernen
git fetch --pruneFetchen und Remote-Tracking-Branches entfernen, die auf dem Remote nicht mehr existieren.
Workflow-Beispiele
git fetch originRemote-Änderungen herunterladen, ohne zu mergen
git log main..origin/mainRemote-Commits sehen, die nicht in deinem lokalen Branch sind
git diff main...origin/mainDie Codeänderungen auf dem Remote prüfen
git merge origin/mainMergen, wenn du so weit bist
git remote add upstream <original-repo-url>Das Original-Repo als upstream hinzufügen (einmalig)
git fetch upstreamDas Neueste aus dem Original-Repo holen
git checkout mainAuf deinen main-Branch wechseln
git merge upstream/mainDie upstream-Änderungen in deinen Fork mergen
git push origin mainDen aktualisierten Fork zu deinem GitHub pushen
git fetch --pruneFetchen und veraltete Remote-Tracking-Branches entfernen
git branch -vvLokale Branches und ihren Tracking-Status anzeigen
git branch -d old-featureLokale Branches löschen, die gelöschten Remotes gefolgt sind
Fehlerbehebung
fatal: 'origin' does not appear to be a git repository
Ursache: Es ist kein Remote namens 'origin' konfiguriert
Prüfe die Remotes mit 'git remote -v'. Füge eins mit 'git remote add origin <url>' hinzu
Gefetcht, aber mein lokaler Branch hat sich nicht aktualisiert
Ursache: Fetch aktualisiert nur Remote-Tracking-Branches, keine lokalen Branches
Das ist so gewollt! Führe 'git merge origin/main' oder 'git pull' aus, um deinen lokalen Branch zu aktualisieren
error: cannot lock ref - unable to update local ref
Ursache: Eine veraltete Remote-Tracking-Ref kollidiert mit einem neuen Branch-Namen (z. B. 'feature' vs. 'feature/login')
Führe 'git remote prune origin' oder 'git fetch --prune' aus, um die veralteten Refs zu entfernen, und fetche dann erneut
Gelöschte Remote-Branches tauchen weiter auf
Ursache: Veraltete Remote-Tracking-Branches müssen entfernt werden
Nutze 'git fetch --prune' oder 'git remote prune origin'
Fetch ist sehr langsam oder lädt zu viel
Ursache: Du holst die ganze Historie, brauchst aber nur die neuesten Commits
Nutze 'git fetch --depth=1' für einen flachen Fetch oder hole nur einen bestimmten Branch
Tipps & Stolperfallen
Best Practices
- ✓Fetche vor Arbeitsbeginn, um zu sehen, ob es Remote-Änderungen gibt, die du kennen solltest
- ✓Nutze regelmäßig --prune, damit dein Repository frei von veralteten Branches bleibt
- ✓Nutze lieber fetch + merge statt pull, wenn du Änderungen vor dem Integrieren prüfen willst
- ✓Richte 'git config fetch.prune true' ein, damit bei jedem Fetch aufgeräumt wird
- ✓Nutze 'git fetch --all' bei der Arbeit mit Forks, um origin und upstream gleichzeitig zu synchronisieren
Häufige Fehler
- ✗Erwarten, dass fetch dein Arbeitsverzeichnis aktualisiert – es aktualisiert nur Remote-Tracking-Branches, nicht deine lokalen Branches.
- ✗Nach dem Fetch das Mergen oder Rebasen vergessen – fetch lädt herunter, integriert aber nichts.
- ✗--prune nicht regelmäßig nutzen, sodass veraltete Remote-Tracking-Branches dein Repo zumüllen.
- ✗fetch mit pull verwechseln – pull = fetch + merge, während fetch nur der Download-Schritt ist.
FAQ
Fetch lädt Commits herunter, ändert aber deine lokalen Branches nicht. Pull = fetch + merge (oder rebase). Fetch ist sicherer, weil du Änderungen vor dem Integrieren prüfen kannst.
Fetch aktualisiert nur Remote-Tracking-Branches (wie origin/main), nicht deine lokalen Branches. Zum Aktualisieren deines lokalen Branches musst du mergen oder rebasen.
Nutze 'git log main..origin/main', um Remote-Commits zu sehen, die nicht in deinem lokalen Branch sind, oder 'git diff main...origin/main', um die Codeänderungen auf dem Remote zu sehen.
Fetch, wenn du Änderungen erst prüfen willst oder an wichtigen Branches arbeitest. Pull für schnelle Updates, wenn du den eingehenden Änderungen vertraust.
Nutze 'git fetch origin branch-name', um nur diesen Branch zu holen. Praktisch bei großen Repos, wenn du nicht alles brauchst.
Es entfernt Remote-Tracking-Branches, die auf dem Remote nicht mehr existieren. Hält dein Repo sauber, wenn Kollegen gemergte Branches löschen.