【问题标题】:fatal: The upstream branch of your current branch does not match the name of your current branch致命:您当前分支的上游分支与您当前分支的名称不匹配
【发布时间】:2014-09-11 22:26:18
【问题描述】:

在使用 Git GUI 对远程分支 releases/rel_5.4.1 进行检查后,当我尝试 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(还有什么平台)?

标签: git push remote-branch


【解决方案1】:

注意!虽然这个答案得票最多并且在技术上是正确的,但它表明问题出在push.default 选项上,而真正的问题通常是本地分支和上游分支的名称之间的意外不匹配。盲目按照此答案中的说明进行操作可能会导致您的更改被推送到错误的分支!如需安全的快速修复,请参阅https://stackoverflow.com/a/24865780/2279059

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

这是由于git config push.default 设置造成的。它定义了当您输入git push (see link) 时git 的作用。

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

git config --global push.default simple

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

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

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

要允许基于每个 git 推送到跟踪分支,因此 使 git pullgit push 对称,使用

git config push.default upstream

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

【讨论】:

  • 我引用的 cmets 来自 @Tom-Spurling 和 Jacob-Ford
  • 我相信这应该是最好的答案!因为我不想每次推送时都提到跟踪分支。
  • 这绝对是一个脚注,但这个特殊问题似乎主要是关于错误地以不匹配的分支名称结束......所以这可能不是一个更好的答案 对于这个问题,即使我们真的很可能在故意使用不同的分支名称时通过搜索该错误消息来结束。我想一个理想的答案会提到这两点! (?)
  • @TomSpurling 进行了相应的编辑,所以建议现在只设置这个--local
  • 这对我来说绝对是正确的答案。我故意在结帐时以不同的方式命名分支,以我自己的方式组织它们,并且不得不不断地指示 git 我创建了指向不同分支名称的上游链接,这很烦人。这解决了它。谢谢!
【解决方案2】:

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

> 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 branch -m newbranch 重命名具有上游集的分支并尝试 git push 时遇到的情况更是如此。在那种情况下git branch --unset-upstream 然后做git 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
  • 效果很好,谢谢!
【解决方案3】:

这个错误可以通过以下方式一劳永逸地修复:

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

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

【讨论】:

  • 默认情况下,git config push.default 设置为simple,这意味着如果远程分支与本地分支的名称不匹配,即使远程分支设置为上游,它也永远不会高兴。设置 git config push.default upstream 将抑制这些错误。
  • @JacobFord 的评论非常重要。据我所知,这是无需重命名本地分支的唯一方法。
  • 谢谢!这正是我所需要的,虽然我真的很困惑为什么 git remote set-branch origin releases/rel_5.4.1 不能解决问题......
  • 这只是因为默认推送行为(“simple”)试图非常“安全”——所以它只推送一个分支,并且只有上游分支名称相同(因为你可能不小心设置了一个不同的上游!(我猜))。正如我和@JacobFord 提到的那样,将其更改为“upstream”是等效的(仅推送单个当前分支),而没有这种额外的“安全性”(检查名称匹配)。您可以在手册的push.default 部分查看所有选项 (man git-config)。
  • 这就是我要找的那个。就我而言,我已将分支重命名为本地和远程,但 git 仍在尝试使用旧的跟踪分支。这解决了这个问题,现在一个简单的git push 再次工作,即使配置设置为simple
【解决方案4】:

您的本地分支称为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

【讨论】:

  • 很好的答案,尤其是最后的结论。 IMO 在本地和远程使用不同名称的原因很少见,除非您使用两个或多个具有相同分支名称的不同上游。但是在这种情况下,在命令上手动输入推送目标让我感觉比使用一些自动解决方案更安全
  • 我同意这样的结论,即保持分支名称两侧相同通常是最明智且最不容易混淆的。 Git 也同意,这就是为什么配置中 push.default 的默认值是 simple 的原因,它强制执行这种理智。来自手册页:“simple - 在集中式工作流程中,像 upstream 一样工作,如果上游分支的名称与本地分支的名称不同,则可以拒绝推送。”如果您想要相同的基本行为(默认情况下仅推送我当前的分支)而不进行该检查,请更改您的 repo 的配置:git config push.default upstream
  • 如果我使用 git checkout -b branchname --track origin/releases/branchname 签出分支,我会不厌其烦地告诉 Git 上游分支的名称并要求它跟踪它。不需要魔法匹配,没有危险,我说了我想要的这个分支 - 但它仍然引发了这个错误。为什么跟踪适用于“拉”而不是“推”?
  • > 就 Git 而言,分支名称中的 / 没有特殊含义,只是为了便于人眼阅读。 不正确,请尝试:@ 987654330@
  • @DaveB 请改用git log --graph --color --oneline --decorate --all。在我这边标签变成黄色,本地分支变成绿色,远程分支变成红色。远程分支也可以在其名称上检测到,因为它们总是以远程名称为前缀,通常是git clone 之后的origin。所以远程的master分支在本地被称为origin/master。 (请注意,没有什么能阻止您使用git branch origin/master。只是不要做这样的事情!)此外,要将您的本地“缓存”与所有当前远程分支名称同步,git remote update -p 是您的朋友。
【解决方案5】:

似乎有一个与远程不同的本地分支名称并不是Git 太喜欢的东西。您需要发出:

git push origin HEAD:releases/rel_5.4.1

每次推送都明确

【讨论】:

  • releases/ 不是分支名称的一部分吗?
  • 哦,是的。我忽略了这一点。它应该以releases/ 开头。似乎 Git 错误消息具有误导性。 (现在我得到了问题)
  • 谢谢。前面的命令在我的远程仓库中创建了一个分支rel_5.4.1。我用git branch -D rel_5.4.1 删除了它。对吗?
  • :-( error: src refspec releases/rel_5.4.1 does not match any. 它现在在做什么?
  • 是的,这是它在本地删除分支的第一步。下一步是git push --delete origin rel_5.4.1,它将远程删除分支..
猜你喜欢
  • 2014-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-05
  • 2017-09-30
  • 2021-12-27
  • 2013-02-13
相关资源
最近更新 更多