Fetchen, Pullen & Pushen
Pull
Drei Modi, aus dem Dropdown gewählt: Standard, nur Fast-Forward oder Rebase. Lokale Änderungen werden rund um den Pull automatisch gestasht und wiederhergestellt, ein schmutziger Working Tree blockiert dich also nicht.
Ein Branch, der nichts verfolgt
git pull ist ein Fetch gefolgt von einem Merge, und der Merge muss wissen,
wohin er mergen soll — in den Upstream des Branches. Ein lokal angelegter oder
ohne Tracking ausgecheckter Branch hat keinen. Der Fetch gelingt trotzdem, eine
lange Liste aktualisierter origin/*-Refs zieht vorbei, und dann bricht git ab
mit "There is no tracking information for the current branch". Es wurde nichts
gepullt und nichts kaputtgemacht: der zweiten Hälfte fehlte schlicht das Ziel.
Gitcito liest diesen Fehler und bietet die Reparatur als Button an — welche, hängt davon ab, ob der Remote den Branch schon führt:
| Er liegt auf dem Remote | Verbinden & pullen — setzt den Upstream auf <remote>/<branch> und führt dann den gewünschten Pull aus. Mit ⌘Z widerrufbar, was das Tracking wieder löst. |
| Er ist noch nicht dort | Branch pushen — ein gewöhnlicher Push, der den Upstream nebenbei setzt. |
Angeboten wird origin, sofern vorhanden, sonst der erste Remote der Liste.
Welcher Fall vorliegt, wird aus den Remote-Tracking-Refs gelesen, nicht über das
Netz — die Antwort spiegelt also den gerade gelaufenen Fetch.
Push
Force-Pushes verwenden immer --force-with-lease — die sichere Variante, die
sich weigert, wenn sich der Remote bewegt hat, seit du zuletzt hingeschaut hast.
Ein geschützter Branch mit Force gepusht verlangt eine Bestätigung (die Liste
steckt im Zahnrad der Repository-Einstellungen).

Keine Remotes
Push, Pull und Fetch brauchen ein Ziel. Ein Repository ohne eines — ein
frisches git init, ein Clone dessen Origin entfernt wurde — ließ diese
Knöpfe bisher nichts tun, oder einen leeren Fetch als Erfolg zählen. Sie
öffnen jetzt Remote hinzufügen, mit einem Hinweis, damit du eine URL
einfügen oder das Repo auf dem Host anlegen kannst. Das Hinzufügen beendet
die Aktion, mit der du angefangen hast: ein Push veröffentlicht den aktuellen
Branch, ein Pull holt und pullt, ein Fetch holt nur.
Der automatische Fetch im Hintergrund bleibt still, wenn es nichts zu holen gibt. Er öffnet keinen Dialog nach der Uhr.
Mehr als ein Remote
Der Push-Button zielt auf den Upstream des Branches. Der Pfeil daneben bietet außerdem an, sobald ein Repository mehr als einen Remote hat:
| Zu einem Remote pushen | Wähle einen einzelnen Remote — einen Fork, einen Mirror, ein Deploy-Ziel |
| Zu allen N Remotes pushen | Ein Push pro Remote, der Reihe nach |
| Alle Tags pushen zu | git push <remote> --tags, alle lokalen Tags auf einmal |
Dieselben zwei Aktionen sitzen in der Seitenleiste auch in der Zeile jedes einzelnen Remotes — und dort bist du meistens, wenn die Frage aufkommt.
Eine Ablehnung bricht den Rest nicht ab. Einen Fork und dessen Upstream zu pushen ist genau der Fall, in dem die eine Seite sich weigert und die andere trotzdem durchgehen soll, deshalb meldet jeder Remote für sich: Erfolge werden in einem Toast namentlich genannt, und jeder Fehlschlag bekommt seinen eigenen mit der Begründung von git.
Nur der erste Remote in der Liste setzt den Upstream des Branches. Ein Branch hat einen Upstream, und der zuletzt gepushte Remote ist nicht automatisch der, den er tracken soll.
Beide Wege durchlaufen dieselben Prüfungen wie ein gewöhnlicher Push — die Bestätigung für geschützte Branches und den Secret-Schutz. An zwei Remotes zu veröffentlichen ist die doppelte Exposition, nicht die halbe Vorsicht.
Branches, auf denen du nicht stehst
git pull bewegt immer nur HEAD — deshalb verlangen die meisten Clients erst
einen Checkout, bevor ein Branch nachziehen kann. Gitcito nicht: Rechtsklick auf
einen lokalen Branch — in der Seitenleiste oder auf dem Badge im
Graphen — bringt <Branch> pullen und <Branch> pushen, beide
auf diesen Branch bezogen.
<Branch> pullen |
Zieht die lokale Ref per Fast-Forward auf ihr Upstream nach, ohne Checkout. Das Arbeitsverzeichnis bleibt unberührt. Mit ⌘Z rückgängig — das Undo setzt den Branch zurück. |
<Branch> pushen |
Ein gewöhnlicher Push dieses Branches, mit denselben Protected-Branch- und Secret-Wächtern wie der Button in der Toolbar. |
Pullen ist ausgegraut, wenn der Branch nichts trackt — es gibt nichts zu holen. Auf dem Branch, auf dem du stehst, fallen beide auf den normalen Pull zurück, der auch das Arbeitsverzeichnis aktualisiert.
Die Grenze, die zählt: ein Branch, der von seinem Upstream abgewichen ist, wird abgelehnt — mit einer Meldung, die das sagt. Eine Divergenz aufzulösen heißt Merge oder Rebase, und beide brauchen ein Arbeitsverzeichnis; dieser Fall kostet dich also weiterhin einen Checkout. Ein Force-Push für einen Branch, auf dem du nicht stehst, wird angeboten, wenn der Remote den Push ablehnt — der Weg "erst pullen, dann erneut" aus demselben Grund nicht.
Fetch
Fetch hat einen eigenen Button in der Toolbar, direkt neben Pull. Er holt von
jedem Remote und prunt, sodass deine origin/*-Refs und alle Ahead/Behind-Zähler
aktuell sind — und rührt weder deinen Branch noch deinen Arbeitsbaum an. Das ist
der Button, wenn du sehen willst, was die anderen getan haben, ohne deine
eigene Arbeit zu bewegen.
Dazu gibt es einen Auto-Fetch im Hintergrund in einem von dir gesetzten
Intervall (Einstellungen → Allgemein). Fahre über den Fetch-Button, und das Alter
blendet sich darunter ein — vor 4 Min. — bernsteinfarben, sobald ein Fetch
älter als fünfzehn Minuten ist. Es belegt nie Platz in der Toolbar, denn es
beantwortet eine Frage, die man nur beim Griff zum Button stellt. Es stammt aus
FETCH_HEAD, ein git fetch im Terminal zählt also genauso.
Ein Fetch, der umgeschriebene Historie findet, sagt das: ein Toast nennt den Branch, und dessen Zeile bekommt einen Marker, der was sich seither geändert hat genau bei dem Commit öffnet, auf den er früher zeigte.
Viele Repositorys auf einmal
- Ein Gruppen-Tab kann seinen ganzen Teilbaum fetchen / pullen.
- Mission Control macht es über den gesamten Workspace und kann nur die Repositorys pullen, die tatsächlich hinterherhinken.
Remotes
Einzelne Remotes hinzufügen, bearbeiten, entfernen und fetchen — aus der Seitenleiste. Branch-Zeilen tragen Badges für die Präsenz pro Remote, du siehst also auf einen Blick, welche Remotes eine Kopie eines Branches haben.
Fetch, Pull oder Push ohne Remotes öffnet denselben Dialog „Remote hinzufügen“, statt ins Leere zu laufen. Siehe Fetchen, Pullen und Pushen.
Siehe auch: Mission Control · Hosting & Pull Requests