Ich habe eine lokale Niederlassung zum Testen von Solaris und Sun Studio erstellt. Ich schob dann den Zweig stromaufwärts. Nachdem Sie eine Änderung vorgenommen und versucht haben, die Änderungen zu übernehmen:
$ git commit blake2.cpp -m "Add workaround for missing _mm_set_epi64x"
[solaris 7ad22ff] Add workaround for missing _mm_set_epi64x
1 file changed, 5 insertions(+)
$ git push
fatal: The current branch solaris has no upstream branch.
To push the current branch and set the remote as upstream, use
git push --set-upstream origin solaris
Warum muss ich dafür etwas Besonderes tun?
Gibt es einen vernünftigen Anwendungsfall, in dem jemand etwas erstellen <branch>
, die <branch>
Fernbedienung drücken und dann behaupten würde, dass ein Commit für <branch>
nicht vorgesehen ist <branch>
?
Ich habe diese Frage und Antwort zum Stapelüberlauf befolgt: Schieben Sie einen neuen lokalen Zweig in ein entferntes Git-Repository und verfolgen Sie ihn ebenfalls . Ich vermute, es ist ein weiteres Beispiel für eine unvollständige oder falsch akzeptierte Antwort. Oder es ist eine weitere Instanz von Git, die eine einfache Aufgabe übernimmt und sie schwierig macht.
Hier ist die Ansicht auf einer anderen Maschine. Der Zweig existiert eindeutig, also wurde er erstellt und verschoben:
$ git branch -a
alignas
* master
remotes/origin/HEAD -> origin/master
remotes/origin/alignas
remotes/origin/arm-neon
remotes/origin/det-sig
remotes/origin/master
remotes/origin/solaris
git config --add push.default current
, erstellt git push bei Bedarf automatisch den Zweig im Remote-Repo.Antworten:
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 push
und 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 push
wurde schlecht umgesetzt. 1 Ab Git Version 2.0 verfügt Git jetzt über einen Konfigurationsknopf,push.default
der standardmäßig verwendet wirdsimple
. Bei mehreren Git-Versionen vor und nach 2.0 gab Git jedes Mal, wenn Siegit push
es ausführten, viel Lärm von sich, um Sie davon zu überzeugen,push.default
nur umgit push
den 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.default
umsimple
es zu bekommen , um den Mund halten. Gerade , welche Version von Git haben Sie, und was ist, wenn alles , was Sie habenpush.default
zu 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/B
master
git rev-parse U
git branch -vv
Was nützt ein Upstream?
Wenn Sie
push.default
aufsimple
oder eingestellt sindupstream
,git push
funktioniert 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 diesgit push
einer der Orte ist, an denen ein einfacher Tippfehler große Kopfschmerzen verursacht.Wenn Ihr
push.default
ist aufnothing
,matching
odercurrent
eine Upstream - Einstellung tut nichts fürgit push
.(All dies setzt voraus, dass Ihre Git-Version mindestens 2.0 ist.)
Der Upstream wirkt sich aus
git fetch
Wenn Sie
git fetch
ohne 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 abzurufenorigin
.)Der Upstream beeinflusst
git merge
undgit rebase
auchWenn Sie ausführen
git merge
odergit rebase
keine 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 pull
verwenden 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 pull
macht dasselbe wie -git fetch
weil es tatsächlich läuftgit fetch
- und macht dann dasselbe wiegit merge
odergit rebase
, weil es tatsächlich läuftgit merge
odergit 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 status
kö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,
B
dessen 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/B
git status
Dies liegt daran,
git status
läuft:git rev-list --count @{u}..HEAD
: Wie viele Commits haben SieB
, die nicht aktiviert sind ?origin/B
git rev-list --count HEAD..@{u}
: Wie viele Commits haben Sie , die nicht aktiviert sind ?origin/B
B
Wenn Sie einen Upstream einrichten, erhalten Sie all diese Dinge.
Wie kommt es, dass
master
bereits ein Upstream eingestellt ist?Wenn Sie zum ersten Mal von einer Fernbedienung klonen, verwenden Sie:
oder ähnlich, der letzte Schritt, den Git macht, ist im Wesentlichen
git checkout master
. Diese Kontrollen Ihrer lokalen Niederlassungmaster
-nur Sie nicht haben eine lokale Niederlassungmaster
.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 verweistorigin/master
, und stellen Sie, während Sie gerade dabei sind, den Upstream fürmaster
auf einorigin/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 :
es gibt noch keine
origin/solaris
. Ihr lokaler Zweigsolaris
kann den Remote-Tracking-Zweigorigin/solaris
nicht verfolgen, da er nicht vorhanden ist.Wenn Sie den neuen Zweig zum ersten Mal drücken:
das erstellt
solaris
auforigin
und damit auchorigin/solaris
in Ihrem eigenen Git-Repository. Aber es ist zu spät: Sie haben bereits einen Einheimischensolaris
, der keinen Upstream hat . 3Sollte 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-upstream
oder-u
während dergit 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
solaris
auforigin
, durch eine frühere Push, und alsgit branch
Ausgabe zeigt, haben Sie bereits habenorigin/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-to
Unterbefehl 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 laufengit merge
odergit rebase
nach Bedarf neue Commits vornehmen und ausführen könnengit 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 fetch
tatsächlich getan wurde, und sie dann sehen können, wasgit merge
odergit rebase
was als nächstes tun wird.3 Wenn Sie Ihre erste
git push
alsgit push -u origin solaris
ausführen, dh wenn Sie das-u
Flag hinzufügen, wird Gitorigin/solaris
als Upstream für Ihren aktuellen Zweig festgelegt, wenn (und nur wenn) der Push erfolgreich ist. Sie sollten also-u
beim 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 denkegit branch --set-upstream-to
ist einfacher, wenn Sie vergessen haben.4 Gemessen an der Methode von Austin Powers / Dr. Evil, einfach "ein MILLLL-YUN" zu sagen.
quelle
--set-upstream /dev/null
. Warum wird die Last auf den allgemeinen Fall gelegt? Ich verstehe einige dieser technischen und Usability-Entscheidungen wirklich nicht.git push -u
, aber es scheint wirklich , wiegit push -u
sollte der Standard sein, oder zumindest der Standard , wenn es keine stromaufwärts noch , und es sollte eine sein ,git push --no-set-upstream
wenn gibt es derzeit nicht ein Upstream und Sie behalten möchten es so (aus irgendeinem unverständlichen Grund :-)).git config --add push.default current
, erstellt git push bei Bedarf automatisch den Zweig im Remote-Repo.Der Unterschied zwischen
git push origin <branch>
und
git push --set-upstream origin <branch>
besteht darin, dass beide problemlos in das Remote-Repository übertragen werden. Wenn Sie jedoch ziehen, bemerken Sie den Unterschied.
Wenn Sie dies tun: Wenn Sie
git push origin <branch>
ziehen, müssen Sie Folgendes tun:
git pull origin <branch>
Aber wenn Sie dies tun
git push --set-upstream origin <branch>
, müssen Sie beim Ziehen nur Folgendes tun:
git pull
Wenn Sie also das hinzufügen
--set-upstream
, müssen Sie nicht jedes Mal angeben, welchen Zweig Sie abrufen möchtengit pull
.quelle
Ein grundsätzlich voller Befehl ist wie
git push <remote> <local_ref>:<remote_ref>
. Wenn Sie nur ausführengit push
, weiß Git nicht genau, was zu tun ist, es sei denn, Sie haben eine Konfiguration vorgenommen, die Git hilft, eine Entscheidung zu treffen. In einem Git-Repo können wir mehrere Fernbedienungen einrichten. Wir können auch eine lokale Referenz an eine beliebige Remote-Referenz senden. Der vollständige Befehl ist der einfachste Weg, einen Push auszuführen. Wenn Sie weniger Wörter eingeben möchten, müssen Sie zuerst konfigurieren, z. B. --set-upstream.quelle