ChatGPT解决这个技术问题 Extra ChatGPT

您的配置指定与远程的 <branch name> 合并,但没有获取这样的 ref。?

我收到这个错误拉:

您的配置指定与远程的 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
我刚刚遇到这个错误,问题比下面的答案简单得多,我失去了我的 VPN 连接。因此,如果 git 无法访问远程源服务器,这也是您得到的错误。
对于涉及修剪本地分支以匹配远程的解决方案,首先确保您实际上不在本地已删除的分支上,尤其是您在该分支上没有未提交的更改。

t
torek

这意味着什么

您的上游(称为 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 fetchgit merge(或 git rebase),您的 Git 将查看缓存的 remotes/origin/ 远程跟踪分支,以查看要合并或变基的内容。如果一次这样一个分支,您可能仍然拥有远程跟踪分支。在这种情况下,您不会收到错误消息。如果从来没有这样的分支,或者如果您使用 --prune 运行 git fetch(删除死的远程跟踪分支),那么您没有相应的远程跟踪分支,您会收到投诉,但它会请参阅 origin/feature/Sprint4/ABC-123-Branch

无论哪种情况,我们都可以得出结论,在名为 origin 的遥控器上现在不存在 feature/Sprint4/ABC-123-Branch

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

1好吧,至少它会承认的一切。但除非他们特别隐藏了一些参考文献,否则该列表包括所有内容。

编辑,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 的上游设置。 Delete-and-recreate 有一个副作用(假设您使用 DWIM 样式 git checkout master 创建它),还有一个额外的副作用是强制您的 master 匹配您的 origin/master
啊!我遇到了这个。一个github项目改名为master分支main!
d
dan carter

如果您/某人重命名了分支,也会发生这种情况。所以请按照以下步骤操作(如果您知道分支名称已重命名)假设较早的分支名称为 wrong-branch-name 并且有人将其重命名为 correct-branch-name 所以。

git checkout correct-branch-name

git pull(您会看到“您的配置指定..”)

git branch --unset-upstream

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

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

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


git push 甚至没有必要,如果当前分支位于其远程之后,它将无法工作。 git pull origin correct-branch-name 就足够了。
上面设置上游的命令是错误的。执行 git pull 之后, --unset-upstream 操作,在 pull 的输出中可以看到错误,使用命令设置上游,如下所示, git branch --set-upstream-to=origin/ 我的分公司
从我的存储库中删除一些大文件并需要推回我刚刚创建的新存储库后,对我来说工作得很好
对于最近访问此内容的任何人:不再支持“--set-upstream”。现在你应该使用“git branch --set-upstream-to=origin/ main”
唯一有效的答案
M
Malhaar Punjabi

检查您的远程分支是否可以拉取。我有同样的问题,终于意识到远程分支被某人删除了。


对我来说也是一样!
在拉取请求之后,合并(即进行合并的人)可以选择删除已合并到目标分支的分支。如果您尝试在此时拉动,您将收到此错误。
那是真实的 :)
n
nealmcb

这是一个更常见的错误,因为许多项目正在将其 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 分支的行,并注意远程存储库是否称为 originupstream 或其他名称。

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

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

您还可以重命名自己的分支以避免将来混淆:

git branch -m main

谢谢你抓住!这个主要的主人的事情只会越来越沮丧。
或者 git fetch upstreamgit checkout main,然后是下一次 git pull
n
nicko

对我来说,这是一个区分大小写的问题。我的本地分支是 Version_feature2 而不是 Version_Feature2。我使用正确的大小写重新检查了我的分支,然后 git pull 工作。


原来这也是我的问题。对于相当长/复杂的分支名称,这并不明显。
这也是我的问题
我的案子也很敏感!
G
Gendos-ua

您可以通过运行以下命令轻松地将本地分支与远程分支链接:

git checkout <your-local-branch>
git branch --set-upstream-to=origin/<correct-remote-branch> <your-local-branch>
git pull

u
user1747134

当实际原因是我的磁盘已满时,我遇到了类似的错误。删除一些文件后,git pull 开始按预期工作。


同样在这里-我猜git试图从远程获取一些东西,因为磁盘已满而默默地写失败,然后找不到文件并抱怨“没有获取参考”?
T
THE JOATMON

在我的情况下,我只是缺少远程分支上的初始提交,因此本地分支没有找到任何要拉的东西,它给出了那个错误消息。

我做了:

git commit -m 'first commit' // on remote branch
git pull // on local branch

X
Xpleria

当原始分支名称有一些大小写问题时,也会收到此错误。

例如:origin 分支为 team1-Team,本地分支已结帐为 team1-team。那么,-Team 中的 T-team 中的 t 可能会导致此类错误。这发生在我的案例中。因此,通过将本地名称更改为原始分支的名称,错误就解决了。


J
JohnnyUtah

我发现从默认 master 分支已重命名为 main 的存储库中提取更新时经常发生此错误。在 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(与远程分支名称保持一致)


S
Stéphane

我一直遇到这个问题。就我而言,@Jerreck 关于分支名称大小写差异的评论是导致此错误的原因。某些 Windows 工具不区分大小写。

