fatal: Der Upstream-Zweig Ihres aktuellen Zweigs stimmt nicht mit dem Namen Ihres aktuellen Zweigs überein

73

Nach dem Auschecken des Remote-Zweigs releases/rel_5.4.1über die Git-GUI wird diese unerwartete Fehlermeldung angezeigt, wenn ich versuche push:

fatal: The upstream branch of your current branch does not match
the name of your current branch.  To push to the upstream branch
on the remote, use

    git push origin HEAD:releases/rel_5.4.1

To push to the branch of the same name on the remote, use

    git push origin rel_5.4.1

Ich weiß nicht, wovon Git spricht. Ich möchte wahrscheinlich pushen, origin releases/rel_5.4.1da dies der Zweig ist, den ich ausgecheckt habe. Daher scheint mir keine Option richtig zu sein.

git statussagt, ich bin auf dem Ast rel_5.4.1.

Hier ist der Zweig, wie er in meinem erscheint .git/config:

[branch "rel_5.4.1"]
    remote = origin
    merge = refs/heads/releases/rel_5.4.1

Was ist los?

Aaron Digulla
quelle
Welche Version von Git verwenden Sie (auch welche Plattform)?
R0MANARMY

Antworten:

78

BEACHTUNG! Obwohl diese Antwort die meisten Stimmen hat und technisch korrekt ist, deutet dies darauf hin, dass das Problem die push.defaultOption ist, wenn das eigentliche Problem normalerweise eine unbeabsichtigte Nichtübereinstimmung zwischen den Namen der lokalen Niederlassung und der vorgelagerten Niederlassung ist. Wenn Sie die Anweisungen in dieser Antwort blind befolgen, werden Ihre Änderungen möglicherweise in den falschen Zweig verschoben! Eine sichere schnelle Lösung finden Sie stattdessen unter https://stackoverflow.com/a/24865780/2279059 .

Zum Nutzen der Leser, die möglicherweise das wahrscheinlich wichtigste Detail übersehen, das in den Kommentaren gut versteckt ist:

Dies liegt an der git config push.defaultEinstellung. Es definiert, was gitbei der Eingabe geschieht git push( siehe Link ).

In der Frage wurde anscheinend die Einstellung auf simple(was die Standardeinstellung für ist git v2) gesetzt, wahrscheinlich mit

git config --global push.default simple

Dies bedeutet, dass es sich gitweigert zu pushen, wenn der lokale und der entfernte Zweig nicht genau übereinstimmen.

Wie @TomSpurling feststellt, ist die obige Einstellung sicherer und wird für den normalen Gebrauch empfohlen, da Sie normalerweise die gleichen Namen für Ihre lokalen und Remote-Niederlassungen wünschen.

In bestimmten Situationen möchten Sie jedoch Folgendes ändern, wenn Ihr lokaler Zweig einen anderen Remote-Zweig mit einem anderen Namen verfolgt:

Verwenden Sie die Option make git pullund git pushsymmetrisch , um zu ermöglichen, pro Git auf den Tracking-Zweig zu pushen

git config push.default upstream

Hinweis: Um dies global für alle Ihre gits festzulegen, verwenden git config --global push.default upstream
Sie. Es ist jedoch wahrscheinlich besser, dies zu belassen git config --global push.default simpleund diese Option nur in den Workloads festzulegen, in denen dies wirklich erforderlich ist.

Tino
quelle
1
Die Kommentare, auf die ich mich beziehe, stammen von @ Tom-Spurling und Jacob-Ford
Tino
Ich glaube das sollte die beste Antwort sein! weil ich den Tracking-Zweig nicht jedes Mal erwähnen möchte, wenn ich drücke.
Basslo
2
Dies ist definitiv als Fußnote relevant, aber bei dieser speziellen Frage schien es hauptsächlich darum zu gehen, versehentlich einen nicht übereinstimmenden Filialnamen zu erhalten ... daher ist dies möglicherweise keine bessere Antwort auf diese Frage , selbst wenn wir alle wirklich sind Es ist wahrscheinlich, dass Sie hier landen, indem Sie nach dieser Fehlermeldung suchen, wenn Sie absichtlich einen anderen Filialnamen haben. Ich nehme an, eine ideale Antwort würde beide Punkte erwähnen! (?)
Tom Spurling
@TomSpurling entsprechend bearbeitet, daher wird empfohlen, dies nur --localjetzt einzustellen .
Tino
Dies war absolut die richtige Antwort für mich. Ich benenne Zweige an der Kasse absichtlich anders, um sie auf meine eigene Weise zu organisieren, und es ist irritierend, git ständig anweisen zu müssen, dass ich den Upstream-Link zu einem anderen Zweignamen für den Zweck erstellt habe. Dies behebt es. VIELEN DANK!
Vorsicht
41

