我以为我的git配置有问题,
每当我创建一个新的分支时,我首先必须设置 - 上游
git push --set-upstream sensorAtHome pull-down-to-refresh
sensorAtHome我的项目名称在哪里,pull-down-to-refresh是分支名称.
实际上我没有必要在我的工作场所这样做,我简单创建分支做我的工作提交和推送,我从来没有设置 - 上游,但我在家里的项目,当我推送到GitHub.com我必须..
有什么我错过的可能与我的工作流程有关吗?
假设您的Git工作版本是2.0之前(您的评论表明它可能是1.8),那么这就是您的家庭Git(2.0或更高版本)和工作Git(2.0之前版本)表现不同的原因.
在GIT中2.0,作为默认值push.default从变化matching到simple.从Git 1.8.0开始,Git开始生成关于此的警告消息.请参阅警告:未设置push.default; 它的隐含值在Git 2.0中有所改变,以获取详细信息.Git版本2.8.0放弃了警告.
请注意,你可能更喜欢current到simple.对于分散式工作流,请参阅git中的"simple"vs"current"push.default.但是,设置上游很有用:请参阅为什么我一直需要`--set-upstream`? 如果您愿意,请继续阅读更多背景信息.
无论是由于此,还是仅仅因为您决定应该对其进行配置,您可以push.default在任何特定存储库中设置自己的值,也可以为您自己的个人全存储库--global设置设置自己的值.(请注意,如果你git config --global的一些设置,然后又git config在同在一个特定的仓库在本地设置,本地设置通常会覆盖.有一些例外情况,例如,针对branch.master.fetch,但它往往是不明智的这个设置为任何有--global!)
如果您尚未设置,或已matching在工作设置中明确设置,但simple在家庭设置中.这两种模式的不同行为解释了这个问题.警告matching的接受答案中描述了行为:push.default未设置; 它的隐式值在Git 2.0中发生了变化,而在没有指定分支的"git push"的默认行为中更多- 但请注意,这两个都描述了运行时得到的结果:
git push sensorAtHome
Run Code Online (Sandbox Code Playgroud)
要么:
git push
Run Code Online (Sandbox Code Playgroud)
但不是:
git push sensorAtHome pull-down-to-refresh
Run Code Online (Sandbox Code Playgroud)
更准确地说,描述总是开始讨论当你没有refspecs推进时会发生什么.(我们马上就会看到refspec.)
实际上有五种可能的设置push.default(虽然新标准simple仅在Git 1.7.11中引入,但仍有一些人使用Git 1.7).这五种设置nothing,current,upstream,simple,和matching.
该nothing设置实际上是最简单的,但我试了一下,发现它烦人.:-)它强制您命名要推送的分支.因此,我们大多可以忽略它,只考虑其他四个.
如果您没有指定任何分支,其他四个设置将直接推送一些分支或分支.更确切地说,如果省略所有refspecs,这四个设置就会直截了当.但是它们也可以影响当你包含一些refspecs 时会发生什么.
git push语法该语法git push,如果我们忽略了所有的标志参数,方法是:
git push <repository> <refspec> <refspec> ...
Run Code Online (Sandbox Code Playgroud)
也就是说,后面的第一个参数git push(也跳过任何标志和标志参数)是存储库.您可以在此处写出完整的URL,例如:
git push https://github.com/...
Run Code Online (Sandbox Code Playgroud)
但是使用遥控器通常要好得多,这就是一个简短的名字origin,或者在你的情况下sensorAtHome.对于git push,远程大多只是不必键入的网址过长,每次时间(git fetch它也提供origin/了部分远程跟踪分支名称).
在存储库参数之后,任何剩余的参数都是refspecs.repository参数实际上是可选的,但如果您想要提供任何refspec参数,则必须首先提供存储库参数.但究竟什么是 refspec?我们为什么要关心他们?
最简单的refspec形式就是你在这里使用的形式:它只是一个分支名称.你写:
git push someremote branch
Run Code Online (Sandbox Code Playgroud)
和Git推送命名分支.但refspecs实际上更为普遍.
首先,refspec开始时用冒号分隔两部分.例如branch,您可以写下:
git push someremote branch:branch
Run Code Online (Sandbox Code Playgroud)
左边的名字是你的名字,右边的名字是他们的名字.请记住,当您运行时git push,您使用两个 Gits,具有两个不同的存储库.你告诉你的Git打电话给一些远程Git.一旦你的Git在互联网电话上有另一个Git(通过https或ssh或其他),你的Git会将你的一些提交发送给他们的Git,然后你的Git会要求他们设置他们的分支,通常基于你提交的提交发送.
由于有两个Gits,因此涉及两个不同的分支名称.你的分支可能被命名为弗雷德,例如,他们的名字可能被命名为弗雷德里克.你的可能是Zaphod,他们可能是Beeblebrox.你的分支是你的,他们的分支可能是你的上游.没有要求它们具有相同的名称 - 几乎没有要求.而且,如果你真的拼出两个部分,写作zaphod:beeblebrox或其他什么,Git假设你知道你在做什么,并运行.
不过,如果这些名字不相同,事情会变得非常疯狂.这是多简单,如果他们所有的时间相匹配.因此,三四个"有趣的"设置-的matching,current以及simple-尝试确保他们留相同.你只需要使用你的名字,你的Git会尽力确保他们的名字匹配.
不执行此操作的一个设置 - upstream模式 - 告诉您的Git使用您的名字,以及您已经配置为他们身边的上游设置.显然,要使其工作,您必须设置上游.但是,这仍然会离开,并且,并且可能让您想知道它们的用途.matchingcurrentsimple
简短的回答是matchingGit最初所做的,但事实证明这是一个错误,你可能永远不应该使用它.你应该使用simple或current代替.该simple设置是安全的,但需要您设置的上游.再说一次,为了更多,并帮助您在它们之间进行选择,请参阅git中的"简单"与"当前"push.default,以实现分散的工作流程.
如果您提供至少一个refspec,旧matching设置就像current.你的Git采用你提供的refspec或refspecs(即分支名称) - 并且记住,这只适用于你没有写的时候,所以只有一个本地名称 - 并让他们的Git创建或更新一个同名的分支,无论您的分支机构是否有上游集. 但是如果你省略所有 refspecs,告诉你的Git向他们的Git询问他们所有的分支,并查找你所有的分支,并匹配名称.如果名称相同,您的Git会将您的提交发送给他们的Git,并要求他们设置同名的分支.local-name:remote-namematching
对于大多数人来说,在大多数情况下,这种差异很小.你有你的master,也许你的develop和一个或两个功能分支.你git fetch要拿起新东西,工作一段时间,然后git push发送你写的东西.你的Git会询问他们的Git更新master 和 develop 与你的功能分支.如果你不应该在工作master,而你没有工作的master-只是在develop-there的没有在你master为你的Git推,所以没有问题.即使其他人向其他Git的主人推送了一些新东西,你develop也会因为错误而拒绝推送的部分内容:您的更改会被推送,并且您尝试从其中删除新的提交会master遇到错误.
但是看看:你刚刚要求你的Git删除他们的新提交master.这是一个不好的迹象,如果没有别的.而且,如果你做了一个特性分支的一些试点工作,这不是真正准备好进行推动,并计划修复一些东西,重订一些不好的承诺远在特性分支,你可能只是不小心推都 develop 和那个特性分支.
这一切都很糟糕.该current设置与matching设置完全相同,但默认情况下它只推送一个分支,这是您现在检查的分支.
该simple设置是一样的current设置,但增加了一个更安全带:当前分支都需要有它的上游设置,在其他的Git同名的一个分支.
为了完整起见,我想提一些关于refspecs的内容.一个是他们不必命名分支:你也可以命名标签.你的Git通常会找出你的意思,只要你没有为标签和分支使用相同的名称(不要这样做 --Git有一套规定的规则用于发生的事情,但它们很奇怪,冲突,你会混淆你).您可以拼出任何参考的"全名":refs/heads/master,refs/tags/v1.2等等.您可以通过写信遗漏本地名称,:delete要求他们的Git 删除分支或标记或其他参考.最后,您可以设置per-refspec force标志.
以下是五种可能的设置push.default:
nothing:您必须至少包含一个refspec参数(这会强制您包含远程部分).你不能错过这个设置; 问题是它很烦人,也就是说,你也不能正确.matching:这是旧的,2.0之前的Git行为.它可以推动太多分支,所以除非你真的很顽固,否则不要使用它.:-)current:这是表现更好的变种matching.simple:这current与添加的安全检查相同,您的分支需要具有上游集,具有相同的基本分支名称.安全检查可能有点烦人:它会强制您设置上游.设置上游的价值不仅仅是让自己simple开心,所以这push.default对大多数人来说确实是最好的.upstream:这是为了稍微疯狂的情况,由于某种原因,你必须命名你的分支,fred即使上游是ginger,或其他什么.这是一种更宽松的变体simple:你仍然必须设置上游,但你可以设置它在疯狂的火车上旅行.| 归档时间: |
|
| 查看次数: |
1166 次 |
| 最近记录: |