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

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个回答

5

我在主分支上也遇到了类似的问题。我的情况是硬盘上没有足够的可用空间。清理出一些空间后就可以工作了。

我猜测这是因为文件 /.git 需要一些空间来编辑它的文件。 例如文件:'refs/heads/feature/Sprint4/ABC-123-Branch'


3

这里的所有答案(包括 git fetch --prune origin)在 rebase 后对我都没有用。以下是有效的方法。请注意,其中一个命令将删除您的本地分支,因此在运行之前最好将其存储在您的remote origin

  • git checkout master // 切换到主分支
  • git branch -d problemBranch // 删除问题分支
  • git pull
  • git checkout problemBranch
  • git push -u
  • 现在git pull可以正常工作了

这样做不会导致任何额外的合并或其他使用该仓库的机器上的问题。


3

检查大小写敏感性

在我的情况下,我分支名称(远端)包含大写字母,例如:BranchName。 不小心,在本地机器上创建了一个全部小写的分支branchname并将上游设置为相同,导致出现此错误。

解决方法: 我删除了本地仓库,重新克隆它,并切换到BranchName


这对我来说也是一样的情况。我在Windows上工作(不区分大小写),而我的远程系统是区分大小写的。此外,远程系统被删除,并创建了一个同名但大小写不同的新分支。我的解决办法是编辑项目根目录下的.git/config文件,找到相关的分支条目,并在merge =行中更正大小写。 - mpag

3

我一直遇到这个问题。在我的情况下,@Jerreck的评论表明分支名称的大小写差异是导致此错误的原因。某些Windows工具不了解大小写敏感性。

要关闭git中的大小写敏感性,请运行以下命令:

git config --global core.ignorecase true

请注意,这将影响不仅分支名称,还包括以下内容。例如,如果您在同一目录中有“Foo.h”和“foo.h”(在为Windows构建软件时不是一个好主意),则我怀疑您无法关闭大小写敏感性。

1
这并不能解决问题,因为 core.ignorecase 选项只影响你的文件,而不是 Git 内部文件(位于 .git 文件夹中)。 - Ilya Serbis
"core.ignorecase true" 对我不起作用(问题是分支名称的大小写不同)。所以我只需将上游设置为正确的分支名称。 - oleksa

3

我刚刚遇到了“未检索到此类引用”的问题,上面的建议都没有帮助。我解决它的方法是在我的本地配置中进行更改。

remote.origin.fetch=+refs/heads/master:refs/remotes/origin/master

为了

remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*

我不知道为什么会起作用,但确实起作用了。在更改后,我可以进行拉取操作并收到预期的结果。
如果我将其改回去,再次尝试拉取时将出现“未获取到此类引用”的错误。因此,这绝对是解决方法(不是网络故障、大小写差异、磁盘已满、删除远程分支、默认分支未命名为“master”等原因)。

为什么Git删除了“master”的答案 https://www.bbc.com/news/technology-53050955 - Amol Bais

3
在我的情况下,我已经从当前分支派生的原始分支中删除了。所以在.git/config文件中我有:

在我的情况下,我删除了当前分支派生自的原始分支。因此,在.git/config文件中,我有:

[branch "simil2.1.12"]
    remote = origin
    merge = refs/heads/simil2.0.5
    rebase = false

simil2.0.5已被删除。我用相同的分支名称进行了替换:

最初的回答:

[branch "simil2.1.12"]
    remote = origin
    merge = refs/heads/simil2.1.12
    rebase = false

and it worked


2
当我的磁盘已满时,我进行“git pull”操作时遇到了这个错误。腾出一些空间后,一切都恢复正常了。

2
对我来说,这是因为我使用Web界面将dev分支合并到主分支,然后尝试在打开dev分支的VSCode上同步/拉取。(奇怪的是,我无法在不出错的情况下切换到主分支。)
git pull
Your configuration specifies to merge with the ref 'refs/heads/dev'
from the remote, but no such ref was fetched.'

我觉得删除本地文件夹并重新克隆更容易,因为它找不到refs/heads/dev。


我完全理解这个问题。开发分支曾经存在(最初在源代码中创建),但在某个时间点,该分支被合并到主分支并删除了。这是可以接受的。但我无法忍受没有简单的方法从源代码中同步它。如果该分支已在源代码中合并并删除,则我也不需要在本地保留它。为什么git pull或git fetch不能自动清除悬空的过时本地分支呢? - Simón
@Simón,因为你的本地开发分支可能包含你想要保留但尚未同步的更改。想象一下,Johnny boy在那边将他的开发分支中的更改合并到主分支中,并按照你的建议进行了同步和删除你的本地开发分支...而这个分支有着明天截止、至关重要的更改 :) - Dawit
不一定。Git可以轻松地判断您的本地分支是否领先于远程分支。也许这只是遵循GitHub推荐工作流程的微妙之处,例如:为每个错误/FR/问题在GitHub上创建一个分支,开发人员在其本地工作区中检出该分支(GitHub会告诉您如何操作),进行代码编写、提交、推送并生成拉取请求;然后存储库所有者合并拉取请求并删除该分支。然后开发人员执行git pull并看到此消息,他们必须手动删除过时的分支,这是git可以自动执行的步骤。 - Simón

2

在我的情况下,我在Github上重新命名了分支,然后系统提示我执行以下命令:

默认分支已重命名!

main is now named <new_name>

如果您有本地克隆,可以通过运行以下命令来更新它:
git branch -m main <new_name>
git fetch origin
git branch -u origin/<new_name> <new_name>
git remote set-head origin -a

1
我刚遇到了同样的错误,当我没有使用正确的大小写时。 我可以检出“integration”。Git告诉我执行git pull来更新我的分支。我这样做了,但收到了上述错误。 正确的分支名称是带有大写“I”的“Integration”。 当我检出该分支并拉取时,它可以正常工作。

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