2011-09-05 43 views
58

我想爲什麼Git的命令使用爲什麼Git的使用冒號(:<branch>)刪除遠程分支

git push <remote> :<branch>git push origin :featureA在遠程服務器中刪除featureA分支。我很感興趣,爲什麼把冒號作爲刪除標誌。它是如此的

git branch -d <localbranch>

差異爲何不做類似

git branch -d --remote origin <branchname>

或有冒號,我從未知道的深層含義?

+3

對於刪除遠程分支,現在有一個更漂亮的語法['git push origin --delete foobar'](http://git-scm.com/book/ch3-5.html#Deleting-Remote-Branches) – quetzalcoatl

回答

61

它不是的:本身的含義,但什麼是存在,或之前它,而缺席。

操作的Refspec格式

<+><source>:<destination> 

(可選+非快進)

所以,當你這樣做git push origin :featureA,你指定一個空源裁判,基本上使得目的地「空「或刪除它。

PS:請注意,:或沒有操作的Refspec並不意味着推沒什麼沒什麼但是。它使git推送「匹配」分支:對於本地存在的每個分支,如果遠程端已存在相同名稱的分支,則更新遠程端。

+2

GIT中> = 1.7.0加入'GIT中推原點-d '刪除和'GIT中推原點-D '強制刪除遠程分支。 – robsn

18

冒號是不是「刪除標誌」。請注意,git pushgit pull都接受零個或多個refspecs作爲它們的最終參數。現在read about refspecs。冒號在refspec中將源和目標分開。該命令git push origin :foo有一個空的來源和本質上說,「推沒什麼原籍支富」,或者,換句話說,「就起源不存在分支富」。

+0

國際海事組織,你的回答並沒有回答這個問題,原因如下:如果我試圖推動一個歷史分歧的分支,我需要強制推動分支。但是,使用':foo'刪除分支時情況並非如此。一個空的分支不會與現有的遠程分支共享歷史記錄,因此它不能以我看到的方式覆蓋現有的具有空分支的遠程分支。你的答案有些不對勁。 – Umang

+3

@Umang:afaik,這只是一個概念性的東西,我沒有說「推空分支」。我說「一無所有」。我不同意你的評價,在它前面加一個「+」會更有意義,但這只是它的工作原理。查看我發佈的refspecs鏈接的[上一節](http://progit.org/book/ch9-5.html#deleting_references),然後決定是否信任作者。 –

+0

我想我現在明白了一點。謝謝! – Umang