您的配置指定与远程的<分支名称>合并,但没有获取到此类引用?

540

我在pull时遇到了以下错误:

你的配置指定要与远程引用'refs/heads/feature/Sprint4/ABC-123-Branch'合并,但没有获取到这样的引用。

这个错误不会出现在其他分支上。
这个分支特殊的地方是它是从另一个分支的先前提交创建的。

我的配置文件看起来像这样:

[core]
    repositoryformatversion = 0
    filemode = false
    bare = false
    logallrefupdates = true
    symlinks = false
    ignorecase = true
    hideDotFiles = dotGitOnly
[remote "origin"]
    url = <url here>
    fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
    remote = origin
    merge = refs/heads/master
[branch "new-develop"]
    remote = origin
    merge = refs/heads/new-develop
[branch "feature/Sprint4/ABC-123-Branch"]
    remote = origin
    merge = refs/heads/feature/Sprint4/ABC-123-Branch

9
当远程分支被删除时,可能会出现这个问题。请仔细核对它是否真的存在。 - Benny Code
24
未来的读者:如果你知道远程分支存在,请检查你是否忽略了大小写。我曾经设置了一个本地分支来跟踪一个远程分支,但是我把远程分支的名称都用小写字母输入了。只需要重新配置本地分支跟踪 origin/BranchName 而不是 origin/branchname 即可。 - Jerreck
2
在涉及修剪本地分支以匹配远程的解决方案时,首先确保您实际上并未在本地删除该分支,特别是您没有在该分支上进行未提交的更改。 - M Katz
2
已经有很好的答案了,所以不需要再添加新的答案。但是我想说一句,当我收到这个消息时,意味着源分支已被删除,通常是因为在合并到另一个分支时被删除。这是一种常见的做法,可以使源存储库不受旧分支的干扰。 - angryITguy
2
正如@angryITguy所提到的,原因很可能是当分支合并到master时被删除了(为了保持整洁)。例如,gitlab在合并页面上通过一个复选框鼓励这样做。您可以在https://dev59.com/OHVC5IYBdhLWcg3wpS3f查看分支是否已经合并。因此,使用git branch --merged master命令。如果确实已经合并,则可以使用git branch --set-upstream-to=origin/master清除“错误”消息。 - Michael Shaw
显示剩余3条评论
36个回答

343

这意味着什么

你的上游——你称之为origin的远程仓库——不再拥有,或者可能从一开始就没有(仅凭这些信息无法确定)一个名为feature/Sprint4/ABC-123-Branch的分支。其中有一个非常常见的原因:有人在那个Git仓库中删除了该分支(很可能不是你,否则你会记得的)。

应该怎么做

这取决于你想要什么。请参阅下面的讨论部分。你可以:

  • 在远程创建或重新创建该分支,或者
  • 删除你本地的该分支,或者
  • 想到任何其他办法。

讨论

你必须运行git pull(如果你运行的是git merge,你将得到不同的错误消息或根本没有错误消息)。

当你运行git fetch时,你的Git会基于配置文件中[remote "origin"]下的url行联系另一个Git。那个Git运行一个命令(upload-pack),其中包括向你的Git发送所有分支的列表。你可以使用git ls-remote来查看这是如何工作的(尝试一下,很有教育意义)。这是我在运行此命令时得到的一段代码片段,针对的是git本身的Git仓库:

$ git ls-remote origin
From [url]
bbc61680168542cf6fd3ae637bde395c73b76f0f    HEAD
60115f54bda3a127ed3cc8ffc6ab6c771cbceb1b    refs/heads/maint
bbc61680168542cf6fd3ae637bde395c73b76f0f    refs/heads/master
5ace31314f460db9aef2f1e2e1bd58016b1541f1    refs/heads/next
9e085c5399f8c1883cc8cdf175b107a4959d8fa6    refs/heads/pu
dd9985bd6dca5602cb461c4b4987466fa2f31638    refs/heads/todo
[snip]

