TL; DR-Version: origin/master
Früher gab es einen Remote-Tracking-Zweig , der jetzt source
nicht mehr vorhanden ist. Daher verfolgt der lokale Zweig etwas, das nicht vorhanden ist, was bestenfalls verdächtig ist - dies bedeutet, dass eine andere Git-Funktion nichts für Sie tun kann - und Git warnt dich davor. Sie haben sich gut verstanden, ohne dass die Funktion "Upstream-Tracking" wie beabsichtigt funktioniert. Es liegt also an Ihnen, ob Sie etwas ändern.
Weitere Informationen zu Upstream-Einstellungen finden Sie unter Warum muss ich "git push --set-upstream origin <branch>" eingeben?
Diese Warnung ist neu in Git und erscheint zuerst in Git 1.8.5. Die Versionshinweise enthalten nur einen kurzen Punkt dazu:
- "git branch -v -v" (und "git status") unterschieden nicht zwischen einem Zweig, der nicht auf einem anderen Zweig basiert, einem Zweig, der mit seinem Upstream-Zweig synchronisiert ist, und einem Zweig, der mit einem Upstream konfiguriert ist Zweig, der nicht mehr existiert.
Um zu beschreiben, was es bedeutet, müssen Sie zunächst über "Fernbedienungen", "Fernverfolgungszweige" und den Umgang von Git mit "Verfolgung eines Upstreams" Bescheid wissen. ( Remote-Tracking-Zweige sind ein furchtbar fehlerhafter Begriff. Ich habe stattdessen angefangen, Remote-Tracking-Namen zu verwenden, was meiner Meinung nach eine leichte Verbesserung darstellt. Im Folgenden werde ich jedoch "Remote-Tracking-Zweig" verwenden, um die Konsistenz mit der Git-Dokumentation zu gewährleisten. )
Jede "Fernbedienung" ist einfach ein Name, wie origin
oder octopress
in diesem Fall. Ihr Zweck ist es, Dinge wie die vollständige URL der Orte aufzuzeichnen, von denen Sie git fetch
oder git pull
Updates. Wenn Sie 1 Git verwenden, gehen Sie zu dieser Fernbedienung (unter Verwendung der gespeicherten URL) und bringen Sie die entsprechenden Updates. Außerdem werden die Aktualisierungen mithilfe von "Remote-Tracking-Zweigen" aufgezeichnet .git fetch remote,
Ein "Fernverfolgungszweig" (oder Fernverfolgungsname) ist einfach eine Aufzeichnung eines Zweigstellennamens, wie er zuletzt auf einem "Fernverfolgungs" gesehen wurde. Jede Fernbedienung ist selbst ein Git-Repository, hat also Zweige. Die Zweige am entfernten "Ursprung" werden in Ihrem lokalen Repository unter aufgezeichnet remotes/origin/
. Der Text , den Sie sagt zeigte , dass es einen Zweig namens source
auf origin
, und Zweige genannt 2.1
, linklog
und so weiter auf octopress
.
(Ein "normaler" oder "lokaler" Zweig ist natürlich nur ein Zweigname, den Sie in Ihrem eigenen Repository erstellt haben.)
Zuletzt können Sie einen (lokalen) Zweig einrichten, um einen "Fernverfolgungszweig" zu "verfolgen". Sobald der lokale Zweig L
so eingestellt ist, dass er den Remote-Tracking-Zweig verfolgt R
, ruft Git R
seinen "Upstream" auf und teilt Ihnen mit, ob Sie dem Upstream "voraus" und / oder "hinter" sind (in Bezug auf Commits). Es ist normal (sogar empfehlenswert), dass der lokale Zweig und der Remote-Tracking-Zweig denselben Namen verwenden (mit Ausnahme des Remote-Präfix-Teils), wie source
und origin/source
, aber das ist eigentlich nicht erforderlich.
Und in diesem Fall passiert das nicht. Sie haben einen lokalen Zweig source
, der einen Zweig mit Fernverfolgung verfolgt origin/master
.
Sie sollten nicht genau wissen müssen, wie Git einen lokalen Zweig einrichtet, um einen entfernten Zweig zu verfolgen, aber sie sind unten relevant, daher werde ich zeigen, wie dies funktioniert. Wir beginnen mit Ihrem lokalen Filialnamen source
. Es gibt zwei Konfigurationseinträge mit diesem Namen, geschrieben branch.source.remote
und branch.source.merge
. Aus der von Ihnen gezeigten Ausgabe geht hervor, dass beide festgelegt sind, sodass Sie Folgendes sehen würden, wenn Sie die angegebenen Befehle ausführen würden:
$ git config --get branch.source.remote
origin
$ git config --get branch.source.merge
refs/heads/master
Wenn Sie diese zusammenfassen, 2 teilt dies Git mit, dass Ihr Zweig source
Ihren "Remote-Tracking-Zweig" verfolgt origin/master
.
Schauen Sie sich jetzt die Ausgabe von an git branch -a
, in der alle lokalen und Remote-Tracking-Zweignamen in Ihrem Repository angezeigt werden. Die Remote-Tracking-Namen sind unter remotes/
... aufgeführt und es gibt keineremotes/origin/master
. Vermutlich gab es einmal, aber jetzt ist es weg.
Git sagt Ihnen, dass Sie die Tracking-Informationen mit entfernen können --unset-upstream
. Dadurch werden beide branch.source.origin
und branch.source.merge
gelöscht und die Warnung gestoppt.
Es ist jedoch ziemlich wahrscheinlich, dass Sie von Tracking zu Tracking wechseln möchten origin/master
: wahrscheinlich origin/source
, aber vielleicht einer der octopress/
Namen.
Sie können dies mit 3 tun git branch --set-upstream-to
, z.
$ git branch --set-upstream-to=origin/source
(Vorausgesetzt, Sie befinden sich noch in der Zweigstelle "Quelle", und das origin/source
ist der Upstream, den Sie möchten. Ich kann jedoch nicht sagen, welchen Sie gegebenenfalls tatsächlich möchten.)
(Siehe auch Wie macht man einen vorhandenen Git-Zweig zu einem Remote-Zweig? )
Ich denke, Sie sind hierher gekommen, als Sie das erste Mal einen gemacht haben git clone
, hatte das, von dem Sie geklont haben, einen Zweig master
. Sie hatten auch einen Zweig master
, der auf Track eingestellt war origin/master
(dies ist ein normales Standard-Setup für Git). Dies bedeutete, dass Sie hatten branch.master.remote
und branch.master.merge
eingestellt hatten, auf origin
und refs/heads/master
. Aber dann hat Ihre origin
Fernbedienung ihren Namen von master
in geändert source
. Ich glaube, Sie haben auch Ihren lokalen Namen von master
in geändert source
. Dies änderte die Namen Ihrer Einstellungen von branch.master.remote
von branch.source.remote
und von branch.master.merge
nach branch.source.merge
... aber es wurden die alten Werte beibehalten , sodass dies branch.source.merge
jetzt falsch war.
Zu diesem Zeitpunkt brach die "Upstream" -Verbindung ab, aber in Git-Versionen, die älter als 1.8.5 waren, bemerkte Git die fehlerhafte Einstellung nie. Jetzt, wo Sie 1.8.5 haben, wird darauf hingewiesen.
Das deckt die meisten Fragen ab, aber nicht die Frage "Muss ich das Problem beheben?". Es ist wahrscheinlich, dass Sie seit Jahren an der Brüche arbeiten, indem Sie dies tun (z . B. ). Wenn Sie das weiterhin tun, halten sie die Arbeit rund um Problem so, nein, müssen Sie nicht brauchen , um es zu beheben. Wenn Sie möchten, können Sie den Upstream zu entfernen und die Beschwerden zu stoppen, und nicht die lokale Niederlassung haben markiert haben alle an allen stromaufwärts.git pull remote branch
git pull origin source
--unset-upstream
source
Der Punkt eines Upstreams besteht darin, verschiedene Operationen bequemer zu machen. Zum Beispiel, git fetch
gefolgt von git merge
wird „das Richtige tun“ in der Regel , wenn der stromaufwärts richtig eingestellt ist, und git status
nach git fetch
werden Ihnen sagen , ob Ihr Repo des Upstream übereinstimmt, für diesen Zweig.
Wenn Sie die Bequemlichkeit wünschen, setzen Sie den Upstream zurück.
1git pull
verwendet git fetch
, und ab Git 1.8.4 aktualisiert dies (endlich!) Auch die Informationen zum "Remote-Tracking-Zweig". In älteren Versionen von Git wurden die Updates nicht in Remote-Tracking-Zweigen mit git pull
, sondern nur mit aufgezeichnet git fetch
. Da Ihr Git mindestens Version 1.8.5 sein muss, ist dies kein Problem für Sie.
2 Nun, dies plus eine Konfigurationszeile, die ich absichtlich ignoriere und die sich unter befindet remote.origin.fetch
. Git muss den "Merge" -Namen zuordnen, um herauszufinden, dass der vollständige lokale Name für den Remote-Zweig lautet refs/remotes/origin/master
. Die Zuordnung funktioniert fast immer gerade so, aber so ist es vorhersehbar ist , dass master
zu geht origin/master
.
3 Oder mit git config
. Wenn Sie nur den Upstream auf origin/source
den einzigen Teil einstellen möchten, der sich ändern muss branch.source.merge
, und git config branch.source.merge refs/heads/source
dies tun würden. Aber --set-upstream-to
sagt, was Sie tun möchten, anstatt Sie dazu zu bringen, es selbst manuell zu tun, also ist das ein "besserer Weg".