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

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

当前回答

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

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

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

适用于Git 1.9.5。

其他回答

'git branch -d'子命令可以删除多个分支。所以,简化@sblom的答案,但增加了一个关键的xargs:

git branch -D `git branch --merged | grep -v \* | xargs`

或者,进一步简化为:

git branch --merged | grep -v \* | xargs git branch -D 

重要的是,正如@AndrewC所指出的,不鼓励使用git分支来编写脚本。要避免使用,可以使用如下语句:

git for-each-ref --format '%(refname:short)' refs/heads | grep -v "master\|main" | xargs git branch -D

删除时要谨慎!

$ mkdir br
$ cd br; git init
Initialized empty Git repository in /Users/ebg/test/br/.git/
$ touch README; git add README; git commit -m 'First commit'
[master (root-commit) 1d738b5] First commit
 0 files changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 README
$ git branch Story-123-a
$ git branch Story-123-b
$ git branch Story-123-c
$ git branch --merged
  Story-123-a
  Story-123-b
  Story-123-c
* master
$ git branch --merged | grep -v \* | xargs
Story-123-a Story-123-b Story-123-c
$ git branch --merged | grep -v \* | xargs git branch -D
Deleted branch Story-123-a (was 1d738b5).
Deleted branch Story-123-b (was 1d738b5).
Deleted branch Story-123-c (was 1d738b5).

下面是适用于Windows机器的Powershell解决方案

git checkout master # by being on the master branch, you won't be able to delete it
foreach($branch in (git branch))
{
    git branch -D $branch.Trim()
}

不建议解析git分支的输出,这对于Stack Overflow的读者来说不是一个很好的答案。

git branch is what is known as a porcelain command. Porcelain commands are not designed to be machine parsed and the output may change between different versions of Git. There are user configuration options that change the output of git branch in a way that makes it difficult to parse (for instance, colorization). If a user has set color.branch then you will get control codes in the output, this will lead to error: branch 'foo' not found. if you attempt to pipe it into another command. You can bypass this with the --no-color flag to git branch, but who knows what other user configurations might break things. git branch may do other things that are annoying to parse, like put an asterisk next to the currently checked out branch

git的维护者对围绕git分支输出编写脚本有这样的看法

为了找出当前的分支是什么,随意/粗心的用户可能有 围绕git分支编写脚本,这是错误的。我们积极劝阻 反对使用任何瓷器命令,包括git分支,在 脚本,因为命令的输出可能更改为 帮助人类消费用例。

建议手动编辑. Git目录下的文件(如. Git /refs/heads)的答案同样有问题(refs可能在. Git / packs -refs中,或者Git可能在未来改变它们的内部布局)。

Git提供for-each-ref命令来检索分支列表。

Git 2.7。X将引入——merged选项,这样您就可以执行如下操作来查找并删除合并到HEAD中的所有分支

for mergedBranch in $(git for-each-ref --format '%(refname:short)' --merged HEAD refs/heads/)
do
    git branch -d ${mergedBranch}
done

Git 2.6。X和更老的版本,您将需要列出所有本地分支,然后分别测试它们,以查看它们是否已经合并(这将显著地慢一些,并且稍微复杂一些)。

for branch in $(git for-each-ref --format '%(refname:short)' refs/heads/)
do
    git merge-base --is-ancestor ${branch} HEAD && git branch -d ${branch}
done

首先(切换到你想要保留> ex: master的分支):

git checkout master

第二(确保你在master上)

git branch -D $(git branch)

如果您正在使用PowerShell,请使用

git branch -D $(git branch).Trim()

虽然这不是一个命令行解决方案,但我很惊讶Git GUI还没有被建议使用。

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

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

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