繁体   English   中英

为什么从分离的HEAD创建新的远程分支的git push语法如此不同?

[英]Why is the git push syntax for creating a new remote branch from a detached HEAD so different?

最近,我遇到了一个处于分离HEAD状态的情况。 我想把它推到github上,以便与队友共享一些正在进行的代码。 对于此特定的提交,我不需要本地分支名称。

显然,这是行不通的:

git push sandy-github HEAD

这很有意义,因为我没有为远程分支指定名称。

但是我不明白为什么这行不通:

git push sandy-github HEAD:mynewbranch

这导致以下错误:

错误:无法推送到不合格的目标:mynewbranch目标refspec既不与远程服务器上的现有ref匹配,也不以refs /开头,并且我们无法基于源ref猜测前缀。 错误:无法将一些引用推送到'git@github.com:sandyarmstrong / myreponame.git'

我最终不得不做:

git push sandy-github HEAD:refs/heads/mynewbranch

这工作了。 从文档:

git push origin master:refs / heads / experimental

通过复制当前的主分支,在原始存储库中创建实验分支。 仅当本地名称和远程名称不同时,才需要使用此表单在远程存储库中创建新的分支或标记。 否则,引用名称本身将起作用。

我只是不明白为什么这是必要的。 我猜这里有些关于git的重要误解。 为什么仅因为名称不匹配而需要这种更复杂的语法? 为什么HEAD:mynewbranch语法不足以让git知道它应该在名为“ mynewbranch”的远程对象上生成一个新分支?

git push文档refspec部分具有以下内容(强调我的意思):

<dst>告知通过此推送更新远程端的哪个引用。 此处不能使用任意表达式,必须命名实际引用。 如果省略:<dst> ,将更新与<src>相同的引用。

在正常状态下,git可以基于分支跟踪和/或config中push.default值来确定要推送到某个分支(或标签)。

在分离的HEAD状态下,git无法猜测您是要创建新的分支还是要创建新的标签(在这里两者都合理)。

可能暗示通过首先创建本地分支来创建分支:

git checkout -b mynewbranch
git push -u sandy-github mynewbranch

如果您不想签出要推送的分支,可以使用在问题中提到的refs/heads/前缀:

git push sandy-github HEAD:refs/heads/mynewbranch

在许多命令中,Git都有相当数量的“魔术”或“ DWIM” *。 “推”具有这样的功能:如果将本地分支b推到远程,而远程具有b ,则它将使用magic / DWIM部分将本地ref(其“真实”名称为refs/heads/b )与远程进行协调。一个(其遥控器上的名称也为refs/heads/b )。 但是您也可以推送refs/tags/t ,或者现在已有注释, refs/notes/commits

它也已经有了magic / DWIM来认识到,当您使用y:y时,解析为本地全名refs/x/y的本地ref y应该在远程上创建相同的refs/x/y y:y ,即使y确实遥控器上不存在。 只是,如果本地全名不能解析为此类内容,则此操作将失败。 当它是分支的符号名时,它甚至可以解析HEAD,但是当HEAD被“分离”时,就没有符号名。

可以假设git push HEAD:foo意味着创建refs/heads/foo 那可能是最有可能的,因此是您的意思。 但是,它不是(还吗?)。

* DWIM:“按我的意思做”(与我说的相反)

这实际上对我来说很好。 您使用的是git的旧版本吗?

作为参考,我运行了以下命令:

MacBook:AndroidAsync[master*]$ git commit -a -m gitignore
[master 69851e1] gitignore
 1 file changed, 1 insertion(+)
MacBook:AndroidAsync[master]$ git push origin HEAD:master
Counting objects: 5, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 343 bytes, done.
Total 3 (delta 1), reused 0 (delta 0)
To ssh://git@github.com/koush/AndroidAsync
   04b2f79..69851e1  HEAD -> master

版:

MacBook:AndroidAsync[master]$ git --version
git version 1.8.2.1 (Apple Git-45)

还确认可以从独立的HEAD工作:

MacBook:AndroidAsync[(no branch)]$ git push origin HEAD:master
Counting objects: 5, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 332 bytes, done.
Total 3 (delta 1), reused 1 (delta 0)
To ssh://git@github.com/koush/AndroidAsync
   69851e1..ae2d1be  HEAD -> master

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM