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

随着时间的推移,由于懒惰或健忘,我最终会得到一个很大的本地分支列表,其中一些(如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 GUI还没有被建议使用。

我99%的时间都使用命令行,但在这种情况下,它要么太慢(因此出现了最初的问题),要么在求助于一些冗长但巧妙的shell操作时,您不知道将要删除什么。

UI解决了这个问题,因为您可以快速检查您想要删除的分支,并提醒您想要保留的分支,而不必为每个分支键入命令。

从UI转到Branch -> Delete和Ctrl+单击你想删除的分支,使它们突出显示。如果你想确保它们被合并到一个分支中(例如dev),在“Delete Only If merged into”下将“Local branch”设置为“dev”。否则,将其设置为“Always”以忽略此检查。

我遇到过类似的情况,最近发现下面的命令很有用。

git branch -D `git branch | awk '{ if ($0 !~ /<Branch_You_Want_to_Keep>/) printf "%s", $0 }'`

如果您想保留多个分支,那么

git branch -D `git branch | awk '{ if ($0 !~ /<Branch_You_Want_to_Keep1>|<Branch_You_Want_to_Keep2>/) printf "%s", $0 }'`

希望这能帮助到一些人。

如果你想保持主,开发和所有远程分支。删除所有不在Github上的本地分支。

$ git fetch --prune

$ git branch | grep -v "origin" | grep -v "develop" | grep -v "master" | xargs git branch -D

1]它将删除远程库中不再使用的远程引用。

2]这将得到你所有分支的列表。从列表中删除包含master、develop或origin(远程分支)的分支。删除列表中的所有分支。

警告-这删除自己的本地分支以及。所以,当你合并了你的分支,并在合并后进行清理时,删除。

没有一个答案能完全满足我的需求,所以我们开始吧:

git branch --merged | grep -E "(feature|bugfix|hotfix)/" | xargs git branch -D && git remote prune origin

这将删除所有以feature/, bugfix/或hotfix/开头合并的本地分支。然后,上游远程源被修剪(您可能必须输入密码)。

适用于Git 1.9.5。

如果你不需要使用Git本身,你也可以手动或编程地删除. Git /refs/heads下的头。以下应该在Bash下进行最小的调整:

shopt -s extglob
rm -rf .git/refs/heads/!(master)

这将删除除主分支外的所有本地分支。由于上游分支存储在.git/refs/remotes下,因此它们将保持不变。

如果你不使用Bash,或者想一次递归很多Git存储库,你可以用GNU find做类似的事情:

find . \
    -path remotes -path logs -prune -o \
    -wholename \*.git/refs/heads/\* \! -name master -print0 |
xargs -0 rm -rf

find解决方案可能更容易移植,但是删除路径和文件名比较棘手,而且可能更容易出错。