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

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

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

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

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

其他回答

我发现使用文本编辑器和shell更容易。

在shell中输入git checkout <TAB>。将显示所有本地分支。 复制它们到文本编辑器,删除那些你需要保留。 用空格替换换行。(在SublimeText中,这非常简单。) 打开shell,输入git branch -D <PASTE THE BRANCHES NAMES HERE>。

就是这样。

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

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

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

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

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

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

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

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

git checkout master

第二(确保你在master上)

git branch -D $(git branch)

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

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