我遵循一个开发过程,即为每个新功能或故事卡创建一个新的本地分支。完成后,我合并到主分支,然后推。

随着时间的推移,由于懒惰或健忘,我最终会得到一个很大的本地分支列表,其中一些(如spike)可能还没有合并。

我知道如何列出我所有的本地分支,我知道如何删除一个分支,但我想知道是否有一个git命令,允许我删除我所有的本地分支?

下面是git分支——merged命令的输出。

user@machine:~/projects/application[master]$ git branch --merged
  STORY-123-Short-Description
  STORY-456-Another-Description
  STORY-789-Blah-Blah
* master

所有尝试删除grep -v \*列出的分支(根据下面的答案)都会导致错误:

error: branch 'STORY-123-Short-Description' not found.
error: branch 'STORY-456-Another-Description' not found.
error: branch 'STORY-789-Blah-Blah' not found.

我用的是:

git 1.7.4.1  
ubuntu 10.04  
GNU bash, version 4.1.5(1)-release  
GNU grep 2.5.4  

当前回答

同时删除多个本地分支

# delete all local unmerged branches
git branch --no-merged | egrep -v "(^\*|master|dev)" | xargs git branch -D
# delete all local branches (merged and unmerged).
git branch | egrep -v "(^\*|master|dev)" | xargs git branch -D  

删除远程分支

# Deleting non-existent tracking branches
git remote prune <remote> --dry-run
# Deleting a single remote branch
git push <remote> --delete <branch>
# Deleting many remote branches at once
git branch -r --merged | egrep -v "(^\*|master|dev)" | sed 's/origin\///' | xargs -n 1 git push origin --delete

其他回答

根据这里的一些答案的组合-如果你想保留远程上存在的所有分支,但删除其余的,下面的联机程序将会做到这一点:

git for-each-ref --format '%(refname:short)' refs/heads | grep -Ev `git ls-remote --quiet --heads origin | awk '{print substr($2, 12)}'| paste -sd "|" -` | xargs git branch -D

我在github上关于这个问题的评论中找到了一个更好的方法:

git branch --merged master --no-color | grep -v "master\|stable\|main" | xargs git branch -d

编辑:添加无颜色选项和排除稳定分支(根据您的情况添加其他分支)

提醒一下,我会升级到git 1.7.10。你可能在这里得到的答案并不适用于你的版本。我的猜测是你必须在分支名称前加上refs/heads/。

注意,只有在复制了工作文件夹和.git目录后,才能继续执行以下操作。

我有时直接从。git/refs/heads中删除我不想要的分支。所有这些分支都是文本文件,包含它们所指向的提交的40个字符sha-1。如果你为其中任何一个设置了特定的跟踪,你的.git/配置中将会有多余的信息。您也可以手动删除这些条目。

我没有grep或其他unix在我的盒子上,但这从VSCode的终端工作:

Git branch -d $(Git branch).trim()

我使用小写的d,这样它就不会删除未合并的分支。

当我这样做的时候,我也在master上,所以* master不存在,所以它不会试图删除master。

如果你想删除所有的本地分支,下面是一个简单的命令:

git branch -D `git branch`

注意:这将删除除当前签出的分支之外的所有分支