要在 git 中关闭区分大小写,请运行以下命令:

git config --global core.ignorecase true

请注意,这将影响的不仅仅是分支名称。例如,如果您在同一目录中有“Foo.h”和“foo.h”(在为 Windows 构建软件时不是一个好主意),那么我怀疑您不能关闭区分大小写。


这对解决问题没有帮助,因为 core.ignorecase 选项只会影响您的文件,但不会影响 git 内部文件(位于 .git 文件夹中)
core.ignorecase true 对我不起作用(问题是分支名称的大小写不同)。所以我刚刚将上游设置为正确的分支名称
C
Christoffer Sørensen

我在 master/main 分支上遇到了类似的问题。就我而言,我的硬盘上没有足够的可用空间。释放一些空间后,它起作用了。

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


C
CodeChari

检查区分大小写

就我而言,我的分支名称(远程)使用大写字母,例如:BranchName。不小心,我在本地机器上创建了一个分支branchname(全小写)并将上游设置为相同,并且出现了这个错误。

解决方案:我删除了本地存储库,再次克隆它,然后签出到 BranchName


G
Guilherme Campos Hazan

就我而言,我删除了当前分支所源自的原始分支。所以在 .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

它奏效了


t
topkek

就我而言,我重命名了 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

D
Dawit

对我来说,发生这种情况是因为我使用 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 - 对我来说,删除本地文件夹并再次克隆更容易。


A
AB Abhi

只需检查是否有人在远程删除了分支。


u
user7550381

当我的磁盘已满时,我只是在执行“git pull”时遇到了这个错误。创造了一些空间,一切又开始正常工作。


e
emi-le

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


M
Michael

重命名本地分支

git 分支 -m 临时

显示所有分支

git 分支 -a

查看特定的远程分支

git结帐主要

删除临时分支

git 分支 -d 临时


A
Angelo Mendes

您可以编辑主文件夹中的 ~/.gitconfig 文件。这是保存所有 --global 设置的地方。

或者,使用 git config --global --unset-all remote.origin.url 并在运行 git fetch 之后使用存储库 URL。


M
Monalisa Das

我面临着同样的问题,我当前的分支是 dev 并且我正在检查 MR 分支并在之后执行 git pull。我采取的一个简单的解决方法是为 MR Branch 创建了一个新文件夹,然后在那里执行 git pull 和 git clone。

所以基本上我维护了不同的文件夹来将代码推送到不同的分支。


R
R Zhang

在我的情况下,无法在新项目中获取主人。

在我把它放在命令行之后它就起作用了,

git config --global http.sslVerify false

参考:https://confluence.atlassian.com/bitbucketserverkb/can-t-access-bitbucket-server-with-git-issuer-certificate-is-invalid-779171808.html


A
Andrew Koper

该分支在 Github 存储库中的拉取请求已获得批准,它已合并到 dev 分支中,并且不再存在于原点。


I
IKo

在我的情况下,回购暂时不可用(正在维护中)。


J
J. Gwinner

我得到了这个确切的错误,但建议的答案(可能是区分大小写)都不是问题所在。它们可能解决了 99% 的问题,但仍然只剩下 1%。

事实证明,混合 WSL / Linux 文件共享和 Windows 基本目录是问题所在。我正在运行 WSL(Ubuntu 20.04)并且有一个从 Windows 访问/编辑的存储库,但代码在 WSL 上运行。我可能从 WSL 端做了一些 git 状态检查。

回购存在,案例是正确的,互联网工作正常,没有删除任何分支等。但我也收到错误您的配置指定与远程合并,但没有获取这样的参考。?

我的解决方法是确保所有项目都被推送/所有更改都记录下来,然后我只是删除了目录并再次从 Windows 中执行了“git clone”。然后'git checkout'工作正常。我意识到这不是一个真正的答案,但它确实有效。

我正在做 Linux 开发,其中代码库自动执行某些操作,包括“git clone”;但是,我通常会从 Windows 推送代码。我的猜测是 .git 文件夹不是跨平台兼容的(不是我有任何期望)。然而,它通常有效。它是一个错误吗?值得商榷。

git 也会偶尔尝试变得漂亮和 munge 行结尾;这是一个不同的问题(并且与宗教接壤。我是不可知论者。是的,有一个设置。)


f
fabpico

使用 yarn 安装软件包时发生在我身上。自己的依赖项将分支 main 重命名为 master。仅更新依赖项的上游并没有解决它,我还必须清理 yarn 缓存。

项目 A 重命名了主分支(main -> master)。项目 A 是项目 B 的依赖项。项目 B 上的纱线安装 <-- 导致错误在项目 A 上推送更新的上游 项目 B 上的纱线安装 <-- 导致项目 B 上的错误纱线缓存清洁纱线安装 <-- 现在可以使用


P
Pyrolistical

如果另一个拉动正常,则意味着您的互联网未连接。


许多反对票,但这就是我收到此错误的原因。我有互联网,但我的 git 服务器丢失了 VPN。重新连接到 VPN 后,拉动工作正常。