为什么“git push origin @”无法工作?

7
我们可以像下面这样推送一个分支的头部。
$ git push origin HEAD

我们可以使用@作为HEAD的别名。

$ git show @

那么为什么下面的命令会给我一个错误?
$ git push origin @
fatal: remote part of refspec is not a valid name in @

我猜是因为“@”符号映射到一个提交而不是Head,所以无法确定远程名称。“git push origin @:master”应该可以解决。 - eckes
1
@eckes,'@'应该被替换为HEAD:https://github.com/git/git/commit/9ba89f484e023827eca6ad44baf69af37dac4db3#diff-0e5e84388b3fb1c5edbec053379fbf1eR1025 - VonC
@sangdol,你尝试的是哪个Git版本?1.8.5 RelNotes 中记录了一些“修复”信息。 - eckes
@VonC 哦,好的,我从来没有用过那个命令 (我认为 git push origin HEAD 等同于 git push origin,只要设置了 push.default=simple,所以不需要 @ 符号。 - eckes
@eckes жҲ‘е°қиҜ•иҝҮ1.8.5.4пјҢдҪҶеңЁ2.0.4дёҠд»Қж— ж•ҲгҖӮиҖҢдё”пјҢеңЁpush.default=simpleдёӢд№ҹж— жі•дҪҝз”Ёgit push originгҖӮ - Sanghyun Lee
1个回答

9
尽管可以使用@来指定HEAD,但首先需要将@解析为引用。在git push的语法中,需要一个refspec,在这个上下文中,@有两个不同的含义,只有其中一个是引用。
git push中refspe的语法为[+]<src>[:<dst>],其中+是可选的,如果可以从<src>中解析出:<dst>则它也是可选的。 git push origin HEAD有效,因为HEAD被视为非常特殊的情况: HEAD通常是指向特定分支的符号引用,并且git push会解析符号引用并根据所指向的分支名称选择<dst>
你也可以执行以下操作:git symbolic-ref MYMASTER refs/heads/master,然后执行git push origin MYMASTERgit push origin HEAD~0无效,因为它转换为git push origin HEAD~0:HEAD~0,而远程refname HEAD~0无效,即使HEAD~0必然总是指向与HEAD完全相同的提交。 git push origin @无效,因为它转换为git push origin @:@,而远程refname @无效,即使@必然总是指向与HEAD完全相同的提交。 git push origin @:HEAD几乎有效,如果你有一个名为HEAD的远程分支。这不是仅仅指定为HEAD的特殊情况,因此这不会根据任何符号引用解析出HEADgit push origin @:master有效。

感谢您的好解释。如果git在push@转换为@:@之前将@转换为HEAD,那会怎样呢?这不可行吗? - Sanghyun Lee
@Sangdol 当然可以。如果所有的方法都失败了,它总是可以作为一个特殊情况添加的。那样就会与其他命令不一致,比如 git symbolic-ref @,在那里它也不起作用(让它起作用也没有多大意义)。当然,让它对 git push 起作用并没有太多好处:大多数人根本不会输入任何 refspec。所以我怀疑,如果考虑到了这一点,那么它被认为是不必要的。 - user743382

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接