¿Por qué "git push origin @" no funciona?

Podemos empujar la cabeza de una twig como a continuación

$ git push origin HEAD 

Y, podemos usar @ para alias de HEAD .

 $ git show @ 

Entonces, ¿por qué el siguiente command me da un error?

 $ git push origin @ fatal: remote part of refspec is not a valid name in @ 

Aunque @ se puede usar para especificar HEAD , primero necesita @ para analizarse como una reference. La syntax para git push toma un refspec, y en ese context, @ tiene dos significados diferentes, de los cuales solo uno es ref.

La syntax para un refspec en git push es [+]<src>[:<dst>] . + es opcional. :<dst> es opcional si se puede resolver desde <src> .

git push origin HEAD funciona, porque HEAD se trata como un caso muy especial: HEAD es normalmente una reference simbólica a una twig específica, y git push resuelve references simbólicas y selecciona <dst> function del nombre de la twig apuntada.

También puede tener, por ejemplo, git symbolic-ref MYMASTER refs/heads/master , seguido de git push origin MYMASTER .

git push origin HEAD~0 falla, porque se traduce en git push origin HEAD~0:HEAD~0 , y un renombre remoto HEAD~0 no es válido, aunque HEAD~0 necesariamente siempre especificará la misma confirmación que HEAD .

git push origin @ falla, porque se traduce a git push origin @:@ , y una reference remota @ no es válida, aunque @ necesariamente siempre especificará la misma confirmación que HEAD .

git push origin @:HEAD casi funcionaría, si tienes una twig remota llamada HEAD . Este no es el caso especial donde el refspec es simplemente HEAD , por lo que esto no resuelve HEAD function de cualquier reference simbólica.

git push origin @:master funciona.