2011-11-10 178 views
9

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

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. 

我可以推到一个新的分支,而无需创建一个本地一个?

+0

问得好!当然,如果你可以在这里做进一步的编辑,你会想要继续创建一个分支来保证安全。 – Cascabel

回答

10

让我们澄清一些小细节第一:

  1. 一个分支是一个 “裁判” 的refs/heads命名空间下。只需ls .git/refs/headscat那里的文件来看看我的意思。
  2. 标记是refs/tags命名空间下的“ref”。只需ls .git/refs/tags即可亲眼看到。
  3. HEAD只是另一个“ref”,但它在特殊方面可以是“符号”。只需cat .git/HEAD,看看它说什么。

A push操作对“ref”进行操作,默认的“映射”保留名称空间。这意味着当我推送一个分支时,它将在远程显示为一个分支;当我推送标签时,它会在远程显示为标签。请考虑以下方案:

  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

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

+0

感谢您的解释! –

11

尝试

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

啊,那会起作用。 +1。 – manojlds

+0

您应该可以省略“refs/heads /”部分。 –

+0

@AdamDymitruk,这是我试过 - 没有工作。 –