为什么叫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如何处理“跟踪上游”。
每个“远程”只是一个名字,就像本例中的origin
或octopress
。 他们的目的是记录你的git fetch
或git pull
更新地点的完整URL。 当您使用git fetch remote,
1 git会转到该远程(使用保存的URL)并提供适当的更新集。 它还使用“远程分支”记录更新。
一个“远程分支”只是一个“远程”上最后看到的分支的记录。 每个远程本身就是一个git仓库,所以它有分支机构。 远程“origin”上的分支记录在remotes/origin/
下的本地存储库中。 你表现的文中说,有一个名为分支source
的origin
,和分支命名为2.1
, linklog
上,等octopress
。
(当然,“正常”或“本地”分支只是您在自己的存储库中创建的分支名称。)
最后,您可以设置一个(本地)分支来“跟踪”“远程分支”。 一旦本地分支L
被设置为跟踪远程分支R
,git会调用R
的“上游”并告诉你是否在上游(在提交方面)“前方”和/或“后方”。 对于本地分支机构和远程分支机构来说,使用相同的名称(远程前缀部分除外)是正常的(甚至可以推荐),例如source
和origin/source
,但实际上并非必要。
在这种情况下,这没有发生。 您有一个本地分支source
跟踪远程分支origin/master
。
你不需要知道git如何设置本地分支来跟踪远程分支的确切机制,但是它们在下面是相关的,所以我将展示它是如何工作的。 我们从您当地的分行名称, source
。 有两个使用此名称的配置条目,拼写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/
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.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 branch
(例如, git pull origin source
),您可能已经多年来一直在解决这个问题。 如果你一直这样做,它会继续解决问题 - 所以,不,你不需要修复它。 如果你愿意,你可以使用--unset-upstream
移除上游并停止投诉,并且不要将本地分支source
标记为任何上游。
上游的目的是使各种操作更加方便。 举例来说, git fetch
随后git merge
通常会“做正确的事情”,如果上游设置正确,和git status
后git fetch
会告诉你你的回购是否匹配上游之一,该分支。
如果你想方便,重新设置上游。
1 git pull
使用git fetch
,并且从git 1.8.4开始,这个(最终!)也更新了“远程分支”信息。 在较旧版本的git中,更新没有使用git pull
在远程分支中记录,只有在使用git fetch
。 既然你的git必须至少是1.8.5版本,这对你来说不是问题。
2Well,这加上我故意忽略的配置线是在remote.origin.fetch
下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
表示你想要做什么,而不是让你自己手动完成,这是一种“更好的方式”。
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