致命:当前分支的上游分支与当前分支的名称不匹配


74

releases/rel_5.4.1使用Git GUI对远程分支进行签出后,尝试执行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

我不知道Git在说什么。我可能要推送到,origin releases/rel_5.4.1因为那是我签出的分支。所以这两种选择对我来说似乎都不正确。

git status说我在树枝上rel_5.4.1

这是出现在我的分支.git/config

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

到底是怎么回事?


您使用的是哪个版本的git(也是哪个平台)?
R0MANARMY

Answers:


80

注意!尽管此答案获得最多投票,并且在技术上是正确的,但它表明问题是解决push.default方案,而通常情况下,真正的问题是本地分支机构和上游分支机构的名称之间意外的不匹配。盲目地遵循此答案中的说明可能会导致您的更改被推到错误的分支!有关安全的快速修复,请参阅https://stackoverflow.com/a/24865780/2279059

为了使那些可能错过最重要细节的读者受益,这些细节隐藏在注释中:

这是由于git config push.default设置。 它定义了git您输入时的操作git push请参阅链接)。

在问题中,显然设置已设置为simple(这是的默认设置git v2),可能与

git config --global push.default simple

这意味着,git当本地和远程分支不完全匹配时,拒绝推送。

正如@TomSpurling所指出的,上述设置比较安全,建议您正常使用,因为通常您希望本地和远程分支使用相同的名称。

但是,在某些情况下,当您的本地分支正在使用不同的名称跟踪某个不同的远程分支时,则需要更改该名称:

为了允许按per-git推送到跟踪分支,从而使git pullgit push对称,使用

git config push.default upstream

注意:要为所有gits全局设置此选项,请使用。git config --global push.default upstream
但是最好将其保留为git config --global push.default simple仅在真正需要它的那些工作负载中设置此选项。


1
我引用的评论来自@ Tom-Spurling和Jacob-Ford
Tino

1
相信应该是最好的答案!因为我不想每次推送时都提及跟踪分支。
basslo

3
作为注脚,这绝对是相关的,但是这个特定的问题似乎主要是关于错误地以不匹配的分支名称结尾...因此,即使我们都是真正的人,这也不是一个更好的答案故意在拥有其他分支名称时搜索该错误消息,最终可能会到这里。我想一个理想的答案可以同时提及这两点!(?)
Tom Spurling

@TomSpurling进行了相应的编辑,因此建议仅--local现在进行设置。
蒂诺

2
对我来说,这绝对是正确的答案。我故意在结帐时以不同的方式命名分支,以自己的方式组织它们,并且不得不不断地指示git我创建了指向不同分支名称的上游链接,这很烦人。这样就解决了。谢谢!
警告bug

47

如果上游分支和本地分支的名称不匹配,则会发生这种情况,有时会发生这种情况,并且通常是不希望的:

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

要解决此问题,请运行:

git branch --unset-upstream

然后,一旦您运行 git push后,将要求您使用该--set-upstream选项正确设置上游分支。


6
如果您通过命名了git branch -m newbranch上游设置的分支重命名分支并尝试git push时遇到了这种情况 ,则更是如此。在这种情况下 git branch --unset-upstream,那么dogit push和git会告诉您fatal: 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

42

您的本地分支称为,rel_5.4.1但远程分支称为releases/rel_5.4.1(就Git而言,/分支名称在分支名称中没有特殊含义,只是使它们更易于人眼阅读)。

推送时,Git会警惕是否要将分支推送到 releases/rel_5.4.1(远程分支的名称)还是要创建新的远程分支。它确实注意到了名称的相似性。

除非要创建一个新分支,否则正确的命令是

git push origin HEAD:releases/rel_5.4.1

您也可以使用

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

要彻底解决警告,请重命名您的本地分支以匹配远程名称:

git branch -m releases/rel_5.4.1

