Einführung
Ein Remote-Tracking-Branch ist eine lokale Ref, die einen Branch auf einem Remote spiegelt. Sie leben unter refs/remotes/<remote>/ und werden von git fetch aktualisiert (und Operationen, die fetch implizieren, wie git pull und git clone). Sie committen nicht direkt auf sie.
Woher sie kommen
Die Standard-Refspec für origin lautet:
+refs/heads/*:refs/remotes/origin/*
Wenn der Server also refs/heads/main hat, bekommt Ihr Klon refs/remotes/origin/main. Das führende + bedeutet "Force Update".
Auflisten
git branch -r
git branch -a # lokal + Remote-Tracking
git branch -vv # zeigt Upstream der lokalen
Einen lokalen Branch verknüpfen
git switch feature/login # erstellt automatisch lokal aus origin/feature/login
git switch -c mine origin/feature/login # explizit
git branch -u origin/main # Upstream des aktuellen Branches setzen
git branch --unset-upstream
Die Upstream-Verknüpfung steuert die voraus/zurück-Anzeige von git status und die Standardziele für git push und git pull.
Aufräumen
Remote-Tracking-Branches verschwinden nicht, wenn der Remote-Branch gelöscht wird. Räumen Sie sie auf:
git fetch --prune
git remote prune origin
git config --global fetch.prune true
Das spezielle Remote-HEAD
Jeder Remote hat ein symbolisches HEAD, das seinen Standard-Branch angibt:
git symbolic-ref refs/remotes/origin/HEAD
git remote set-head origin --auto # Server abfragen
Das ist es, was origin allein zu origin/main auflöst (oder welcher Standard auch immer).
Diff gegen einen Remote-Tracking-Branch
git fetch
git log HEAD..origin/main --oneline # was Upstream ist
git log origin/main..HEAD --oneline # was nur lokal ist
git diff @{u} # gegen Upstream
@{u} (oder @{upstream}) ist die Kurzform für das konfigurierte Upstream des aktuellen Branches.
Push-Verhalten
Die Voreinstellung push.default = simple pusht den aktuellen Branch zu seinem Upstream gleichen Namens. Wenn Sie einen Branch ohne Upstream pushen und push.autoSetupRemote = true haben (Git 2.37+), wird das Upstream automatisch erstellt.
Refspec-Details
Die Fetch-Refspec für einen Remote kann angepasst werden, um zusätzliche Refs zu fetchen oder anders abzubilden. Zum Beispiel um zusätzlich GitHub-PR-Refs und GitLab-MR-Refs zu pullen:
git config --add remote.origin.fetch '+refs/pull/*/head:refs/remotes/origin/pr/*'
git config --add remote.origin.fetch '+refs/merge-requests/*/head:refs/remotes/origin/mr/*'
Das führende + bedeutet "Force Update", nötig weil PR-Refs sich bewegen können (Rebases auf dem PR-Branch). Nach dem Fetchen erscheinen die PRs des Servers als lokale origin/pr/*-Refs, bereit für git switch -c review/<n> origin/pr/<n>.
Häufige Fehler
git checkout origin/main versuchen und editieren wollen; es bringt Sie in Detached HEAD, weil origin/main readonly ist. Erstellen Sie stattdessen einen Tracking-Branch. Vergessen, git fetch auszuführen, und sich von veralteten voraus/zurück-Zählungen täuschen lassen. Remote-Tracking-Branches behandeln, als würde das Pushen darauf den Server aktualisieren; sie sind lokale Spiegel. Verwenden Sie git push origin main. Schließlich: origin/main mit git branch -dr löschen und annehmen, der Server-Branch sei weg; ist er nicht. Verwenden Sie git push origin --delete main, und nur wenn Sie es meinen.