gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 17:50:01 26 4
gpt4 key购买 nike

在 git 中进行高级操作时,我更像是一个新手。我维护我的blog使用博客框架 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

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

    最佳答案

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

    有关上游设置的另一种看法,请参阅 Why do I have to "git push --set-upstream origin <branch>"?

    这个警告是 Git 中的一个新东西,首先出现在 Git 1.8.5 中。发行说明只包含一个关于它的简短项目:

    • "git branch -v -v" (and "git status") did not distinguish among a branch that is not based on any other branch, a branch that is in sync with its upstream branch, and a branch that is configured with an upstream branch that no longer exists.


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

    每个“ Remote ”只是一个名称,例如 originoctopress在这种情况下。它们的目的是记录诸如您所在位置的完整 URL 之类的内容 git fetchgit pull更新。当您使用 git fetch remote, 1 Git 转到那个远程(使用保存的 URL)并带来适当的更新集。它还使用“远程跟踪分支”记录更新。

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

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

    最后,您可以设置一个(本地)分支来“跟踪”一个“远程跟踪分支”。曾经的本地分公司 L设置为跟踪远程跟踪分支 R , Git 会调用 R它的“上游”并告诉您您是否“领先”和/或“落后”上游(就提交而言)。本地分支和远程跟踪分支使用相同的名称(远程前缀部分除外)是正常的(甚至可以推荐),例如 sourceorigin/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 ,并停止警告。

    不过,您想要的似乎很可能是从跟踪切换 origin/master , 跟踪其他内容:可能 origin/source ,但也许是 octopress/ 之一名称。

    你可以用 git branch --set-upstream-to 来做到这一点,3 例如:
    $ git branch --set-upstream-to=origin/source

    (假设您仍然在分支“源”上,并且 origin/source 是您想要的上游 - 但我无法确定您真正想要哪个,如果有的话)。

    (另见 How do you make an existing Git branch track a remote branch?)

    我认为你到达这里的方式是当你第一次做 git clone 时,你克隆的东西有一个分支 master .你也有一个分支 master ,设置为跟踪 origin/master (这是 git 的正常标准设置)。这意味着你有 branch.master.remotebranch.master.merge设置为 originrefs/heads/master .但是你的 origin remote 更名为 mastersource .为了匹配,我相信您也将您的本地名称从 master 更改为至 source .这更改了您设置的名称,来自 branch.master.remotebranch.source.remote来自 branch.master.mergebranch.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 statusgit fetch会告诉您您的 repo 是否与该分支的上游 repo 相匹配。

    如果您想要方便,请重新设置上游。

    1 git pull用途 git fetch ,从 Git 1.8.4 开始,这(终于!)也更新了“远程跟踪分支”信息。在旧版本的 Git 中,更新没有被记录在远程跟踪分支中 git pull ,只有 git fetch .由于您的 Git 必须至少为 1.8.5 版本,因此这对您来说不是问题。

    2好吧,这个加上我故意忽略的配置行是在 remote.origin.fetch下找到的. Git 必须映射“merge ”名称才能确定远程分支的完整本地名称是 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说你想做什么,而不是让你自己手动去做,所以这是一个“更好的方法”。

    关于git - 为什么调用 git branch --unset-upstream 来修复?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21609781/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com