Git prune并未删除我的本地分支机构

时间:2019-03-01 19:50:46

标签: git github

我在Github.com上删除了一堆合并的分支,进行了git pull,所有分支仍在显示。

因此,我跑了。

git remote prune origin

它表明在输出中修剪了分支。

但是,我运行时会显示所有已删除的分支

git branch

我认为我做了一些与预期不同的事情?我做了什么如何从本地删除已经从GitHub删除的分支?

在此帖子中: git remote prune origin does not delete the local branch even if its upstream remote branch is deleted

它提到了相同的问题,但是我不明白他们的意思,当他们说它从本地删除过时的远程分支时。

2 个答案:

答案 0 :(得分:1)

不应该删除它们。

您的本地分支(实际上应简称为“您的分支”)是您的。在这种情况下,只有您的远程跟踪名称 origin/*不是您的。 1 因此,如果origin的分支名为{{1} },但不再适用,xyzzygit fetch --prune origin会删除您的git remote prune origin来匹配origin/xyzzy缺乏origin

它不会触摸您的分支,而这些分支是您的。如果您确定他们现在可以使用,则必须自己删除它们。人们已经编写了脚本来做到这一点,但是这些脚本往往很愚蠢:即使您做出承诺,在合并之前忘记了推送,或者打算搬到另一个分支,他们也​​会经常删除您的xyzzy em>,一旦您的xyzzy被删除,通常为时已晚。因此,请谨慎使用此类脚本。

(对这些命令有一个选项可以告诉他们:如果我有一个本地分支xyzzy指向与xyzzy相同的提交,并且删除origin/xyzzy,也删除我的本地origin/xyzzy。此外,如果我有xyzzy,但xyzzy与我的origin/xyzzy 不匹配,抱怨并停下来,这样我就可以弄清楚该怎么办。但是他们没有这种选择。)


1 从技术上讲,这些也是您的。只是您的Git已设置好,以便当您的Git调用其Git(位于xyzzy的Git)并从中获取分支名称和哈希ID时,您的Git 会覆盖您自己的{ {1}}及其更新的origin。因此,尽管origin/master是Git存储库的“名称到哈希ID”数据库中的名称,但它通常不是您自己可以控制的名称。您只需让自己的Git镜像他们的Git,使他们的master成为您的origin/master

或者,简而言之:您的Git的master是Git记住其Git的origin/master的方式。因此,这是他们的种类

答案 1 :(得分:0)

就像torek所说的那样,第一个关键点是修剪远程跟踪分支,以确保您要与最新的参考文献列表进行比较。您可以使用

git fetch --prune

然后用:

定位本地“剩余”分支
 git for-each-ref --format='%(if)%(upstream:short)%(then)%(else)%(color:bold red)%(end)%(refname:short)' refs/heads

(它们在输出中将显示为红色)

或者(假设您的遥控器名为origin):

git branch -vv | grep -v origin/

...并且最后一个阶段是使用

手动删除
git branch -d <branch>

由于它们显示得很方便,因此您不应遭受多次复制/粘贴的痛苦。如果过时的分支数量通常是庞大的,或者说足够重要,那么也许可以在工作流中进行某些设置以避免重复出现的情况?