我不清楚在哪种情况下<dst>
将创建或不创建遥控器。假设源将要发送到远程,$git push origin localBranch:newRemoteBranch
如果不存在,将在newRemoteBranch中创建。但是,当我使用其中<src>
任意提交的sha1哈希的语法时,似乎只有在推送之前存在远程分支的情况下,推送才会成功。除了被迫使用现有的ref以外,是否有一种方法可以从任意提交创建远程分支<src>
?
您需要这样的语法,以便他们的Git知道您要创建新分支(毕竟,在他们的Git中,“他们的一面” ,这是一个普通分支)。git push hash:refs/heads/new-branch
我想我知道您要问的是什么,但是我不确定您应该如何表达这个问题。(特别是,如果您知道询问“ refspecs”,那么您可以找到答案,但是为什么您会询问这个问题?)
让我们尝试一个不同的问题,但让您考虑一下。假设您创建了一个标签 v0.9alpha
,然后运行:
git push origin v0.9alpha
(与比较典型git push origin master
的示例相比)。
Git如何知道您要推送标签而不是某些分支v0.9alpha
?还要记住,与git push
和git fetch
都涉及两个Git,并且两者都必须了解并同意这种事情。如果您在推送标签时将其标签变为分支,或者如果您从另一个Git获得标签但您的Git却在本地将其创建为分支,那将是很糟糕的。
当你运行git branch
或git tag
自己,这是很明显的Git是如何知道你的意思是其中之一:它是正确的,在该命令。但它在哪里的git push
还是git fetch
?不在那里...或者是吗?
这些事物的一般形式(这些人类可读的名称,这些分支,标记以及您可以用来引用某个提交或其他内容的任何其他名称)被称为引用,并且引用具有“全名”。任何分支的全名都以开头refs/heads/
,因此master
确实如此refs/heads/master
。任何标签的全名以开头refs/tags/
。任何远程跟踪分支的全名都以refs/remotes/
;开头。药粥origin
特别下手refs/remotes/origin/
。
Git在大多数情况下只会缩短全名。您输入的master
不是refs/heads/master
,而Git指出您的意思是您的分支 master
。您输入v0.9alpha
,然后Git找出您的意思是您的标签。您输入,origin/master
Git也会指出这一点。
您已经知道您可以写作git push origin localBranch:newRemoteBranch
。Git将此东西称为refspec。实际上,每一部分都是参考,这是整个难题的关键。src:dst
(refspec还具有可选的前导加号。如果在该位置,则表示--force
,但仅针对推入或提取的这一实例,而不是每一对。使用--force
withgit push
或git fetch
表示“在每个refspec上设置强制标志”。强制标志主要对分支名称有意义,尽管它也适用于其他引用。)
如果您只写:
git push origin xyz
您的Git会在您的存储库中查找以结尾的参考xyz
。(完整的搜索在gitrevisions文档中进行了描述;这是一个六步过程。)该搜索及其结果告诉Git什么样的引用xyz
是-可能是分支,也可能是标签。结果,您自己的Git现在知道您的意思是refs/heads/xyz
还是refs/tags/xyz
。
然后,您的Git在与另一个Git通话时使用相同的全名,这使得另一个Git创建或更新相同类型的引用。
但是当你写:
git push origin 91cb035:xyz
取而代之的是,您的Git不需要经过六步查找哈希值的过程91cb035
。因此,它尚不知道应该向其他Git发送什么样的参考。取而代之的是,它采用您的弱指定xyz
,并使用其他Git所要尝试的猜测您的意思是refs/heads/xyz
还是refs/tags/xyz
,或者xyz
完全是其他某个。
如果您的Git无法猜测而他们的Git无法帮助(因为两者都没有)xyz
,那么只有一个正确的答案:您的Git可以让您提供全名。您可以运行:
git push origin 91cb035:refs/heads/xyz
并且您的Git现在将知道应该向另一个Git发送全名refs/heads/xyz
。他们的Git会将其视为分支名称,因为它就是这个名称。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句