当谈到 git 中的高级操作时,我更像是一个新手。我使用博客框架Octopress维护我的博客。尽管 Octopress 自 2011 年以来没有任何开发,但它很好地满足了我的目的,所以到目前为止我还没有想过要改变任何东西。
仅供参考,我的博客托管在 Github Pages 上。
今天,在写一篇新帖子时,git status显示了以下消息:
git status
On branch source Your branch is based on 'origin/master', but the upstream is gone. (use "git branch --unset-upstream" to fixup)
对于所有后续命令(例如和git add .)重复相同的消息。 git commit -m 'message'``git push origin source
git add .
git commit -m 'message'``git push origin source
如果可能,请指向我的 pdf/web 文章,我可以在其中阅读并理解它以备将来使用。
更多细节:
bash-3.2$ git branch -a * source remotes/octopress/2.1 remotes/octopress/HEAD -> octopress/master remotes/octopress/gh-pages remotes/octopress/linklog remotes/octopress/master remotes/octopress/refactor_with_tests remotes/octopress/rubygemcli remotes/octopress/site remotes/origin/source
如果需要更多信息,请告诉我。谢谢。
TL;DR 版本:远程跟踪分支origin/master曾经存在,但现在不存在,因此本地分支source正在跟踪不存在的东西,这充其量是可疑的——这意味着不同的 Git 功能无法为你做任何事情——攁nd Git 正在警告你。在没有“上游跟踪”功能按预期工作的情况下,您一直相处得很好,因此是否更改任何内容取决于您。
origin/master
source
有关上游设置的另一种看法,请参阅为什么我必须“git push –set-upstream origin ”?
这个警告是 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_ , __
origin
octopress
git fetch
git pull
git fetch _remote_ ,
“远程跟踪分支”(或远程跟踪名称)只是在某个“远程”上最后看到的分支名称的记录。每个远程本身就是一个 Git 存储库,因此它有分支。远程“原点”上的分支记录在本地存储库中的remotes/origin/. 您显示的文本说有一个名为sourceon的分支origin,以及名为2.1,的分支linklog,依此类推octopress。
remotes/origin/
2.1
linklog
(当然,“普通”或“本地”分支只是您在自己的存储库中创建的分支名称。)
最后,您可以设置(本地)分支来“跟踪”“远程跟踪分支”。一旦本地分支 L 设置为跟踪远程跟踪分支 R ,Git 将调用 R 它的“上游”并告诉你你是否在上游“领先”和/或“落后”(就提交而言)。本地分支和远程跟踪分支使用相同的名称(远程前缀部分除外)是正常的(甚至是推荐的),例如sourceand origin/source,但这实际上不是必需的。
L
R
origin/source
在这种情况下,这不会发生。您有一个本地分支source跟踪一个远程跟踪分支origin/master。
你不需要知道 Git 如何设置本地分支来跟踪远程分支的确切机制 , 但它们在下面是相关的,所以我将展示它是如何工作的。我们从您当地的分支机构名称开始,source. 有两个配置条目使用此名称,拼写branch.source.remote和branch.source.merge. 从您显示的输出中,很明显这些都已设置,因此如果您运行给定的命令,您会看到以下内容:
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 branch -a
remotes/
remotes/origin/master
Git 告诉您可以使用--unset-upstream. 这将清除branch.source.origin和branch.source.merge,并停止警告。
--unset-upstream
branch.source.origin
但是,您想要的似乎很可能是从 tracking 切换origin/master到 tracking 其他东西:可能origin/source,但可能是其中一个octopress/名称。
octopress/
您可以使用git branch --set-upstream-to, 3执行此操作,例如:
git branch --set-upstream-to
$ git branch --set-upstream-to=origin/source
(假设您仍然在分支“源”上,这origin/source就是您想要的上游——不过,我无法说出您真正想要的是哪一个,如果有的话)。
我认为你到达这里的方式是,当你第一次做 a 时git clone,你克隆的东西有一个 branch master。您还有一个分支master,它被设置为跟踪origin/master(这是 git 的正常标准设置)。这意味着你有branch.master.remote和branch.master.merge设置,到origin和refs/heads/master。但是后来您的origin遥控器将其名称从 更改master为source。为了匹配,我相信您也将本地名称从 更改master为source。这改变了您的设置 名称 ,从branch.master.remotetobranch.source.remote和 from branch.master.mergeto branch.source.merge… 但它留下了旧 值 ,所以branch.source.merge现在是错误的。
git clone
master
branch.master.remote
branch.master.merge
refs/heads/master
正是在这一点上,“上游”链接中断了,但在 1.8.5 之前的 Git 版本中,Git 从未注意到损坏的设置。现在您有了 1.8.5,它指出了这一点。
这涵盖了大多数问题,但不是“我需要解决它”的问题。很可能你多年来一直在通过做(例如,)来解决这个问题。如果您继续这样做,它将继续解决问题 - 不,您 不需要 修复它。如果您愿意,您可以使用删除上游并停止投诉,并且根本不会将本地分支标记为有 任何 上游。git pull _remote branch_``git pull origin source --unset-upstream``source
git pull _remote branch_``git pull origin source
--unset-upstream``source
有一个上游的目的是让各种操作更方便。例如,如果上游设置正确,git fetch然后git merge通常会“做正确的事情”,git status之后git fetch会告诉您您的回购是否与该分支的上游匹配。
git merge
如果您想要方便,请重新设置上游。
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.
remote.origin.fetch
refs/remotes/origin/master
3或者,用git config. 如果您只想将上游设置origin/source为唯一需要更改的部分是branch.source.merge,并且git config branch.source.merge refs/heads/source 会这样做。但是--set-upstream-to说 你 想做什么,而不是让你自己手动去做,所以这是一个“更好的方法”。
git config
git config branch.source.merge refs/heads/source
--set-upstream-to