Warum git branch --unset-upstream aufrufen, um das Problem zu beheben?


160

Ich bin eher ein Anfänger, wenn es um fortgeschrittene Operationen in Git geht. Ich pflege mein Blog mit dem Blogging-Framework Octopress . Obwohl Octopress seit 2011 nicht mehr entwickelt wird, erfüllt es meinen Zweck gut und ich habe bisher nicht daran gedacht, etwas zu ändern.

Zu Ihrer Information, mein Blog wird auf Github-Seiten gehostet.

Während der Arbeit an einem neuen Beitrag wurde heute git statusdie folgende Meldung angezeigt:

On branch source
Your branch is based on 'origin/master', but the upstream is gone.
  (use "git branch --unset-upstream" to fixup)

Die gleiche Meldung für alle nachfolgenden Befehle wiederholt wie git add ., git commit -m 'message'und git push origin source.

  • Was bedeutet die Nachricht?
  • Ist etwas kaputt?
  • Wenn ja, was?
  • Muss ich das Problem beheben?

Wenn möglich, verweisen Sie mich bitte auf einen PDF- / Webartikel, in dem ich dies nachlesen und für die Zukunft verstehen kann.

Mehr Details:

bash-3.2$ git branch -a
* source
  remotes/octopress/2.1
  remotes/octopress/HEAD -> octopress/master
  remotes/octopress/gh-pages
  remotes/octopress/linklog
  remotes/octopress/master
  remotes/octopress/refactor_with_tests
  remotes/octopress/rubygemcli
  remotes/octopress/site
  remotes/origin/source

Bitte lassen Sie mich wissen, wenn weitere Informationen benötigt werden. Vielen Dank.

Antworten:


196

TL; DR-Version: origin/masterFrüher gab es einen Remote-Tracking-Zweig , der jetzt sourcenicht 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 originoder octopressin diesem Fall. Ihr Zweck ist es, Dinge wie die vollständige URL der Orte aufzuzeichnen, von denen Sie git fetchoder git pullUpdates. 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 sourceauf origin, und Zweige genannt 2.1, linklogund 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 Lso eingestellt ist, dass er den Remote-Tracking-Zweig verfolgt R, ruft Git Rseinen "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 sourceund 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.remoteund 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 sourceIhren "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.originund branch.source.mergegelö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/sourceist 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.remoteund branch.master.mergeeingestellt hatten, auf originund refs/heads/master. Aber dann hat Ihre originFernbedienung ihren Namen von masterin geändert source. Ich glaube, Sie haben auch Ihren lokalen Namen von masterin geändert source. Dies änderte die Namen Ihrer Einstellungen von branch.master.remotevon branch.source.remoteund von branch.master.mergenach branch.source.merge... aber es wurden die alten Werte beibehalten , sodass dies branch.source.mergejetzt 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 branchgit pull origin source--unset-upstreamsource

Der Punkt eines Upstreams besteht darin, verschiedene Operationen bequemer zu machen. Zum Beispiel, git fetchgefolgt von git mergewird „das Richtige tun“ in der Regel , wenn der stromaufwärts richtig eingestellt ist, und git statusnach git fetchwerden 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 masterzu geht origin/master.

3 Oder mit git config. Wenn Sie nur den Upstream auf origin/sourceden 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-tosagt, was Sie tun möchten, anstatt Sie dazu zu bringen, es selbst manuell zu tun, also ist das ein "besserer Weg".


3
+1 für "Wenn Sie möchten, können Sie --unset-upstream verwenden, um den lokalen Zweig so zu markieren , dass er überhaupt keinen Upstream hat."
BeatriceThalo

157

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 --bareauf einem meiner Server ein leeres (neues) Repo erstellt. Dann habe ich git clonees 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 masterdas 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".


6
Dies ist derzeit das Ergebnis Nr. 1 für diese Fehlermeldung, 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.
Bella

2
Ich denke, deshalb ist es immer eine gute Idee, Ihr neues Repository mit der Datei README.md zu initialisieren, auch wenn es eine leere Datei ist
Ahmed Hussein

8

Dies könnte Ihr Problem lösen.

Nachdem Sie Änderungen vorgenommen haben, können Sie diese festschreiben und dann

git remote add origin https://(address of your repo) it can be https or ssh
then
git push -u origin master

hoffe es funktioniert bei dir.

Vielen Dank


1
Dies würde in der Tat helfen - der Grund ist in meiner Antwort aufgeführt (kurz gesagt - dies erzeugt den fehlenden Hauptzweig im Remote-Repo).
ElazarR

7

Für mich .git/refs/origin/masterwar korrupt geworden.

Ich habe Folgendes getan, wodurch das Problem für mich behoben wurde.

rm .git/refs/remotes/origin/master
git fetch
git branch --set-upstream-to=origin/master

0

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 .gitignoreDatei im $WEBSITEVerzeichnis befindet, damit dieses Setup tatsächlich funktioniert.

Genug Einführung. In diesem Fall kann der Fehler auch aus dem Repository in stammen _deploy.

cd _deploy

git branch -a
* master
remotes/origin/master
remotes/origin/source

In müssen .git/configSie normalerweise so etwas finden:

[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
[remote "origin"]
    url = git@github.com:yourname/yourname.github.io.git
    fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
    remote = origin
    merge = refs/heads/master

In Ihrem Fall verfügt der Zweigstellenmaster jedoch nicht über eine Fernbedienung.

[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
[remote "origin"]
    url = git@github.com:yourname/yourname.github.io.git
    fetch = +refs/heads/*:refs/remotes/origin/*

Was Sie lösen können durch:

cd _deploy
git branch --set-upstream-to=origin/master

Also, alles ist so, wie Torek es Ihnen gesagt hat, aber es könnte wichtig sein, darauf hinzuweisen, dass dies sehr wohl _deployeher das Verzeichnis als das Stammverzeichnis Ihrer Website betrifft .

PS: Es könnte sich lohnen, eine Shell wie zshein gitPlugin zu verwenden, um in Zukunft nicht mehr von diesem Ding gebissen zu werden. Es wird sofort angezeigt, dass es sich _deployum ein anderes Repository handelt.


0

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:

cat .git/refs/remotes/origin/feature/mybranch \
echo 1edf9668426de67ab764af138a98342787dc87fe \
>> .git/refs/remotes/origin/feature/mybranch

0

Problem: Ihre Filiale basiert auf 'Ursprung / Master', aber der Upstream ist weg.

Lösung: Git Branch - Unset-Upstream


3
Willkommen bei stackoverflow. Die Frage ist nicht, wie der Fehler behoben werden kann, er möchte wissen, warum dieser Fehler auftritt und ob er etwas dagegen tun sollte. Bitte sprechen Sie dies in Ihrer Antwort an.
Cronoik

0

Löschen Sie Ihren lokalen Zweig mit dem folgenden Befehl

git branch -d branch_name

du könntest es auch tun

git branch -D branch_name 

die im Grunde ein Löschen erzwingen (auch wenn lokal nicht mit Quelle zusammengeführt wird)

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.