我有一堆被删除的远程分支,现在我想在本地删除分支。我试过了:
git fetch -p
但它不起作用。
如果我这样做:
git branch -r
和
git branch
列表不一样,因为git branch
仍会列出已删除的远程分支,即使在我运行git fetch -p
之后也是如此。我已经看到这是在这里的很多问题中做到这一点的公认答案,但它对我不起作用。
我不确定我是否正确地说明了这个问题,所以这是另一种解释。说我有:
GitHub :(远程)
分支A
分支B
分支C本地:
分支A ==> (远程)分支A
分支B ==> (远程)分支B
分支C ==> (远程)分支C
现在有人在GitHub上删除了一个分支,给出了:
GitHub :(远程)
分支A
分支C
我希望我的本地仓库看起来像是:
本地:
分支A ==> (远程)分支A
分支C ==> (远程)分支C
答案 0 :(得分:11)
要展开hobbs' comment,git fetch -p
(或git remote prune
或任何类似命令),只会从您的存储库中删除遥控器上不再存在的每个“远程分支”。
如果你已经创建了一个本地分支,那么除非你手动删除它,否则该标签不会消失。
例如,假设在远程origin
上有一个名为sparkly
的分支:
$ git fetch
...
* [new branch] sparkly -> origin/sparkly
此时您没有名为sparkly
的分支(除非您已有分支!);您仅有origin/sparkly
(位于单独的名称空间refs/remotes/
而不是refs/heads/
)。
如果您之前创建了自己的名为sparkly
的分支,则可能无法跟踪此新origin/sparkly
。如果您现在创建自己的名为sparkly
的分支,它将跟踪origin/sparkly
。
但在这两种情况下,都不会自动删除它。你必须手动完成。
一个原因:不能保证只因为origin/sparkly
消失了,你就完成了它(“它”是你创建的本地分支,可能是也可能不是跟踪这个远程分支)。如果git删除了您的标签以及origin/
版本,那么您所处理的任何提交可能都很难找到。
所以,简短的回答是:你必须手动(或半手动,你可以随意自动化)。使用:
git branch -d sparkly
只有在“安全”(git认为:-))或者:
时才删除它git branch -D sparkly
即使git认为这是“不安全”也要删除它。
答案 1 :(得分:6)
要在本地“忘记”,删除你可以做的远程分支
git remote prune myRemote
(编辑以考虑评论)
现在,要删除您当地的分支机构,您也可以
remote=origin
for branch in $(git branch | sed 's/\*//'); do
if [ -z "$(git branch --all | grep $remote | grep $branch)" ]; then
git branch -D $branch
fi
done
如果您打算经常进行此类操作,可以将其放在PATH
的脚本中,将其命名为git-delete-local-to-sync
,然后在您的仓库中输入{{1} }