为什么叫git分支

对于git中的高级操作,我更喜欢新手。 我使用博客框架Octopress维护我的博客。 虽然Octopress自2011年以来没有任何发展,但它为我的目标提供了很好的帮助,所以我至今没有想过改变任何事情。

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

今天,在编写新帖时, 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 add .git commit -m 'message'git push origin source

  • 这个消息是什么意思?
  • 有什么东西坏了?
  • 如果是,什么?
  • 我需要修复它吗?
  • 如果可能的话,请将我指向一篇PDF /网络文章,在那里我可以阅读并理解它,以便将来使用。

    更多细节:

    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会警告你。 如果没有“上游跟踪”功能按预期工作,你一直相处得很好,因此是否要改变任何内容取决于你。


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

  • “git branch -v -v”(和“git status”)没有区分不是基于任何其他分支的分支,与其上游分支同步的分支以及配置有上游分支的分支不再存在的分支。
  • 为了描述它的含义,首先需要了解“远程”,“远程分支”以及git如何处理“跟踪上游”。

    每个“远程”只是一个名字,就像本例中的originoctopress 。 他们的目的是记录你的git fetchgit pull更新地点的完整URL。 当您使用git fetch remote, 1 git会转到该远程(使用保存的URL)并提供适当的更新集。 它还使用“远程分支”记录更新。

    一个“远程分支”只是一个“远程”上最后看到的分支的记录。 每个远程本身就是一个git仓库,所以它有分支机构。 远程“origin”上的分支记录在remotes/origin/下的本地存储库中。 你表现的文中说,有一个名为分支sourceorigin ,和分支命名为2.1linklog上,等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/ names之一。

    你可以用git branch --set-upstream-to来做到这一点,例如:

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

    (假设你仍然在分支“源”上,并且该origin/source是你想要的上游),但是我没有办法告诉哪一个,如果有的话,你实际上想要的)。

    (另请参见如何让现有的Git分支跟踪远程分支?)

    我想你在这里的方式是,当你第一次做一个git clone ,你克隆的东西有一个分支master 。 你还有一个分支master ,它被设置为跟踪origin/master (这是一个正常的git标准设置)。 这意味着你将branch.master.remotebranch.master.merge设置为originrefs/heads/master 。 但是,您的origin远程将其名称从master更改为source 。 为了匹配,我相信你也把你的本地名称从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会告诉你你的回购是否匹配上游之一,该分支。

    如果你想方便,重新设置上游。


    1 git pull使用git fetch ,并且从git 1.8.4开始,这个(最终!)也更新了“远程分支”信息。 在较旧版本的git中,更新没有使用git pull在远程分支中记录,只有在使用git fetch 。 既然你的git必须至少是1.8.5版本,这对你来说不是问题。

    2Well,这加上我故意忽略的配置线是在remote.origin.fetchremote.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表示你想要做什么,而不是让你自己手动完成,这是一种“更好的方式”。


    torek的答案可能是完美的,但我只是希望记录中提到的另一个案例与原始问题中描述的不同,但同样的错误可能会出现(因为它可能会帮助其他类似问题的人):

    我在我的一台服务器上使用git init --bare创建了一个空的(新)回购。 然后我把它git clone到我个人电脑上的本地工作区。

    在本地回购单上提交单一版本后,我在调用git status后出现了该错误。

    在torek的回答之后,我了解到发生了什么事是第一次提交本地工作目录repo创建了“master”分支。 但在远程回购(在服务器上)从来没有任何东西,所以甚至没有一个“主”(远程/起源/主)分支。

    在从本地仓库运行git push origin master之后,远程仓库终于有了一个主分支。 这阻止了错误的出现。

    所以得出结论 - 由于没有分支(包括“主”),可能会出现这样的错误,因为它没有提交,因此提交了一个零提交的新远程仓库。


    这可能会解决您的问题。

    在做了修改后,你可以提交它然后进行修改

    git remote add origin https://(address of your repo) it can be https or ssh
    then
    git push -u origin master
    

    希望对你有效。

    谢谢

    链接地址: http://www.djcxy.com/p/4545.html

    上一篇: Why call git branch

    下一篇: push current branch shortcut