2011-11-10 229 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,這是我試過 - 沒有工作。 –