TL; DR: git branch --set-upstream-to origin/solaris
Die Antwort auf die Frage , die Sie gefragt-die ich ein wenig anders formulieren werde als „muss ich eine Upstream - Set“ -ist: Nein, müssen Sie nicht haben einen vorgeschalteten überhaupt einzustellen.
Wenn Sie jedoch keinen Upstream für den aktuellen Zweig haben, ändert Git sein Verhalten bei git pushund auch bei anderen Befehlen.
Die komplette Push-Story hier ist lang und langweilig und geht zurück in die Geschichte vor Git Version 1.5. Um es viel zu verkürzen, git pushwurde schlecht umgesetzt. 1 Ab Git Version 2.0 verfügt Git jetzt über einen Konfigurationsknopf, push.defaultder standardmäßig verwendet wird simple. Bei mehreren Git-Versionen vor und nach 2.0 gab Git jedes Mal, wenn Sie git pushes ausführten, viel Lärm von sich, um Sie davon zu überzeugen, push.defaultnur um git pushden Mund zu halten.
Sie erwähnen nicht, welche Version von Git Sie ausführen oder ob Sie konfiguriert haben push.default, also müssen wir raten. Meine Vermutung ist , dass Sie verwenden Git Version 2-Punkt-etwas, und dass Sie gesetzt , push.defaultum simplees zu bekommen , um den Mund halten. Gerade , welche Version von Git haben Sie, und was ist, wenn alles , was Sie haben push.defaultzu setzen, tut Angelegenheit, wegen der langen und langweiligen Geschichte, aber am Ende ist die Tatsache , dass Sie immer noch ein weitere Beschwerde von Git zeigt an, dass Ihr Git ist konfiguriert, um einen der Fehler aus der Vergangenheit zu vermeiden.
Was ist ein Upstream?
Ein Upstream ist einfach ein anderer Zweigstellenname, normalerweise ein Fernverfolgungszweig, der einem (regulären, lokalen) Zweig zugeordnet ist.
Jeder Zweig hat die Möglichkeit, einen (1) Upstream-Satz zu haben. Das heißt, jeder Zweig hat entweder einen Upstream oder keinen Upstream. Kein Zweig kann mehr als einen Upstream haben.
Der Upstream sollte , muss aber kein gültiger Zweig sein (ob Remote-Tracking-ähnlich oder lokal-ähnlich ). Das heißt, wenn der aktuelle Zweig B stromaufwärts U hat , sollte funktionieren. Wenn es nicht funktioniert - wenn es sich beschwert, dass U nicht existiert - dann verhält sich der Großteil von Git so, als ob der Upstream überhaupt nicht eingestellt ist. Einige Befehle, wie z. B. , zeigen die Upstream-Einstellung an, markieren sie jedoch als "weg".origin/Bmastergit rev-parse U git branch -vv
Was nützt ein Upstream?
Wenn Sie push.defaultauf simpleoder eingestellt sind upstream, git pushfunktioniert die Upstream-Einstellung ohne zusätzliche Argumente.
Das ist es - das ist alles, wofür es tut git push. Aber das ist ziemlich wichtig, da dies git pusheiner der Orte ist, an denen ein einfacher Tippfehler große Kopfschmerzen verursacht.
Wenn Ihr push.defaultist auf nothing, matchingoder currenteine Upstream - Einstellung tut nichts für git push.
(All dies setzt voraus, dass Ihre Git-Version mindestens 2.0 ist.)
Der Upstream wirkt sich aus git fetch
Wenn Sie git fetchohne zusätzliche Argumente arbeiten, ermittelt Git anhand der Upstream-Funktion des aktuellen Zweigs , von welcher Fernbedienung abgerufen werden soll. Wenn der Upstream ein Remote-Tracking-Zweig ist, ruft Git von diesem Remote ab. (Wenn der Upstream nicht festgelegt ist oder ein lokaler Zweig ist, versucht Git, ihn abzurufen origin.)
Der Upstream beeinflusst git mergeund git rebaseauch
Wenn Sie ausführen git mergeoder git rebasekeine zusätzlichen Argumente haben, verwendet Git den Upstream des aktuellen Zweigs. Dies verkürzt die Verwendung dieser beiden Befehle.
Der Upstream wirkt sich aus git pull
Sie sollten ohnehin nie 2 verwenden git pull, aber wenn Sie dies tun, git pullverwenden Sie die Upstream-Einstellung, um herauszufinden, von welcher Fernbedienung abgerufen werden soll und mit welchem Zweig Sie dann zusammenführen oder neu aufbauen möchten. Das heißt, git pullmacht dasselbe wie - git fetchweil es tatsächlich läuft git fetch - und macht dann dasselbe wie git mergeoder git rebase, weil es tatsächlich läuft git merge oder git rebase.
(Normalerweise sollten Sie diese beiden Schritte nur manuell ausführen, zumindest bis Sie Git gut genug kennen. Wenn einer der beiden Schritte fehlschlägt, erkennen Sie schließlich, was schief gelaufen ist, und wissen, was Sie dagegen tun müssen.)
Der Upstream wirkt sich aus git status
Dies kann tatsächlich das wichtigste sein. Sobald Sie einen Upstream-Satz haben, git statuskönnen Sie den Unterschied zwischen Ihrer aktuellen Niederlassung und ihrem Upstream in Bezug auf Commits melden.
Wenn Sie sich wie im Normalfall in einem Zweig befinden, Bdessen Upstream auf eingestellt ist , und Sie ausführen , sehen Sie sofort, ob Sie Commits haben, die Sie pushen können, und / oder Commits, auf die Sie zusammenführen oder neu aufbauen können.origin/Bgit status
Dies liegt daran, git statusläuft:
git rev-list --count @{u}..HEAD: Wie viele Commits haben Sie B, die nicht aktiviert sind ?origin/B
git rev-list --count HEAD..@{u}: Wie viele Commits haben Sie , die nicht aktiviert sind ?origin/BB
Wenn Sie einen Upstream einrichten, erhalten Sie all diese Dinge.
Wie kommt es, dass masterbereits ein Upstream eingestellt ist?
Wenn Sie zum ersten Mal von einer Fernbedienung klonen, verwenden Sie:
$ git clone git://some.host/path/to/repo.git
oder ähnlich, der letzte Schritt, den Git macht, ist im Wesentlichen git checkout master. Diese Kontrollen Ihrer lokalen Niederlassung master-nur Sie nicht haben eine lokale Niederlassung master.
Auf der anderen Seite, Sie tun haben einen Remote-Tracking - Zweig genannt origin/master, weil Sie es nur geklont.
Git vermutet, dass Sie gemeint haben müssen: "Machen Sie mich zu einem neuen Lokal master, das auf dasselbe Commit wie Remote-Tracking verweist origin/master, und stellen Sie, während Sie gerade dabei sind, den Upstream für masterauf ein origin/master."
Dies geschieht für jeden Zweig git checkout, den Sie noch nicht haben. Git erstellt den Zweig und lässt ihn den entsprechenden Remote-Tracking-Zweig "verfolgen" (als Upstream haben).
Aber das funktioniert nicht für neue Filialen, dh Zweige ohne Fernverfolgung Zweig noch .
Wenn Sie einen neuen Zweig erstellen :
$ git checkout -b solaris
es gibt noch keine origin/solaris. Ihr lokaler Zweig solaris kann den Remote-Tracking-Zweig origin/solarisnicht verfolgen, da er nicht vorhanden ist.
Wenn Sie den neuen Zweig zum ersten Mal drücken:
$ git push origin solaris
das erstellt solaris auf originund damit auch origin/solarisin Ihrem eigenen Git-Repository. Aber es ist zu spät: Sie haben bereits einen Einheimischen solaris, der keinen Upstream hat . 3
Sollte Git das jetzt nicht einfach als Upstream automatisch einstellen?
Wahrscheinlich. Siehe "schlecht implementiert" und Fußnote 1. Es ist jetzt schwer zu ändern : Es gibt Millionen von 4 Skripten, die Git verwenden, und einige hängen möglicherweise von ihrem aktuellen Verhalten ab. Das Ändern des Verhaltens erfordert eine neue Hauptversion, nag-ware, um Sie zu zwingen, ein Konfigurationsfeld festzulegen, und so weiter. Kurz gesagt, Git ist ein Opfer seines eigenen Erfolgs: Welche Fehler es heute hat, kann nur behoben werden, wenn die Änderung entweder größtenteils unsichtbar, deutlich besser oder im Laufe der Zeit langsam durchgeführt wird.
Tatsache ist, dass dies heute nicht der Fall ist, es sei denn, Sie verwenden --set-upstreamoder -uwährend der git push. Das sagt Ihnen die Nachricht.
Du musst es nicht so machen. Nun, wie oben erwähnt, müssen Sie das überhaupt nicht tun, aber nehmen wir an, Sie möchten einen Upstream. Sie haben bereits Zweig erstellt solarisauf origin, durch eine frühere Push, und als git branchAusgabe zeigt, haben Sie bereits haben origin/solaris in Ihrem lokalen Repository.
Sie haben es einfach nicht als Upstream für festgelegt solaris.
Verwenden Sie zum Einstellen jetzt und nicht beim ersten Drücken git branch --set-upstream-to. Der --set-upstream-toUnterbefehl verwendet den Namen eines vorhandenen Zweigs, z. B. origin/solaris, und setzt den Upstream des aktuellen Zweigs auf diesen anderen Zweig.
Das ist es - das ist alles, was es tut - aber es hat all die oben genannten Implikationen. Es bedeutet, dass Sie einfach laufen git fetch, sich dann umschauen, dann laufen git mergeoder git rebasenach Bedarf neue Commits vornehmen und ausführen können git push, ohne zusätzliche Aufregung.
1 Um fair zu sein, war damals nicht klar, dass die anfängliche Implementierung fehleranfällig war. Das wurde erst klar, als jeder neue Benutzer jedes Mal die gleichen Fehler machte. Es ist jetzt "weniger arm", was nicht "großartig" heißt.
2 "Nie" ist ein bisschen stark, aber ich finde, dass Git-Neulinge die Dinge viel besser verstehen, wenn ich die Schritte trenne, insbesondere wenn ich ihnen zeigen kann, was git fetchtatsächlich getan wurde, und sie dann sehen können, was git mergeoder git rebasewas als nächstes tun wird.
3 Wenn Sie Ihre erste git push als git push -u origin solarisausführen, dh wenn Sie das -uFlag hinzufügen, wird Git origin/solarisals Upstream für Ihren aktuellen Zweig festgelegt, wenn (und nur wenn) der Push erfolgreich ist. Sie sollten also -ubeim ersten Druck liefern . Tatsächlich können Sie es bei jedem späteren Push bereitstellen, und es wird den Upstream an diesem Punkt einstellen oder ändern . Aber ich denke git branch --set-upstream-toist einfacher, wenn Sie vergessen haben.
4 Gemessen an der Methode von Austin Powers / Dr. Evil, einfach "ein MILLLL-YUN" zu sagen.