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

Git 致命:当前分支的上游分支与当前分支的名称不匹配,git,push,remote-branch,Git,Push,Remote Branch,在使用Git GUI签出远程分支版本/rel_5.4.1后,我在尝试推送时看到此意外错误消息: 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

在使用Git GUI签出远程分支
版本/rel_5.4.1
后,我在尝试
推送
时看到此意外错误消息:

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在说什么。我可能想推到
originreleases/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太喜欢的。您需要发布:

git push origin HEAD:releases/rel_5.4.1

明确地说,在每次推送时,您的本地分支称为
rel_5.4.1
,但远程分支称为
releases/rel_5.4.1
(就Git而言,
/
在分支名称中没有特殊意义,只是为了便于人眼阅读)

推送时,Git会注意是否要将分支推送到
版本/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

此错误可通过以下方式一次性修复:

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

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

注意!虽然这个答案获得了最多的选票,并且在技术上是正确的,但它表明问题在于
push.default
选项,而实际问题通常是本地分支和上游分支名称之间的意外不匹配。盲目遵循此答案中的说明可能会导致您的更改被推到错误的分支!有关安全的快速修复方法,请参见。

为了读者的利益,他们可能会错过评论中隐藏的最重要的细节:

这是由于设置。它定义了当您输入
git push
()时,
git
的功能

在这个问题中,显然设置被设置为
simple
(这是
gitv2
的默认值),可能是

git config --global push.default simple
这意味着,当本地和远程分支不完全匹配时,
git
拒绝推送

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

但是在某些情况下,当您的本地分支机构正在跟踪某些 不同的远程分支具有不同的名称,然后您要更改该名称:

要允许按每git推送到跟踪分支,从而使
git pull
git push
对称,请使用

git config push.default upstream
注意:要为所有的
git
s全局设置,请使用
git config--global push.default upstream


但是,最好将其保留在git config--global push.default simple上,只在那些确实需要的工作负载中设置此选项。

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

> 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
选项正确设置上游分支。

分支名称中不是
释放/
的一部分吗?哦,是的。我忽略了这一点。它应该以发布开始。似乎Git错误消息具有误导性。(现在我有问题了)谢谢。上一个命令在我的远程回购中创建了分支
rel_5.4.1
。我用git branch-D rel_5.4.1删除了它。正确吗?:-(
错误:src refspec releases/rel_5.4.1与任何版本都不匹配。
它现在在做什么?是的,这是它在本地删除分支的第一步。下一步是
git push--delete origin rel_5.4.1
,它将远程删除分支。您使用的是什么版本的git(也是什么平台)?回答得很好,尤其是最后的结论。除非您使用的是两个或多个具有相同分支名称的不同上游,否则在本地和远程使用不同名称的原因很少。但是在这种情况下,在命令上手动键入推送目标比使用某些automagic解决方案更安全。我同意结论是,保持分支名称双方相同通常是最明智和最容易混淆的。Git也同意这一点,这就是为什么config中push.default的默认值很简单的原因,这加强了这种合理性。从手册页:“简单-在集中式工作流中,像上游一样工作,如果上游分支的名称与本地分支的名称不同,则添加了拒绝推送的安全性。”如果您想要相同的基本行为(默认情况下仅推送我的当前分支)如果我使用
git checkout-b branchname--track origin/releases/branchname
签出分支,那么在没有该检查的情况下,更改您回购的配置:
git config push.default upstream
我会不厌其烦地告诉git上游分支的名称,并请求它跟踪它。不需要魔法匹配,没有危险,我说id我想要这个分支的什么-但它仍然会引发这个错误。为什么跟踪应用于“pull”而不是“push”?>就Git而言,/在分支名称中没有特殊意义,只是为了让它们更易于人眼阅读。不正确,请尝试:
Git branch test bname;Git branch test bname/带斜杠
@DaveB try
git日志——图形——颜色——单线——装饰——全部改为