10

最近我有一个场景,我处于分离的 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”的远程上生成一个新分支?

4

3 回答 3

8

文档refspec一部分有这个(强调我的):git push

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

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

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

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

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

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

git push sandy-github HEAD:refs/heads/mynewbranch
于 2013-09-16T23:54:10.800 回答
1

Git 在许多命令中都有相当多的“魔术”或“DWIM”*。“推送”有这个:如果你将本地分支推b送到远程并且远程有一个b,它使用魔法/DWIM 部分来协调本地引用(其“真实”名称refs/heads/b是远程,也是refs/heads/b)。但是你也可以推refs/tags/t,或者现在笔记存在,refs/notes/commits

它还具有 magic/DWIM 来实现y解析为本地全名的本地 ref 应该在您使用时在远程上refs/x/y创建相同的,即使远程上不存在。只是如果本地全名不能解析为这样的东西,这将失败。它甚至可以在 HEAD 是分支的符号名称时解析,但是当 HEAD 被“分离”时,没有符号名称。refs/x/yy:yy

可以假设git push HEAD:foo“意味着”创建refs/heads/foo. 这可能是最有可能的,这就是你的意思。但是,它没有(还没有?)。

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

于 2013-09-16T23:49:05.157 回答
-1

这对我来说实际上很好。你使用的是旧版本的 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
于 2013-09-16T23:49:38.683 回答