Ihr lokaler Zweig wird aufgerufen rel_5.4.1, der entfernte Zweig jedoch releases/rel_5.4.1(für Git /hat der Zweig keine besondere Bedeutung in Zweignamen, außer um sie für das menschliche Auge leichter lesbar zu machen).

Wenn Sie pushen, ist Git vorsichtig, ob Sie Ihren Zweig verschieben möchten releases/rel_5.4.1(den Namen des Remote-Zweigs) oder ob Sie einen neuen Remote-Zweig erstellen möchten. Es bemerkt jedoch die Ähnlichkeit von Namen.

Sofern Sie keinen neuen Zweig erstellen möchten, lautet der richtige Befehl

git push origin HEAD:releases/rel_5.4.1

Sie könnten auch verwenden

git push origin rel_5.4.1:releases/rel_5.4.1

Um die Warnung ein für alle Mal zu beheben, benennen Sie Ihren lokalen Zweig so um, dass er mit dem Remote-Namen übereinstimmt:

git branch -m releases/rel_5.4.1
Aaron Digulla
quelle
4
Gute Antwort, vor allem die endgültige Schlussfolgerung. IMO-Gründe für die lokale und Remote-Verwendung unterschiedlicher Namen sind selten, es sei denn, Sie arbeiten mit zwei oder mehr verschiedenen Upstreams mit demselben Zweigstellennamen. Aber in dieser Situation fühle ich mich sicherer , wenn ich das Push-Ziel manuell in den Befehl eingebe, als wenn ich eine automagische Lösung verwende
hek2mgl
3
Ich stimme der Schlussfolgerung zu, dass es im Allgemeinen am vernünftigsten und am wenigsten verwirrend ist, die Filialnamen auf beiden Seiten gleich zu halten. Git stimmt ebenfalls zu, weshalb der Standardwert für push.default in config einfach ist , was diese Vernunft erzwingt. Auf der Manpage: " Einfach - Arbeiten Sie in einem zentralisierten Workflow wie ein Upstream mit einer zusätzlichen Sicherheit, um das Drücken zu verweigern, wenn sich der Name des Upstream-Zweigs vom lokalen unterscheidet." Wenn Sie das gleiche grundlegende Verhalten (standardmäßig nur meinen aktuellen Zweig drücken) ohne diese Prüfung wünschen, ändern Sie die Konfiguration für Ihr Repo: git config push.default upstream
Tom Spurling
6
Wenn ich den Zweig mit git checkout -b branchname --track origin/releases/branchnameauschecke, habe ich mir die Mühe gemacht, Git den Namen des Upstream-Zweigs mitzuteilen, und ihn gebeten, ihn zu verfolgen. Kein magisches Matching erforderlich, keine Gefahr, ich habe gesagt, was ich für diesen Zweig will - und trotzdem wirft es diesen Fehler auf. Warum gilt das Tracking für "Ziehen", aber nicht für "Drücken"?
Ed Randall
> Für Git hat das / in Zweignamen keine besondere Bedeutung, außer um sie für das menschliche Auge leichter lesbar zu machen. Nicht wahr, versuchen Sie:git branch test-bname; git branch test-bname/with-slash
Qonf
1
@ DaveB Versuchen Sie es git log --graph --color --oneline --decorate --allstattdessen. An meiner Seite werden die Tags gelb, die lokalen Zweige grün und die entfernten Zweige rot. Remote-Zweige können auch anhand ihres Namens erkannt werden, da ihnen immer der Name der Remote vorangestellt wird, der normalerweise origindanach steht git clone. Daher wird der masterZweig der Fernbedienung lokal als bezeichnet origin/master. (Beachten Sie, dass Sie nichts daran hindert git branch origin/master. Tun Sie solche Dinge einfach nicht!) Außerdem git remote update -pist es Ihr Freund , Ihren lokalen "Cache" mit allen aktuellen Namen von Remote-Zweigen zu synchronisieren .
Tino
41