refs/heads/列表包含了远程仓库中存在的所有分支,1以及对应的提交ID(对于refs/tags/条目,ID可能指向标签对象而不是提交)。

您的Git会根据同一remote部分中的fetch行更改每个分支名称。在这种情况下,例如,您的Git将refs/heads/master替换为refs/remotes/origin/master。它会对每个分支名称进行此操作。

它还将原始名称记录在特殊文件FETCH_HEAD中(如果您查看自己的.git目录,可以看到该文件)。此文件保存了获取到的名称和ID。

git pull命令旨在作为一种方便的快捷方式:它在适当的远程上运行git fetch,然后使用[branch ...]部分指示要合并(或重新基于)的参数运行git merge(或如果指导的话,git rebase)。在这种情况下,您的[branch "feature/Sprint4/ABC-123-Branch"]部分表示从origin获取,然后合并找到的ID,该ID在名称refs/heads/feature/Sprint4/ABC-123-Branch下。

由于未找到该名称下的任何内容,因此git pull会发出投诉并停止。

如果将其分为两个步骤运行,git fetch,然后是git merge(或git rebase),您的Git将查看缓存的remotes/origin/远程跟踪分支以查看要合并或重新基于哪些内容。如果曾经有这样的一个分支,您可能仍然拥有该远程跟踪分支。在这种情况下,您不会收到错误消息。如果从未有过这样的分支,或者如果您已经使用--prune运行了git fetch(删除了不活动的远程跟踪分支),以便没有相应的远程跟踪分支,则会收到投诉,但它会引用origin/feature/Sprint4/ABC-123-Branch

在任一情况下,我们可以得出结论,现在在名为origin的远程中不存在feature/Sprint4/ABC-123-Branch

它可能曾经存在过,您可能是从远程跟踪分支创建了本地分支。如果是这样,您可能仍然拥有远程跟踪分支。您可以调查一下谁删除了该分支以及为什么,或者只需推送某些内容来重新创建它,或者删除您的远程跟踪分支和/或本地分支。


1嗯,至少它将承认的所有内容。但是除非他们明确隐藏了某些引用,否则列表包括所有内容。

编辑,2020年7月:有一个新的提取协议可以避免列出所有内容,而仅列出您的Git说它正在寻找的名称。这对于具有大量分支和/或标


1
感谢您解释git pull命令的实际作用。我通过运行git fetch然后合并,成功解决了我的问题。 - fizch
48
要在本地仓库中删除不存在的远程分支引用,请使用 git remote prune origin - Yoav
2
@Ben-Uri:是的,或者运行git fetch --prune origin,或在您的配置中设置fetch.prunetrue(所有这三个都旨在执行相同的操作,尽管在一些Git版本中,其中一些可能不太可靠)。 - torek
15
您可以使用git branch --set-upstream-to=origin/master master命令来切换本地master分支的上游设置。删除并重新创建会具有这样的副作用(假设您使用DWIM风格的git checkout master命令来创建它),还会强制使您的master匹配您的origin/master - torek
6
啊!我遇到了这个问题。一个 Github 项目把主分支从 master 改成了 main! - codeDr
显示剩余7条评论

215

如果你/别人重新命名了分支,也可能会发生这种情况。因此,请按照以下步骤进行操作(如果您知道分支名称已更改)。

假设早期的分支名称为wrong-branch-name并且已将其重命名为correct-branch-name,则执行以下操作:

git checkout correct-branch-name

git pull(您将看到此消息:“Your configuration specifies..”)

git branch --unset-upstream

git branch --set-upstream-to=origin/correct-branch-name

对于旧版本的git git push --set-upstream origin correct-branch-name

git pull(你将不会收到之前的消息)


