小编典典

为什么要调用 git branch --unset-upstream 来修复?

all

当谈到 git
中的高级操作时,我更像是一个新手。我使用博客框架Octopress维护我的博客。尽管
Octopress 自 2011
年以来没有任何开发,但它很好地满足了我的目的,所以到目前为止我还没有想过要改变任何东西。

仅供参考,我的博客托管在 Github Pages 上。

今天,在写一篇新帖子时,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

  • 消息是什么意思?
  • 有什么东西坏了吗?
  • 如果是,是什么?
  • 我需要修复它吗?

如果可能,请指向我的 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

如果需要更多信息,请告诉我。谢谢。


阅读 78

收藏
2022-06-30

共1个答案

小编典典

TL;DR
版本:远程跟踪分支origin/master曾经存在,但现在不存在,因此本地分支source正在跟踪不存在的东西,这充其量是可疑的——这意味着不同的
Git 功能无法为你做任何事情——攁nd Git 正在警告你。在没有“上游跟踪”功能按预期工作的情况下,您一直相处得很好,因此是否更改任何内容取决于您。

有关上游设置的另一种看法,请参阅为什么我必须“git push –set-upstream origin
”?


这个警告是 Git 中的一个新事物,首先出现在 Git 1.8.5 中。发行说明仅包含一个简短的项目符号:

  • “git branch -v -v”(和“git
    status”)没有区分不基于任何其他分支的分支、与其上游分支同步的分支以及配置了上游的分支不再存在的分支。

要描述它的含义,您首先需要了解“远程”、“远程跟踪分支”以及 Git 如何处理“跟踪上游”。( 远程跟踪分支 是一个非常有缺陷的术语——已经开始使用
远程跟踪名称 ,我认为这是一个轻微的改进。不过,为了与 Git 文档保持一致,我将在下面使用“远程跟踪分支”。 )

每个“远程”只是一个名称,例如originoctopress在这种情况下。他们的目的是记录您git fetchgit pull更新的地点的完整 URL。当您使用1时,Git 会转到该远程(使用保存的 URL)并带来适当的更新集。它还使用“远程跟踪分支”
记录更新。git fetch _remote_ , __

“远程跟踪分支”(或远程跟踪名称)只是在某个“远程”上最后看到的分支名称的记录。每个远程本身就是一个 Git
存储库,因此它有分支。远程“原点”上的分支记录在本地存储库中的remotes/origin/.
您显示的文本说有一个名为sourceon的分支origin,以及名为2.1,的分支linklog,依此类推octopress

(当然,“普通”或“本地”分支只是您在自己的存储库中创建的分支名称。)

最后,您可以设置(本地)分支来“跟踪”“远程跟踪分支”。一旦本地分支 L 设置为跟踪远程跟踪分支 R ,Git 将调用 R
它的“上游”并告诉你你是否在上游“领先”和/或“落后”(就提交而言)。本地分支和远程跟踪分支使用相同的名称(远程前缀部分除外)是正常的(甚至是推荐的),例如sourceand
origin/source,但这实际上不是必需的。

在这种情况下,这不会发生。您有一个本地分支source跟踪一个远程跟踪分支origin/master

你不需要知道 Git 如何设置本地分支来跟踪远程分支的确切机制
但它们在下面是相关的,所以我将展示它是如何工作的。我们从您当地的分支机构名称开始,source.
有两个配置条目使用此名称,拼写branch.source.remotebranch.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.originbranch.source.merge,并停止警告。

但是,您想要的似乎很可能是从 tracking 切换origin/master到 tracking
其他东西:可能origin/source,但可能是其中一个octopress/名称。

您可以使用git branch --set-upstream-to, 3执行此操作,例如:

$ git branch --set-upstream-to=origin/source

(假设您仍然在分支“源”上,这origin/source就是您想要的上游——不过,我无法说出您真正想要的是哪一个,如果有的话)。

我认为你到达这里的方式是,当你第一次做 a 时git clone,你克隆的东西有一个 branch
master。您还有一个分支master,它被设置为跟踪origin/master(这是 git
的正常标准设置)。这意味着你有branch.master.remotebranch.master.merge设置,到originrefs/heads/master。但是后来您的origin遥控器将其名称从
更改mastersource。为了匹配,我相信您也将本地名称从 更改mastersource。这改变了您的设置 名称
,从branch.master.remotetobranch.source.remote和 from branch.master.mergeto
branch.source.merge… 但它留下了旧 ,所以branch.source.merge现在是错误的。

正是在这一点上,“上游”链接中断了,但在 1.8.5 之前的 Git 版本中,Git 从未注意到损坏的设置。现在您有了 1.8.5,它指出了这一点。


这涵盖了大多数问题,但不是“我需要解决它”的问题。很可能你多年来一直在通过做(例如,)来解决这个问题。如果您继续这样做,它将继续解决问题 - 不,您
不需要 修复它。如果您愿意,您可以使用删除上游并停止投诉,并且根本不会将本地分支标记为有 任何 上游。git pull _remote branch_``git pull origin source --unset-upstream``source

有一个上游的目的是让各种操作更方便。例如,如果上游设置正确,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.
不过,映射几乎总是这样工作,所以可以预见masterorigin/master.

3或者,用git config.
如果您只想将上游设置origin/source为唯一需要更改的部分是branch.source.merge,并且git config branch.source.merge refs/heads/source 会这样做。但是--set-upstream-to
想做什么,而不是让你自己手动去做,所以这是一个“更好的方法”。

2022-06-30