Dies geschieht, wenn der Name des Upstream-Zweigs und des lokalen Zweigs nicht übereinstimmt, was manchmal vorkommt und normalerweise unerwünscht ist:

> git status
On branch release-1.2.3
Your branch is up to date with 'origin/master'.

Um dies zu lösen, führen Sie Folgendes aus:

git branch --unset-upstream

Sobald Sie git pusherneut ausgeführt werden, werden Sie aufgefordert, die --set-upstreamOption zum korrekten Einstellen des Upstream-Zweigs zu verwenden.

gpap
quelle
6
Dies gilt umso mehr für den Fall git branch -m newbranch, dass Sie auf einen Zweig stoßen , über den ein Upstream-Set festgelegt wurde, und versuchen, Push zu aktivieren. in diesem Fall git branch --unset-upstreamund dann tun git pushund Git wird es Ihnen sagenfatal: The current branch newbranch has no upstream branch. To push the current branch and set the remote as upstream, use git push --set-upstream origin newbranch
Harschware
30

Dieser Fehler kann ein für alle Mal behoben werden mit:

git branch releases/rel_5.4.1 -u origin/releases/rel_5.4.1

Es ändert den Upstream des Zweigs, um (wieder) mit der richtigen Fernbedienung übereinzustimmen.

an Meijer
quelle
11
Standardmäßig git config push.defaultist auf eingestellt simple, was bedeutet, dass es niemals glücklich sein wird, wenn der Remote-Zweig nicht mit dem Namen des lokalen Zweigs übereinstimmt, selbst wenn der Remote-Zweig als Upstream festgelegt ist. Durch die Einstellung git config push.default upstreamwerden diese Fehler unterdrückt.
Jacob Ford
1
@ JacobFords Kommentar ist sehr wichtig zu beachten. Soweit ich weiß, ist dies die einzige Möglichkeit, damit umzugehen, ohne Ihre lokale Niederlassung umbenennen zu müssen.
Prasanthv
Vielen Dank! Das ist genau das, was ich brauchte, obwohl ich wirklich verwirrt bin, warum git remote set-branch origin releases/rel_5.4.1das Problem nicht gelöst wird ...
patapouf_ai
Dies liegt nur daran, dass das Standard-Push-Verhalten (" simple") versucht, extrem "sicher" zu sein. Es wird also nur ein einzelner Zweig gepusht und nur dann, wenn der Name des Upstream-Zweigs identisch ist (weil Sie möglicherweise versehentlich einen anderen Upstream festgelegt haben!) Ich vermute)). Das Ändern auf " upstream", wie ich und @JacobFord erwähnt haben, ist äquivalent (drückt nur den einzelnen aktuellen Zweig) ohne diese zusätzliche "Sicherheit" (Überprüfen der Übereinstimmung der Namen). Sie können alle Optionen im push.defaultAbschnitt des Handbuchs ( man git-config) sehen.
Tom Spurling
1
Das ist der, nach dem ich gesucht habe. In meinem Fall hatte ich den Zweig lokal und remote umbenannt, aber git versuchte immer noch, den alten Tracking-Zweig zu verwenden. Dies hat das behoben und jetzt git pushfunktioniert ein einfaches wieder, auch wenn die Konfiguration auf eingestellt ist simple.
Fbicknel
3

Es scheint, als würde ein lokaler Filialname, der sich von der Fernbedienung unterscheidet, nicht Gitallzu sehr gefallen . Sie müssen Folgendes ausgeben:

git push origin HEAD:releases/rel_5.4.1

explizit bei jedem Stoß

hek2mgl
quelle
Ist nicht releases/Teil des Filialnamens?
Aaron Digulla
Oh ja. Das habe ich übersehen. Es sollte mit beginnen releases/. Scheint, dass die Git-Fehlermeldung irreführend ist. (Jetzt habe ich die Frage)
hek2mgl
Vielen Dank. Der vorherige Befehl hat einen Zweig rel_5.4.1in meinem Remote-Repo erstellt. Ich habe es mit gelöscht git branch -D rel_5.4.1. Ist das korrekt?
Aaron Digulla
:-( error: src refspec releases/rel_5.4.1 does not match any.Was macht es jetzt?
Aaron Digulla
1
Ja, dies ist der erste Schritt, bei dem der Zweig lokal gelöscht wird. Der nächste Schritt wäre, git push --delete origin rel_5.4.1den Zweig aus der Ferne zu löschen.
hek2mgl