在使用git branch -a
时,我看到我的repo包含很多分支,前面有'remotes / origin /',例如。遥控器/来源/特征/ Issue01
然后我看到回购也有几个相似/相同的命名,例如'remotes / origin / remotes / origin / feature / Issue01',在命名中加上'remotes / origin'。
虽然我知道我可以使用此命令git push origin :<name of the branch>
删除分支,但在这种情况下,如何判断我是否删除了正确的分支? (我想摆脱双遥控器/原点命名......
答案 0 :(得分:1)
这里有几个项目可能有点棘手。
首先,&#34;远程分支&#34; (如你在这里的问题标题)充其量是模棱两可的。您的意思是存储库中的远程跟踪分支名称,或者存储在遥控器上的Git存储库中的(常规,本地)分支名称吗?
其次,所有分支名称(本地和远程跟踪)都是Git的一般引用的特定形式。像master
或feature/Issue01
这样的本地分支名称实际上只是名称以refs/heads/
开头的引用:这两个名称分别是refs/heads/master
和refs/heads/feature/Issue01
的缩写。像origin/master
这样的远程跟踪分支名称只是全名refs/remotes/origin/master
的缩写形式。
它是refs/heads/
或refs/remotes/
部分的前缀 - 告诉Git该名称属于哪个组。一旦Git找到了组(本地分支名称,远程跟踪分支名称等),Git就会删除前缀,因此您只能看到master
和origin/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
之类的远程跟踪分支,但您不需要,也可能不应该打扰,因为:
以上所有内容都适用于处理您自己的存储库,但您在另一台计算机上也有另一个存储库。如果其他机器是您直接控制的机器,您只需登录:使用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 prune
或git 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
。