4
好的答案,尤其是最后的结论。除非您正在使用具有相同分支名称的两个或多个不同的上游,否则IMO在本地和远程使用不同名称的原因很少见。但是在这种情况下,在命令上手动键入push target会使我比使用某些自动解决方案更安全
hek2mgl 2014年

3
我同意这样的结论,即分支名称在双方之间保持一致通常是最明智且最不容易混淆的。Git也同意,这就是为什么config中push.default的默认值是simple,这加强了这种理智。在手册页中:“简单-在集中式工作流中,如果上游分支的名称与本地分支不同,则像上游一样工作,并增加了安全性,可以拒绝推送。” 如果您想要相同的基本行为(默认情况下仅推送我当前的分支)而不进行检查,请更改您的存储库的配置: git config push.default upstream
Tom Spurling

6
如果我使用来检出分支git checkout -b branchname --track origin/releases/branchname,则麻烦告诉Git上游分支的名称,并要求它跟踪它。不需要魔术匹配,没有危险,我说过我想要这个分支-但仍然会引发此错误。为什么跟踪适用于“拉”而不适用“推”?
Ed Randall

>就Git而言,/在分支名称中没有特殊含义,只是使它们更易于人眼阅读。 不正确,请尝试:git branch test-bname; git branch test-bname/with-slash
qonf

1
@DaveB试试吧git log --graph --color --oneline --decorate --all。在我这边,标签变成黄色,本地分支变成绿色,远程分支变成红色。也可以在远程分支的名称上检测到远程分支,因为它们总是以远程名称作为前缀,通常origingit clone。之后。因此,远程master分支在本地称为origin/master。(请注意,没有什么可以阻止您的操作git branch origin/master。只是不要做这样的事情!)而且,将您的本地“缓存”与所有当前的远程分支名称同步git remote update -p也是您的朋友。
蒂诺

32

可以使用以下方法彻底解决此错误:

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

它更改分支的上游,以匹配正确的远程(再次)。


11
默认情况下,git config push.default设置为simple,这意味着即使远程分支设置为上游,如果远程分支与本地分支的名称不匹配也永远不会高兴。设置git config push.default upstream将消除这些错误。
雅各布·福特

1
@JacobFord的评论非常重要。据我所知,这是无需重命名本地分支即可解决此问题的唯一方法。
prasanthv

谢谢!那正是我需要的,尽管我很困惑为什么git remote set-branch origin releases/rel_5.4.1不能解决问题……
patapouf_ai 16-10-21

这仅仅是因为默认的推送行为(“ simple”)试图变得非常“安全”-因此它仅推送单个分支,并且仅当上游分支名称相同时才这样做(因为您可能偶然设置了不同的上游!(我猜))。upstream正如我和@JacobFord所提到的,将其更改为“ ”是等效的(仅推送单个当前分支),而没有额外的“安全性”(检查名称是否匹配)。您可以push.default在手册(man git-config)部分中看到所有选项。
汤姆·斯普林

1
那就是我要找的那个。就我而言,我已将分支重命名为本地和远程,但是git仍在尝试使用旧的跟踪分支。这样就解决git push了,即使将config设置为,现在也可以再次简单地工作simple
fbicknel

3

似乎拥有与远程Git站点不同的本地分支名称并不是什么都喜欢。您将需要发出:

git push origin HEAD:releases/rel_5.4.1

明确地在每次推动


不是releases/分支名称的一部分吗?
亚伦·迪古拉

哦是的 我忽略了这一点。它应该以开头releases/。似乎Git错误消息具有误导性。(现在我有问题了)
hek2mgl 2014年

谢谢。上一条命令创建了一个分支rel_5.4.1在我的远程仓库中。我用删除了它git branch -D rel_5.4.1。那是对的吗?
亚伦·迪古拉

:-(error: src refspec releases/rel_5.4.1 does not match any.现在在做什么?
Aaron Digulla 2014年

1
是的,这是它在本地删除分支的第一步。下一步将是git push --delete origin rel_5.4.1这将远程删除分支..
hek2mgl
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.