这意味着什么
你的上游——你称之为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说它正在寻找的名称。这对于具有大量分支和/或标