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".
Die Antwort von torek ist wahrscheinlich perfekt, aber ich wollte nur, dass in der Aufzeichnung ein anderer Fall erwähnt wird, der sich von dem in der ursprünglichen Frage beschriebenen unterscheidet, aber möglicherweise derselbe Fehler auftritt (da er anderen bei ähnlichen Problemen helfen kann):
Ich habe
git init --bare
auf einem meiner Server ein leeres (neues) Repo erstellt. Dann habe ichgit clone
es zu einem lokalen Arbeitsbereich auf meinem PC gebracht.Nachdem ich eine einzelne Version auf dem lokalen Repo festgeschrieben hatte, bekam ich diesen Fehler nach dem Aufruf
git status
.Nach der Antwort von torek verstehe ich, dass beim ersten Festschreiben des lokalen Arbeitsverzeichnisses repo ein "Master" -Zweig erstellt wurde. Aber auf dem Remote-Repo (auf dem Server) gab es nie etwas, so dass es nicht einmal einen "Master" -Zweig (Fernbedienungen / Ursprung / Master) gab.
Nachdem
git push origin master
das Remote-Repo vom lokalen Repo ausgeführt wurde, hatte es schließlich einen Hauptzweig. Dadurch wurde das Auftreten des Fehlers verhindert.Abschließend kann man einen solchen Fehler für ein neues Remote-Repo ohne Commits erhalten, da es keine Verzweigung hat, einschließlich "Master".
quelle
On branch source Your branch is based on 'origin/master', but the upstream is gone. (use "git branch --unset-upstream" to fixup)
und obwohl es subjektiv ist, wird es eher durch das Klonen eines leeren Repositorys verursacht, das so großartig ist, hier eine alternative Antwort zu haben.Dies könnte Ihr Problem lösen.
Nachdem Sie Änderungen vorgenommen haben, können Sie diese festschreiben und dann
hoffe es funktioniert bei dir.
Vielen Dank
quelle
Für mich
.git/refs/origin/master
war korrupt geworden.Ich habe Folgendes getan, wodurch das Problem für mich behoben wurde.
quelle
Eigentlich hat dir Torek schon gesagt, wie man die Werkzeuge viel besser benutzt, als ich es könnte. In diesem Fall halte ich es jedoch für wichtig, auf etwas Besonderes hinzuweisen, wenn Sie die Richtlinien unter http://octopress.org/docs/deploying/github/ befolgen . Sie haben nämlich mehrere Github-Repositorys in Ihrem Setup. Zuerst die mit dem gesamten Quellcode für Ihre Website, beispielsweise das Verzeichnis
$WEBSITE
, und dann die mit den statisch generierten Dateien$WEBSITE/_deploy
. Das Lustige am Setup ist, dass sich eine.gitignore
Datei im$WEBSITE
Verzeichnis befindet, damit dieses Setup tatsächlich funktioniert.Genug Einführung. In diesem Fall kann der Fehler auch aus dem Repository in stammen
_deploy
.In müssen
.git/config
Sie normalerweise so etwas finden:In Ihrem Fall verfügt der Zweigstellenmaster jedoch nicht über eine Fernbedienung.
Was Sie lösen können durch:
Also, alles ist so, wie Torek es Ihnen gesagt hat, aber es könnte wichtig sein, darauf hinzuweisen, dass dies sehr wohl
_deploy
eher das Verzeichnis als das Stammverzeichnis Ihrer Website betrifft .PS: Es könnte sich lohnen, eine Shell wie
zsh
eingit
Plugin zu verwenden, um in Zukunft nicht mehr von diesem Ding gebissen zu werden. Es wird sofort angezeigt, dass es sich_deploy
um ein anderes Repository handelt.quelle
Ich hatte diese Frage zweimal und sie wurde immer durch die Beschädigung der Git-Cache-Datei in meiner lokalen Zweigstelle verursacht. Ich habe es behoben, indem ich den fehlenden Commit-Hash in diese Datei geschrieben habe. Ich habe den richtigen Commit-Hash vom Server erhalten und den folgenden Befehl lokal ausgeführt:
quelle
Problem: Ihre Filiale basiert auf 'Ursprung / Master', aber der Upstream ist weg.
Lösung: Git Branch - Unset-Upstream
quelle
Löschen Sie Ihren lokalen Zweig mit dem folgenden Befehl
du könntest es auch tun
die im Grunde ein Löschen erzwingen (auch wenn lokal nicht mit Quelle zusammengeführt wird)
quelle