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

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

当前回答

从Windows命令行删除除当前签出的分支以外的所有分支:

for /f "tokens=*" %f in ('git branch ^| find /v "*"') do git branch -D %f

其他回答

删除所有分支,但保留“develop”和“master”等其他分支的更简单的方法如下:

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

非常有用!

对于powershell,这将工作:

git branch --format '%(refname:lstrip=2)' --merged `
    | Where-Object { $_ -ne 'master' } `
    | ForEach-Object { git branch -d $_ }

删除所有本地git分支,但保留主

git branch | grep -v "main" | xargs git branch -D 

不建议解析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

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

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 }'`

希望这能帮助到一些人。