您的配置指定与远程的 <branch name> 合并,但没有获取这样的 ref。?
Posted
技术标签:
【中文标题】您的配置指定与远程的 <branch name> 合并,但没有获取这样的 ref。?【英文标题】:Your configuration specifies to merge with the <branch name> from the remote, but no such ref was fetched.? 【发布时间】:2016-08-27 07:58:20 【问题描述】:我收到这个拉取错误:
您的配置指定与 ref 合并 'refs/heads/feature/Sprint4/ABC-123-Branch' 来自遥控器,但没有 获取了这样的 ref。
此错误不会出现在任何其他分支。此分支的特殊之处在于它是从另一个分支的先前提交创建的。 我的配置文件如下所示:
[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
【问题讨论】:
你能分享一下你用来合并的命令吗? 远程分支被删除后会出现这个问题。仔细检查它是否真的存在。 未来读者:如果您知道远程分支存在,请检查您是否忽略大小写。我已经设置了一个本地分支来跟踪一个远程分支,但是用所有小写字母输入了远程的名称。只需要重新配置本地来跟踪 origin/BranchName 而不是 origin/branchname 我刚遇到这个错误,问题比下面的答案简单得多,我失去了我的 *** 连接。所以这也是如果 git 无法访问远程源服务器的错误。 对于涉及修剪本地分支以匹配远程的解决方案,首先确保您实际上没有在本地已删除的分支上,尤其是您没有未提交的更改在那个分支上。 【参考方案1】:这是什么意思
你的上游——你调用origin
的远程——不再有,或者可能从来没有(仅从这些信息中无法判断)名为feature/Sprint4/ABC-123-Branch
的分支。有一个特别常见的原因:有人(可能不是你,或者你记得)删除了另一个 Git 存储库中的分支。
做什么
这取决于你想要什么。请参阅下面的讨论部分。你可以:
在远程创建或重新创建分支,或者 删除您的本地分支,或 你能想到的任何其他东西。讨论
您必须运行git pull
(如果您运行的是git merge
,您将收到不同的错误消息,或者根本没有错误消息)。
当您运行 git fetch
时,您的 Git 会根据您的配置的 [remote "origin"]
部分下的 url
行联系另一个 Git。 Git 运行一个命令 (upload-pack
),除其他外,该命令向 your 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
。您的 Git 对遇到的每个分支名称都执行此操作。
它还将原始名称记录在特殊文件FETCH_HEAD
中(如果您查看自己的.git
目录可以看到此文件)。此文件保存获取的名称和 ID。
git pull
命令是一种便捷的捷径:它在适当的遥控器上运行git fetch
,然后运行git merge
(或者,如果有这样的指示,git rebase
)与合并所需的任何参数(或变基)按照[branch ...]
部分的指示。在这种情况下,您的 [branch "feature/Sprint4/ABC-123-Branch"]
部分表示从 origin
获取,然后与在名称 refs/heads/feature/Sprint4/ABC-123-Branch
下找到的任何 ID 合并。
由于在该名称下没有找到任何内容,git pull
抱怨并停止。
如果您将其作为两个单独的步骤运行,git fetch
和 git merge
(或 git rebase
),您的 Git 将查看缓存的 remotes/origin/
远程跟踪分支,以查看要合并或变基的内容.如果一次有这样一个分支,您可能仍然拥有远程跟踪分支。在这种情况下,您不会收到错误消息。如果从来没有这样的分支,或者如果您运行 git fetch
和 --prune
(删除死的远程跟踪分支),那么您没有相应的远程跟踪分支,您会收到投诉,但它会请参考origin/feature/Sprint4/ABC-123-Branch
。
在任何一种情况下,我们都可以得出结论,feature/Sprint4/ABC-123-Branch
现在在名为 origin
的遥控器上不存在。
它可能曾经存在过,并且您可能从远程跟踪分支创建了本地分支。如果是这样,您可能仍然拥有远程跟踪分支。您可能会调查谁从远程删除了分支,以及为什么,或者您可能只是推送一些东西来重新创建它,或者删除您的远程跟踪分支和/或您的本地分支。
1好吧,至少,它会承认。但除非他们特别隐藏了一些 refs,否则列表包括所有内容。
编辑,2020 年 7 月:有一个新的 fetch 协议可以避免列出所有内容,并且只列出 Git 说它正在寻找的名称。这可以帮助具有大量分支和/或标签的存储库。但是,如果您的 Git 对所有可能的名称感兴趣,您仍然会在此处获得所有名称。
【讨论】:
感谢您解释 git pull 命令的实际作用。我能够通过运行 git fetch 然后合并来解决我的问题。 要删除本地存储库中不存在的远程分支引用,请使用git remote prune origin
@Ben-Uri: 是的,或者,运行git fetch --prune origin
,或者在你的配置中将fetch.prune
设置为true
(这三个都是为了做同样的事情,尽管在几个版本中的 Git 其中一些不太可靠)。
@JonathanBenn:您可以使用git branch --set-upstream-to=origin/master master
切换本地master
的上游设置。删除并重新创建有一个副作用(假设您使用 DWIM 样式的 git checkout master
创建它),还有一个额外的副作用是强制您的 master
匹配您的 origin/master
。
啊!我遇到了这个。一个github项目改名为master分支main!【参考方案2】:
如果您/某人重命名了分支,也会发生这种情况。
所以请按照以下步骤操作(如果您知道分支名称已重命名)
假设较早的分支名称为 wrong-branch-name
并且有人将其重命名为 correct-branch-name
所以。
git checkout correct-branch-name
git pull
(您将看到“您的配置指定..”)
git branch --unset-upstream
git push --set-upstream origin correct-branch-name
git pull
(你不会收到之前的消息)
【讨论】:
git push
甚至没有必要,如果当前分支在其远程之后,它将无法工作。 git pull origin correct-branch-name
就够了。
上面设置upstream的命令错误。执行 git pull 之后, --unset-upstream 操作,在 pull 的输出中可以看到错误,使用命令设置上游,如下所示, git branch --set-upstream-to=origin/检查您的远程分支是否可以拉取。 我有同样的问题,终于意识到远程分支被某人删除了。
【讨论】:
我也一样! 在拉取请求之后,合并(即进行合并的人)可以选择删除合并到目标分支的分支。如果你在那个时候尝试拉,你会得到这个错误。 这是真的 :)【参考方案4】:这是一个更常见的错误,因为许多项目正在将其 master
分支移动到另一个名称,例如 main
、primary
、default
、root
、reference
、latest
等,正如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
分支的行,并注意远程repo 是否称为origin
、upstream
或其他名称。
然后使用该信息,将分支名称更改为新名称,例如如果它说您当前正在跟踪 origin/master
,请替换为 main
:
git branch master --set-upstream-to origin/main
您还可以重命名自己的分支以避免将来混淆:
git branch -m main
【讨论】:
感谢您的关注!这个主要的东西只会越来越沮丧。 或者git fetch upstream
,git checkout main
,然后下次git pull
。【参考方案5】:
对我来说,这是一个区分大小写的问题。我的本地分支是 Version_feature2 而不是 Version_Feature2。我使用正确的大小写重新检查了我的分支,然后 git pull 工作了。
【讨论】:
这也是我的问题。对于相当长/复杂的分支名称,这并不明显。 这也是我的问题 我的案子也很敏感!【参考方案6】:当实际原因是我的磁盘已满时,我遇到了类似的错误。删除一些文件后,git pull
开始按预期工作了。
【讨论】:
这里也一样 - 我猜 git 试图从远程获取一些东西,因为磁盘已满而默默地无法写入它,然后找不到文件并抱怨“引用不是获取”?【参考方案7】:在我的情况下,我只是缺少远程分支上的初始提交,因此本地分支没有找到任何要拉的东西,它给出了错误消息。
我做到了:
git commit -m 'first commit' // on remote branch
git pull // on local branch
【讨论】:
【参考方案8】:您可以通过运行轻松地将本地分支与远程分支链接:
git checkout <your-local-branch>
git branch --set-upstream-to=origin/<correct-remote-branch> <your-local-branch>
git pull
【讨论】:
【参考方案9】:当源分支名称有大小写问题时,也会收到此错误。
例如:origin 分支是team1-Team
,本地分支已经结帐为team1-team
。那么,-Team
中的 T
和 -team
中的 t
可能会导致此类错误。这发生在我的案例中。因此,通过将本地名称更改为 origin 分支的名称,错误就解决了。
【讨论】:
【参考方案10】:我一直遇到这个问题。就我而言,@Jerreck 关于分支名称大小写差异的评论是导致此错误的原因。一些 Windows 工具不区分大小写。
要在 git 中关闭区分大小写,请运行以下命令:
git config --global core.ignorecase true
请注意,这不仅会影响分支名称。例如,如果您在同一目录中有“Foo.h”和“foo.h”(在为 Windows 构建软件时这不是一个好主意),那么我怀疑您不能关闭区分大小写。
【讨论】:
这对解决问题没有帮助,因为core.ignorecase
选项只会影响您的文件,但不会影响 git 内部文件(位于 .git
文件夹中)
core.ignorecase true
对我不起作用(问题是分支名称的大小写不同)。所以我刚刚将上游设置为正确的分支名称【参考方案11】:
检查区分大小写
就我而言,我的分支名称(远程)使用大写字母,例如:BranchName
。
一不小心,我在本地机器上创建了一个分支branchname
(全小写)并将upstream设置为相同,就出现了这个错误。
解决方案:
我删除了本地存储库,再次克隆它,并签出到BranchName
【讨论】:
【参考方案12】:就我而言,我删除了当前分支所源自的原始分支。所以在 .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
成功了
【讨论】:
【参考方案13】:在我的例子中,我重命名了 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
【讨论】:
【参考方案14】:只需检查是否有人在远程删除了分支。
【讨论】:
【参考方案15】:当我没有使用正确的大小写时,我也遇到了同样的错误。
我可以签出“集成”。 Git 告诉我执行git pull
来更新我的分支。我这样做了,但收到了提到的错误。
正确的分支名称是大写“I”的“Integration”。
当我检查那个分支并拉出它时,它没有问题。
【讨论】:
【参考方案16】:我在 master/main 分支上遇到了类似的问题。就我而言,我的硬盘上没有足够的可用空间。释放一些空间后,它工作了。
我认为是因为文件 /.git 需要一些空间来编辑其文件。 例如文件:'refs/heads/feature/Sprint4/ABC-123-Branch'
【讨论】:
【参考方案17】:-
重命名本地分支
git branch -m temp
-
显示所有分支
git branch -a
-
查看具体的远程分支
git checkout main
-
删除临时分支
git branch -d temp
【讨论】:
【参考方案18】:当我的磁盘已满时,我在执行“git pull”时遇到了这个错误。创造了一些空间,一切又开始正常工作。
【讨论】:
【参考方案19】:您可以编辑主文件夹中的~/.gitconfig
文件。这是保存所有 --global 设置的地方。
或者,使用 git config --global --unset-all remote.origin.url
并在运行 git fetch
和存储库 url 之后。
【讨论】:
【参考方案20】:我遇到了同样的问题,我当前的分支是 dev 并且我正在检查 MR 分支并在之后执行 git pull。我采取的一个简单的解决方法是为 MR Branch 创建了一个新文件夹,然后在 git pull 那里执行了 git clone。
所以基本上我维护了不同的文件夹来将代码推送到不同的分支。
【讨论】:
【参考方案21】:在我的情况下,无法在新项目中获取 master。
在我把它放到命令行之后它就起作用了,
git config --global http.sslVerify false
参考:https://confluence.atlassian.com/bitbucketserverkb/can-t-access-bitbucket-server-with-git-issuer-certificate-is-invalid-779171808.html
【讨论】:
【参考方案22】:Github repo 中分支的 pull request 被批准,它被合并到 dev 分支中,并且不再存在于 origin。
【讨论】:
【参考方案23】:在我的情况下,repo 暂时不可用(正在维护中)。
【讨论】:
【参考方案24】:我得到了这个确切的错误,但建议的答案(可能是区分大小写)都不是问题所在。它们可能解决了 99% 的问题,但仍然只剩下 1%。
事实证明,混合 WSL/Linux 文件共享和 Windows 基本目录是问题所在。我正在运行 WSL(Ubuntu 20.04)并且有一个从 Windows 访问/编辑的存储库,但代码在 WSL 上运行。我可能从 WSL 端做了一些 git 状态检查。
repo 存在,案例是正确的,互联网工作正常,没有删除任何分支等。但我也收到错误 您的配置指定与来自远程的合并,但没有这样的 ref被提取了。?
我的解决方法是确保所有项目都被推送/所有更改都记录下来,然后我刚刚删除了目录并再次从 Windows 中执行了“git clone”。然后'git checkout'工作正常。我意识到这不是一个真正的答案,但它确实有效。
我在进行 Linux 开发,其中代码库可以自动执行某些操作,包括“git clone”;但是,我通常会从 Windows 推送代码。我的猜测是 .git 文件夹不是跨平台兼容的(不是我有任何期望)。然而,它通常有效。这是一个错误吗?值得商榷。
git 也会偶尔尝试变得漂亮和 munge 行结尾;这是一个不同的问题(并且与宗教接壤。我是不可知论者。是的,有一个设置。)
【讨论】:
【参考方案25】:我发现从默认master
分支已重命名为main
的repo 中提取更新时经常发生此错误。
在 2020 年将 master
分支重命名为 main
分支的趋势之后遇到了很多这种情况。
因此,如果您之前使用默认的 master
分支克隆了一个 repo,并且该分支已重命名为 main
,则一种解决方法是将上游从 master 指向 main:
git branch --set-upstream-to=origin/main master
如果该命令成功,您应该会看到如下消息:
分支“master”设置为从“origin”跟踪远程分支“main”。
然后您可以使用git branch -m master main
将本地分支从master
重命名为main
(与远程分支名称保持一致)
【讨论】:
【参考方案26】:对我来说,发生这种情况是因为我使用 Web 界面将分支 dev 合并到 master,然后尝试使用在 dev 分支上打开的 VSCode 同步/拉取。(奇怪的是,我无法更改为 master 而不会出现此错误。)
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 - 对我来说,删除本地文件夹并再次克隆会更容易。
【讨论】:
【参考方案27】:如果另一个 pull 正常,则表示您的互联网未连接。
【讨论】:
许多反对票,但这就是我收到此错误的原因。我有互联网,但我的 git 服务器丢失了 ***。重新连接到 *** 后,拉取工作正常。以上是关于您的配置指定与远程的 <branch name> 合并,但没有获取这样的 ref。?的主要内容,如果未能解决你的问题,请参考以下文章
git fetch 取回所有分支(branch)的更新(转)
Git 移除远程指定分支提示: [remote rejected] main (refusing to delete the current branch: refs/heads/main)