TL; DR版本:远程跟踪分支origin/master曾经存在,但现在不存在,因此本地分支source正在跟踪不存在的事物,这充其量是可疑的-这意味着不同的Git功能无法为您做任何事情- Git正在警告您。您一直都很好,而没有按预期工作“上游跟踪”功能,因此,是否更改任何内容取决于您。
有关上游设置的其他信息,请参见为什么必须“ git push --set-upstream origin <branch>”?
该警告是Git中的新事物,在Git 1.8.5中首先出现。发行说明仅包含一个简短的项目符号:
- “ git branch -v -v”(和“ git status”)未区分不基于任何其他分支的分支,与其上游分支同步的分支以及配置了上游的分支不再存在的分支。
要描述其含义,您首先需要了解“远程”,“远程跟踪分支”以及Git如何处理“跟踪上游”。(远程跟踪分支是一个非常有缺陷的术语-我开始改用远程跟踪名称,我认为这是一个小改进。不过,在下面,我将使用“远程跟踪分支”来确保与Git文档的一致性。 )
每个“远程”仅是一个名称,如origin或octopress在这种情况下。它们的目的是记录诸如您git fetch或要git pull更新的地方的完整URL之类的内容。当您使用1时, Git会转到该遥控器(使用保存的URL)并带来适当的更新集。它还使用“远程跟踪分支” 记录更新。git fetch remote,
“远程跟踪分支”(或远程跟踪名称)只是在某些“远程”上最后一次看到的分支名称的记录。每个远程本身就是一个Git存储库,因此它具有分支。远程“来源”上的分支记录在本地存储库下remotes/origin/。你表现的文中说,有一个名为分支source上origin,和树枝命名2.1,linklog等上octopress。
(当然,“普通”或“本地”分支只是您在自己的存储库中创建的分支名称。)
最后,您可以设置一个(本地)分支来“跟踪”“远程跟踪分支”。一旦本地分支L设置为跟踪远程跟踪分支R,Git就会将R其称为“上游”,并告诉您(在提交方面)您是否在上游“之前”和/或“后面”。本地分支和远程跟踪分支使用相同的名称(远程前缀部分除外)是正常的(甚至是推荐的),例如source和origin/source,但这实际上不是必需的。
在这种情况下,这没有发生。您有一个source跟踪远程跟踪分支的本地分支origin/master。
您不需要了解Git 如何设置本地分支来跟踪远程分支的确切机制,但是它们在下面是相关的,因此,我将展示它的工作原理。我们以您当地的分支机构名称开头source。有两个使用此名称的配置条目,spelled branch.source.remote和branch.source.merge。从显示的输出中,很明显,它们都已设置,因此,如果运行给定的命令,则会看到以下内容:
$ git config --get branch.source.remote
origin
$ git config --get branch.source.merge
refs/heads/master
将这些放在一起,2告诉Git您的分支source跟踪您的“远程跟踪分支” origin/master。
但是,现在查看的输出git branch -a,该输出显示了存储库中的所有本地和远程跟踪分支名称。远程跟踪名称列在remotes/... 下,没有remotes/origin/master。大概曾经有一次,但现在已经不复存在了。
Git告诉您可以使用删除跟踪信息--unset-upstream。这将清除branch.source.origin和branch.source.merge,并停止警告。
不过,您似乎很想从跟踪切换origin/master到跟踪其他内容:可能是origin/source,但也许是其中之一octopress/。
您可以使用git branch --set-upstream-to,3执行此操作,例如:
$ git branch --set-upstream-to=origin/source
(假设您仍在分支“源”上,而这origin/source是您想要的上游,尽管如此,我无法告诉您实际上想要的是哪一个)。
(另请参见如何使现有的Git分支跟踪远程分支?)
我认为您到达这里的方式是,当您第一次执行a时git clone,从中克隆的东西有了一个分支master。您还具有一个branch master,该分支设置为可跟踪origin/master(这是git的常规标准设置)。这意味着你有branch.master.remote和branch.master.merge设置,以origin和refs/heads/master。但是随后您的origin遥控器将其名称从更改master为source。为了匹配,我相信您也将自己的本地名称从更改master为source。这将您的设置名称从branch.master.remote更改为branch.source.remote,从... 更改branch.master.merge为branch.source.merge...,但是它保留了旧值,因此branch.source.merge现在是错误的。
正是在这一点上,“上游”链接断开了,但是在1.8.5之前的Git版本中,Git从未注意到断开的设置。现在您有了1.8.5,它指出了这一点。
这涵盖了大多数问题,但没有涵盖“我需要解决”这个问题。通过执行(例如),您可能已经在坏处工作了多年了。如果您继续这样做,它将继续解决问题,因此,不需要,您无需修复它。如果愿意,您可以使用删除上游并停止投诉,而不必将本地分支标记为完全没有上游。git pull remote branchgit pull origin source--unset-upstreamsource
上游的目的是使各种操作更加方便。例如,git fetch其次是git merge一般“做正确的事情”,如果上游设置正确,并且git status之后git fetch会告诉你你的回购是否匹配上游之一,该分支。
如果需要方便,请重新设置上游。
1git pull使用git fetch,从Git 1.8.4开始,它(最终!)还更新了“远程跟踪分支”信息。在旧版本的Git中,使用git pull,仅使用,没有将更新记录在远程跟踪分支中git fetch。由于您的Git必须至少为1.8.5版本,所以这对您来说不是问题。
2好吧,这是我故意忽略的配置行remote.origin.fetch。Git必须映射“合并”名称,以找出远程分支的完整本地名称是refs/remotes/origin/master。不过,映射几乎总是像这样工作,因此可以预料master到origin/master。
3或者,使用git config。如果您只想将上游设置origin/source为唯一需要更改的部分branch.source.merge,git config branch.source.merge refs/heads/source
那就可以了。但是,--set-upstream-to说什么你想要做的,而不是让你去自己做手工,所以这是一个“更好的方式”。