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

100
Git为什么会使用指纹(SHA-1哈希值)来标识内容?
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
2个回答

106

冒号 : 本身并不意味着什么,而是在它之前存在或缺失的内容起作用。

refspec 格式为

<+><source>:<destination>

(对于非快进模式的可选项 +)

当你执行像git push origin :featureA这样的操作时,你指定了一个空的源引用,基本上是使目标“空”或删除它。

PS:请注意,:或什么都没有的refspec并不意味着不推送任何内容。 它会让Git推送“匹配”的分支:对于每个在本地存在的分支,如果名称相同的分支已经存在于远程端,则会更新远程端。


6
Git >=1.7.0增加了git push origin -d <branch>用于删除某个远程分支,git push origin -D <branch>则可强制删除该分支。 - robsn
那么,什么情况下会在 : 前面加上一些东西呢? - ITIA
2
当您的本地分支与远程分支名称不同时,请使用@ITIA。 - listerreg

34

冒号并不是“删除标志”。请注意,git pushgit pull都接受一个或多个refspec作为它们的最后一个参数。现在阅读关于refspecs的内容。在refspec中,冒号将源和目标分开。命令git push origin :foo具有空源,基本上意味着“将没有东西推送到origin的分支foo”,换句话说,“使origin上的分支foo不存在”。


在我看来,你的回答并没有回答这个问题,因为如果我尝试推送一个历史分叉的分支,我需要强制推送该分支。然而,当使用:foo删除分支时,情况并非如此。空分支与现有远程分支不共享历史记录,因此我认为它无法用空分支覆盖现有的远程分支。你的回答感觉有些不对。 - Umang
3
据我所知,这只是一个概念性的事情,我没有说“推送一个空分支”,我说的是“不推送任何东西”。我不反对您的评估认为在它前面加上“+”会更合理,但这就是它的工作方式。请查看我发布的refspecs链接的最后一节,并决定是否信任作者。 - Ryan Stewart
我现在觉得我有点明白了。谢谢! - Umang

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接