Git:如何从“无分支”推送到新的远程分支?

时间:2011-11-10 16:26:29

标签: git branch push remote-branch

我做了:

git co upstream/master  # To no branch.
<then did a trivial edit on some file...>
git commit -a -m "Trivial edit"
git push origin NewBranch

但得到了这个:

$ git push origin ignore-netbeans-config
error: src refspec ignore-netbeans-config does not match any.

我可以在不创建本地分支的情况下推送到新分支吗?

2 个答案:

答案 0 :(得分:11)

git push origin HEAD:refs/heads/ignore-netbeans-config

答案 1 :(得分:10)

让我们首先澄清一些小细节:

  1. 分支是refs/heads命名空间下的“ref”。只需ls .git/refs/headscat个文件即可查看我的意思。
  2. 标签是refs/tags命名空间下的“ref”。只需.git/refs/tags即可自行查看。
  3. HEAD只是另一个“参考”,但它的特殊之处在于它可以是“象征性的”。只需cat .git/HEAD,看看它的内容。
  4. push操作对“ref”进行操作,默认的“mapping”保留命名空间。这意味着当我推动分支时,它将显示为遥控器上的分支;当我按下标签时,它会在遥控器上显示为标签。请考虑以下情况:

    1. 我想推送标签moo并使其显示为远程服务器上的分支(是的,我实际上是将标签“转换”为分支)。我就是这样做的:

      git push origin moo:refs/heads/moo

    2. Git需要一种方法来区分快进和非ff推送,这样人们就不会错误地覆盖别人的工作。假设我想推送分支masternextpu,其中只有pu是非ff。我就是这样做的(请注意,当您使用+时必须提供显式映射):

      git push origin master next +pu:pu

    3. 现在,让我们回答您的问题。您希望推送HEAD,使其显示在远程的refs/heads命名空间中,作为名为“ignore-netbeans-config”的分支。如果此分支之前不存在,或者您正在覆盖其中的某些提交(即非ff推送),请使用+。否则,不要。最终结果:

      git push origin +HEAD:refs/heads/ignore-netbeans-config

    4. TL; DR版本:git push origin +HEAD:refs/heads/ignore-netbeans-config