删除远程分支

时间:2016-06-14 22:21:59

标签: git github

在使用git branch -a时,我看到我的repo包含很多分支,前面有'remotes / origin /',例如。遥控器/来源/特征/ Issue01

然后我看到回购也有几个相似/相同的命名,例如'remotes / origin / remotes / origin / feature / Issue01',在命名中加上'remotes / origin'。

虽然我知道我可以使用此命令git push origin :<name of the branch>删除分支,但在这种情况下,如何判断我是否删除了正确的分支? (我想摆脱双遥控器/原点命名......

1 个答案:

答案 0 :(得分:1)

这里有几个项目可能有点棘手。

首先,&#34;远程分支&#34; (如你在这里的问题标题)充其量是模棱两可的。您的意思是存储库中的远程跟踪分支名称,或者存储在遥控器上的Git存储库中的(常规,本地)分支名称吗?

其次,所有分支名称(本地和远程跟踪)都是Git的一般引用的特定形式。像masterfeature/Issue01这样的本地分支名称实际上只是名称以refs/heads/开头的引用:这两个名称分别是refs/heads/masterrefs/heads/feature/Issue01的缩写。像origin/master这样的远程跟踪分支名称只是全名refs/remotes/origin/master的缩写形式。

它是refs/heads/refs/remotes/部分的前缀 - 告诉Git该名称属于哪个。一旦Git找到了组(本地分支名称,远程跟踪分支名称等),Git就会删除前缀,因此您只能看到masterorigin/master。有时候Git只删除refs/部分,就像Git本身存储库副本上git branch -a的输出一样:

$ git branch -a
* master
  precious
  stash-exp
  remotes/origin/HEAD -> origin/master
  remotes/origin/maint
  remotes/origin/master
  remotes/origin/next
  remotes/origin/pu
  remotes/origin/todo

如果您设法创建令人困惑的名称,例如完整名称为refs/heads/origin/master的本地分支,则一切都变得非常混乱:origin/master这个本地分支,或者是它远程跟踪分支,其全名为refs/remotes/origin/master

如果您处于这种令人困惑的情况,请完全拼出所有内容。

如果您写refs/heads/origin/master,我们可以告诉您的意思是本地分支。

Git 使用全名只是有点困难。简单的方法是使用&#34;管道&#34;不试图缩写的命令。因此,您可以使用命令git for-each-ref。它自己运行,没有其他参数,它只是打印每个引用及其哈希值,目标对象类型和全名:

$ git for-each-ref
bbc61680168542cf6fd3ae637bde395c73b76f0f commit refs/heads/master
f247a4de65f24e5f924d097843894bf839d34ac6 commit refs/heads/precious
93df9a13560851eaa088f76d71a95a96c6902188 commit refs/heads/stash-exp
a28705da929ad746abcb34270947f738549d3246 commit refs/remotes/origin/HEAD
0b65a8dbdb38962e700ee16776a3042beb489060 commit refs/remotes/origin/maint
a28705da929ad746abcb34270947f738549d3246 commit refs/remotes/origin/master
6bd575154409f30ff65ca6ef24fc65deb942bab4 commit refs/remotes/origin/next
a83f22757e2811817565ce1064edcffb40eeb213 commit refs/remotes/origin/pu
2d30c169da9a8b402b36a0b24689330559ca8943 commit refs/remotes/origin/todo
d5aef6e4d58cfe1549adef5b436f3ace984e8c86 tag    refs/tags/gitgui-0.10.0
33682a5e98adfd8ba4ce0e21363c443bd273eb77 tag    refs/tags/gitgui-0.10.1
[lots more tags, snipped]

您可以删除 refs/heads/origin/master这样的本地分支git branch -d origin/master(添加-f--force,或使用-D,强行删除分支名称,即使它没有合并),或者你可以用git branch -m重命名它,并给它一个不那么令人困惑的名字。在所有这些情况下,省略refs/heads/,因为git branch已经知道这意味着(常规的,本地的)分支。

您甚至可以使用refs/remotes/origin/remotes/origin/feature/Issue01删除git branch -r -d之类的远程跟踪分支,但您不需要,也可能不应该打扰,因为:

处理远程Git

以上所有内容都适用于处理您自己的存储库,但您在另一台计算机上也有另一个存储库。如果其他机器是您直接控制的机器,您只需登录:使用ssh登录,cd到存储库的地方,并像处理自己的存储库一样处理。但是,如果你不能这样做呢?

当其他计算机在云计算中时,它通常是您无法控制的计算机,例如,您通过GitHub访问。在这种情况下,您可以使用某种类型的Web界面 - 但您也可以使用Git的标准机制来访问遥控器。

我们上面运行的git for-each-ref,看看我们有哪些分支,远程跟踪分支和标记,有一个对应的:git ls-remote origin联系您的远程名为origin并且基本上运行git for-each-ref那里。这可以让你看到他们拥有的东西。

一旦知道每个引用的全名,就可以使用上面引用的语法删除(但不是重命名)引用git push。例如,这个:

git push origin :refs/heads/remotes/origin/feature/Issue01

要求名为origin的远程数据库删除名为refs/heads/的本地分支(remotes/origin/feature/Issue01)。

您还可以拼写此git push origin --delete(或仅-d)。如果要删除大量引用,则输入更容易:

git push origin -d refs/heads/bad/name/one refs/heads/bad/name/two

同样,你可以完全拼写它们以消除歧义。

使用git remote prunegit fetch -p

refs/heads/remotes/origin/feature/Issue01存储库中删除(本地)分支origin后,您仍然必须从自己的存储库中删除远程跟踪分支refs/remotes/origin/remotes/origin/feature/Issue01。同样,您可以使用git branch -r -d,但有一种更简单的方法。

就像git fetch origin 在您的存储库中创建远程跟踪分支一样,根据git ls-remote origin中溢出的名称,git fetch origin --prune 删除< / em>远程跟踪来自存储库的分支,基于这些相同的名称。

也就是说,在完成相当于git ls-remote origin之后,你的 Git知道refs/heads/remotes/origin/feature/Issue01上现在没有origin。使用--prune,您可以告诉您的Git删除相应的远程跟踪分支。

在某些Git版本中,git fetch --prune origin略有缺陷,git remote prune origin有效。这个 应该做同样的事情,但如果git fetch --prune无效,请尝试git remote prune