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

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

当前回答

试试下面的shell命令:

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

解释:

通过git branch | grep -v "master"命令获取所有分支(除了master) 使用xargs命令选择每个分支 用xargs git branch -D删除分支

其他回答

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

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

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

要删除除当前已签出的分支之外的所有分支:

for b in `git branch --merged | grep -v \*`; do git branch -D $b; done

我建议在前几次将git branch -D $b更改为echo $b,以确保它删除了你想要的分支。

下面是适用于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()
}

下面的脚本删除分支。使用和修改的风险由你自己承担,等等。

根据这个问题中的其他答案,我最终为自己编写了一个快速bash脚本。我称它为“gitbd”(git branch -D),但如果你使用它,你可以将它重命名为任何你想要的。

gitbd() {
if [ $# -le 1 ]
  then
    local branches_to_delete=`git for-each-ref --format '%(refname:short)' refs/heads/ | grep "$1"`
    printf "Matching branches:\n\n$branches_to_delete\n\nDelete? [Y/n] "
    read -n 1 -r # Immediately continue after getting 1 keypress
    echo # Move to a new line
    if [[ ! $REPLY == 'N' && ! $REPLY == 'n' ]]
      then
        echo $branches_to_delete | xargs git branch -D
    fi
else
  echo "This command takes one arg (match pattern) or no args (match all)"
fi
}

它将提供删除任何匹配模式参数的分支(如果传入),或者在不带参数的情况下调用所有本地分支。它还会给你一个确认步骤,因为我们在删除东西,这很好。

这有点愚蠢——如果没有与模式匹配的分支,它就不会意识到这一点。

一个示例输出运行:

$ gitbd test
Matching branches:

dummy+test1
dummy+test2
dummy+test3

Delete? [Y/n] 

'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).