6
即使不进行 git push,如果当前分支落后于其远程分支,则无法进行推送。只需使用 git pull origin 正确的分支名称 即可。 - Pierre
11
上面设置上游的指令是错误的。在 "--unset-upstream" 操作之后执行 "git pull",在拉取输出中您可以看到一个带有设置上游命令的错误,如下所示:git branch --set-upstream-to=origin/<branch> mybranch - Ankit Marothi
在我从代码库中删除了一些大文件并需要将其推送回我刚创建的新代码库后,它对我非常有效。 - Akah
5
对于最近访问本信息的任何人:'--set-upstream'不再受支持。现在你应该使用"git branch --set-upstream-to=origin/<branch> main"。请注意,此命令用于设置分支与远程存储库之间的跟踪关系。 - jtb
3
唯一有效的答案 - poitroae
显示剩余3条评论

57

检查您的远程分支是否可供拉取。 我遇到了同样的问题,最终发现这个远程分支被别人删除了。


5
我也一样! - aerin
8
在提交拉取请求后,合并者(即执行合并的人)有选择删除已合并到目标分支的分支的选项。如果此时尝试拉取,则会收到此错误提示。 - Artokun
那是真的 :) - Malhaar Punjabi
我也一样。我不小心删除了分支... - 2Up1Down

32

现在许多项目将它们的master分支更名为其他名称,例如mainprimarydefaultrootreferencelatest等,详情请参见Github plans to replace racially insensitive terms like ‘master’ and ‘whitelist’

要解决这个问题,首先找出项目现在使用的名称,你可以通过它们的github、gitlab或其他git服务器找到它。

然后按照以下步骤捕获当前配置:

$ git branch -vv
...
* master  968695b [origin/master] Track which contest a ballot was sampled for (#629)
...

找到描述“master”分支的行,并注意远程仓库是称为“origin”,“upstream”还是其他名称。

然后使用这些信息,将分支名称更改为新名称,例如如果它说你当前正在跟踪“origin/master”,则替换为“main”:

git branch master --set-upstream-to origin/main
你可以重命名你自己的分支,以避免未来的混淆。
git branch -m main

感谢你的发现!这个主控制器的事情越来越令人沮丧了。 - Abbas Elmas
1
或者执行 git fetch upstreamgit checkout main,然后下次执行 git pull - gerrit

16

对我来说,这是一个大小写敏感的问题。我的本地分支名字是Version_feature2而不是Version_Feature2。我重新用正确的大小写检出了我的分支,然后git pull就可以工作了。


2
这也成为了我的问题。如果分支名称相对较长/复杂,这并不是显而易见的。 - Håkon K. Olafsen
这也是我的问题。 - Vicky Singh
我的情况也非常敏感! - Krafty

11
你可以运行以下命令轻松地将本地分支与远程分支关联起来:
git checkout <your-local-branch>
git branch --set-upstream-to=origin/<correct-remote-branch> <your-local-branch>
git pull

7

在我的电脑磁盘已满的情况下,我遇到了类似的错误。删除一些文件后,git pull 又可以正常工作了。


一样的情况 - 我猜 git 尝试从远程获取某些内容,由于磁盘已满而无声地写入失败,然后找不到文件并抱怨“未获取 ref”? - rob74

7
在我的情况下,远程分支缺少初始提交,因此本地分支找不到任何内容可供拉取,并显示了该错误消息。
我执行了以下操作:
git commit -m 'first commit' // on remote branch
git pull // on local branch

6
这个错误也可能是由于源分支名称的大小写问题引起的。
例如:源分支是team1-Team,而本地分支已经被检出为team1-team。然后,-Team中的T-team中的t会导致这样的错误。在我的情况下就发生了这种情况。所以,通过将本地分支名称更改为源分支的名称,解决了该错误。

6

我发现当从一个默认的master分支被重命名为main的repo拉取更新时,这个错误经常会出现。

2020年将master分支重命名为main分支后,这种情况经常遇到。

所以如果你之前克隆了一个带有默认master分支的repo,并且该分支已被重命名为main,那么一种解决方法是将上游从master指向main:

git branch --set-upstream-to=origin/main master

如果该命令成功,您应该会看到以下消息:

分支'master'设置为跟踪'remote branch 'main' from 'origin'

然后你可以通过git branch -m master main将本地分支从master重命名为main(以保持与远程分支名称一致)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接