Jat*_*tra 140 git git-branch github-pages
在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)
Run Code Online (Sandbox Code Playgroud)
对所有后续命令重复相同的消息,例如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
Run Code Online (Sandbox Code Playgroud)
如果需要更多信息,请告诉我.谢谢.
tor*_*rek 181
TL; DR版本:远程跟踪分支origin/master曾经存在,但现在不存在,因此本地分支source正在跟踪不存在的东西,这最多是可疑的 - 这意味着不同的Git功能无法为您做任何事情 - 和Git正在警告你.如果没有"上游跟踪"功能按预期工作,你已经相处得很好,所以由你决定是否改变任何东西.
对于上游设置的另一种看法,请参阅为什么我必须"git push --set-upstream origin <branch>"?
这个警告在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,
"远程跟踪分支"(或远程跟踪名称)只是在某些"远程"上最后看到的分支名称的记录.每个远程本身都是一个Git存储库,因此它有分支.远程"origin"上的分支记录在您的本地存储库下remotes/origin/.您显示的文本显示有一个名为sourceon 的分支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
Run Code Online (Sandbox Code Playgroud)
将这些放在一起,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/名字.
你可以这样做git branch --set-upstream-to,3例如:
$ git branch --set-upstream-to=origin/source
Run Code Online (Sandbox Code Playgroud)
(假设你仍然在分支"源",那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.mergebranch.source.mergebranch.source.merge
正是在这一点上,"上游"连接断开了,但是在Git版本低于1.8.5时,Git从未注意到破坏的设置.现在你有1.8.5,它指出了这一点.
这涵盖了大多数问题,但不是"我需要解决它"问题.通过做(例如),你可能已经多年来一直在努力解决这个问题.如果你继续这样做,它将继续解决问题 - 所以,不,你不需要修复它.如果您愿意,可以使用删除上游并停止投诉,而不是将本地分支标记为任何上游.git pull remote branchgit pull origin source--unset-upstreamsource
具有上游的关键是使各种操作更方便.例如,如果上游设置正确,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必须映射"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说什么你想要做的,而不是让你去自己做手工,所以这是一个"更好的方式".
Ela*_*arR 148
torek的答案可能是完美的,但我只是希望记录中提到的另一个案例与原始问题中描述的案例不同但可能会出现相同的错误(因为它可能会帮助其他类似问题):
我在git init --bare我的一台服务器上创建了一个空的(新的)repo .然后我将git clone它发送到PC上的本地工作区.
在本地仓库上提交单个版本后,我在调用后收到了该错误git status.
根据torek的回答,我明白发生的事情是本地工作目录repo的第一次提交创建了"master"分支.但是在远程仓库(在服务器上)从来没有任何东西,所以甚至没有"主"(遥控/原点/主)分支.
git push origin master从本地仓库运行后,远程仓库终于有了一个主分支.这样可以阻止错误显示.
总而言之 - 由于没有分支,包括"master",因此可能会因为提交零的新远程仓库而出现这样的错误.
这可能会解决您的问题.
进行更改后,您可以提交它
git remote add origin https://(address of your repo) it can be https or ssh
then
git push -u origin master
Run Code Online (Sandbox Code Playgroud)
希望对你有效.
谢谢
对我来说,.git/refs/origin/master已经腐败了.
我做了以下,为我解决了问题.
rm .git/refs/remotes/origin/master
git fetch
git branch --set-upstream-to=origin/master
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
115659 次 |
| 最近记录: |