[英]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
。 那可能是最有可能的,因此是您的意思。 但是,它不是(还吗?)。
这实际上对我来说很好。 您使用的是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.