为什么Git使用冒号(:<branch>)删除远程分支


81

为什么Git使用

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
quetzalcoatl 2015年

Answers:


91

它本身不是意义:,而是存在的东西,或者在它之前不存在的东西。

refspec格式为

<+><source>:<destination>

(可选+用于非快进)

因此,当您执行类似的操作时git push origin :featureA,您将指定一个空的源引用,并基本上将目标设置为“空”或将其删除。

PS:请注意,refspec为:or no并不意味着什么都不做。它使git推送“匹配的”分支:对于在本地存在的每个分支,如果在远端已经存在相同名称的分支,则对远端进行更新。


4
添加git push origin -d <branch>了Git> = 1.7.0以删除并git push origin -D <branch>强制删除远程分支。
robsn

那么什么时候您可以在:之前放一些东西呢?
ITIA

如果您的本地分支与远程分支的名称不同,则为@ITIA。
listerreg

20

冒号不是“删除标志”。注意git pushgit pull都接受零个或多个refspecs作为它们的最终参数。现在阅读有关refspec的信息。冒号在refspec中将源与目标分开。该命令git push origin :foo的源为空,本质上说“向源分支foo推送任何内容”,换句话说,“使源分支foo不存在”。


IMO,由于以下原因,您的答案未回答问题:如果我尝试推动历史分歧的分支,则需要强制推动该分支。但是,使用删除分支时不是这种情况:foo。空分支不会与现有远程分支共享历史记录,因此,按照我的看法,它无法用空分支覆盖现有远程分支。您的答案有误。
Umang 2011年

3
@Umang:afaik,这只是一个概念性的事情,我没有说“推空分支”。我说“不推”。我不同意您的评估,即在其前面加上“ +”会更有意义,但这就是它的工作原理。请参阅我发布的refspecs链接的最后一部分,并确定您是否信任作者。
瑞安·斯图尔特

我想我现在明白了一点。谢谢!
Umang 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.