git push:什么时候创建dst?

JC.AlwaysWithBadNews

我不清楚在哪种情况下<dst>将创建或不创建遥控器假设源将要发送到远程,$git push origin localBranch:newRemoteBranch如果不存在newRemoteBranch中创建。但是,当我使用其中<src>任意提交的sha1哈希的语法时,似乎只有在推送之前存在远程分支的情况下,推送才会成功。除了被迫使用现有的ref以外,是否有一种方法可以从任意提交创建远程分支<src>

星期二

TL; DR版本

您需要这样的语法,以便他们的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 pushgit fetch涉及两个Git,并且两者都必须了解并同意这种事情。如果您在推送标签时将其标签变为分支,或者如果您从另一个Git获得标签但您的Git却在本地将其创建为分支,那将是很糟糕的。

当你运行git branchgit 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/masterGit也会指出这一点。

推送和获取使用参考规范

您已经知道您可以写作git push origin localBranch:newRemoteBranchGit将此东西称为refspec实际上,每一部分都是参考,这是整个难题的关键。src:dst

(refspec还具有可选的前导加号。如果在该位置,则表示--force,但仅针对推入或提取的这一实例,而不是每一对。使用--forcewithgit pushgit 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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

什么时候在git flow中创建release分支?

git在什么时候完成执行操作?

什么时候使用git子树?

什么时候缩小Git存储库?

什么时候应该使用语义版本控制和git flow创建新标签?

Git:Git什么时候执行垃圾收集?

什么时候2个补丁在git中被认为相等?

我什么时候需要拉入才能插入Git?

什么时候使用不同的git merge策略?

Git什么时候刷新远程分支机构列表?

git rebase什么时候会有冲突?

什么时候需要运行“ git pull --all”?

我什么时候应该使用git pull --rebase?

什么时候会发生git合并冲突

什么时候创建“实例”?

什么时候使用.git / info / exclude而不是.gitignore来排除文件?

什么时候应该在git命令中使用“远程/分支名称”与“远程分支名称”?

我们什么时候需要在git中使用--track命令

什么时候从Docker存储库中提取,何时从Git存储库中提取然后构建?

我什么时候应该做git pull以保持当前更改?

什么时候使用git branch --track(开始“观看上游”的意思)?

git的refs / remotes / origin什么时候填充分支文件?

git什么时候在合并提交消息中包括存储库URL?

什么时候将大型Git存储库分解为较小的存储库?

什么时候使用.git / info / exclude而不是〜/ .gitignore(core.excludesFile)来排除文件?

我什么时候应该在子进程上使用 Python-git

什么时候创建引发错误?

我什么时候创建服务类

什么时候应该创建新的类?