“TL; DR”总结:它确实有效,但它可能会混淆,所以你可能应该重新安排你的分支名称。下面是Magnus Bäck's answer的扩展版本。
这里涉及两个实体(或更多,如果你有一个以上的远程,但我们坚持两个:-),你和origin
):
有暧昧refname
(见gitrevisions)只影响“自己回购”,因为远程都有自己的名字,在自己的.git
目录。此外,当你在一个refname
型,让你的Git命令解决这个问题,它根据gitrevisions列出这些规则解决。
这仍然不是一个伟大的情况,因为它可以混淆挫折感的你。此外,“只会影响你”也许是夸张或“善意的谎言”,因为当你使用git push
,有很多的选择:
你可以git push origin mybranch:newbranch
。这告诉你的git查找名称mybranch
(用通常的解决方法,在Magnus Bäck's answer中获取提交F
),然后联系origin
并要求它更新或甚至在其一侧创建名为newbranch
的分支。
您可以git push origin mybranch
。这会告诉你的git像往常一样查找名称mybranch
,但是请联系origin
并要求它更新或创建一个名为mybranch
的分支,该分支(如前所述)不会快进,并且会被拒绝。
您可以git push
或git push origin
,它会查找您的push.default
设置。 如果设置为current
,matching
或simple
,git确实希望您的名字与远程名称相匹配。如果它设置为nothing
,git要求您每次提供“其他方名称”。如果设置为upstream
,那么git使用“上游”名称,它不需要匹配本地名称。
因此,upstream
的push.default
设置几乎意味着这种情况:不一定是暧昧的名字,但如果你的名字,mybranch
,从名称不同的遥控器上的任何情况下,newbranch
。
(还有什么用git fetch
发生的问题。见下文脚注3.额外信息)
由于历史的原因,或者只是被讨厌的git checkout
命令解析分支名称用不同的规则。我实际上并不知道为什么,但至少在可预见的将来,我们会坚持下去。
设置设置/更改/检查git config
。 push
命令还检查remote.origin.push
,如果设置的话,甚至branch.mybranch.pushremote
,如果那的设置。如果你配置了很多配置设置,这会非常混乱!假设您不要将自己设置为怪异的角落。
“上游”通过组合branch.name.remote
和branch.name.merge
找到。例如,您可以将branch.mybranch.remote
设置为origin
和branch.mybranch.merge
至newbranch
。那么mybranch
的“上游”名称是origin/newbranch
。因此,push.default
的upstream
设置让git push
自动解决,mybranch
推到newbranch
在远程origin
。这个相同的“上游”配置自动与git fetch
一起工作。
因为涉及到两个实体,所以当git fetch
超过origin
的分支名称时,需要将它们从您自己的分支名称中分离出来。这样做的方式是从远程仓库获取所有分支名称,然后在它们前面插入文本:分支master
在远程origin
上成为本地参考名称refs/remotes/origin/master
。您的分行进入refs/heads/name
; 他们的分支进入refs/remotes/origin/name
;并且这两个名称空间保证不会相互碰撞,因为heads/
和remotes/
是不同的。
有一个配置条目 - 不要改变这个特定的一个,除非你知道你在做什么;它真的只是在那里,使镜子可以工作不同 - 说:
remote.origin.fetch = +refs/heads/*:refs/remotes/origin/*
这样做。这就是上的mybranch
首先变为origin/mybranch
,并且当您输入名称origin/mybranch
(同样是因为gitrevisions中的规则),该规则将翻译成完整的,从不含糊的名称refs/remotes/origin/mybranch
,然后名称为期望的提交。
你有没有试过将分支推送到远程? – Miller