删除所有本地git分支

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

随着时间的推移,由于懒惰或健忘,我最终会得到一个很大的本地分支列表,其中一些(如spike)可能还没有合并。

我知道如何列出我所有的本地分支,我知道如何删除一个分支,但我想知道是否有一个git命令,允许我删除我所有的本地分支?

下面是git branch --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
430125 次浏览

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

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

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

'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 branch编写脚本。要避免使用,可以使用如下语句:

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

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

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

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

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

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

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

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

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

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

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

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

希望这能帮助到一些人。

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

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

就是这样。

我找到了一个更好的方法:

git branch --merged master --no-color | grep -v "master\|stable\|main" | xargs git branch -d

编辑:添加无颜色选项和排除稳定分支(添加其他分支需要在你的情况下)

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

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

非常有用!

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

  1. git branch是一个瓷器命令。瓷器命令不是为机器解析而设计的,并且输出可能在不同版本的Git之间发生变化。
  2. 有一些用户配置选项可以改变git的输出 Branch 使其难以解析(例如,着色)。如果用户设置了color.branch,那么您将在输出中得到控制代码,如果您试图将它输送到另一个命令中,这将导致error: branch 'foo' not found.。你可以通过--no-color标志到git branch来绕过它,但谁知道其他用户配置可能会破坏它呢
  3. git branch可能会做一些解析起来很麻烦的事情,比如 在当前签出的分支
  4. 旁边加一个星号

git的维护者这样说关于围绕git branch输出编写脚本

要找出当前分支是什么,随意/粗心的用户可能有 围绕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

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

根据这个问题中的其他答案,我最终为自己编写了一个快速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 --merged | grep -E "(feature|bugfix|hotfix)/" | xargs git branch -D && git remote prune origin

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

适用于Git 1.9.5。

我写了一个shell脚本,以删除除develop之外的所有本地分支

branches=$(git branch | tr -d " *")
output=""
for branch in $branches
do
if [[ $branch != "develop" ]]; then
output="$output $branch"
fi
done
git branch -d $output

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

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

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

从UI转到你想删除的分支Branch——>删除Ctrl +单击,这样它们就会突出显示。如果你想确保它们被合并到一个分支中(比如dev),在仅在合并时删除下将本地分支设置为dev。否则,将其设置为总是以忽略此检查。

GitUI: delete local branches

下面的命令将删除除主分支以外的所有本地分支。

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

上面的命令

  1. 列出所有分支
  2. 从列表中忽略主分支,并获取其余分支
  3. 删除分支

以上答案很好。这是另一种方法,当我们在本地回购中有很多分支时,我们必须删除许多分支,除了少数位于本地机器中的分支。

首先git branch将列出所有本地分支。

使用unix命令将分支名称的列转换为文件中的单行
git branch > sample.txt
这将保存在sample.txt文件中。 和运行
# EYZ0
命令。这将把列转换为行,并在单行中复制分支名称列表

然后运行
git branch -D branch_name(s)
该命令将删除local中列出的所有分支

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

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

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

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

删除所有Linux中的本地分支除外的一个你是

// hard delete


git branch -D $(git branch)

对于powershell,这将工作:

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

为此,您可以使用git-extras

$ git delete-merged-branches
Deleted feature/themes (was c029ab3).
Deleted feature/live_preview (was a81b002).
Deleted feature/dashboard (was 923befa).

试试下面的shell命令:

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

解释:

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

我没有grep或其他unix在我的盒子上,但这从VSCode的终端工作:

# EYZ0

我使用小写的d,这样它就不会删除未合并的分支。

当我这样做时,我也在master上,所以* master不存在,所以它没有尝试删除master。

git branch -d [branch name]表示本地删除

git branch -D [branch name]也用于本地删除,但强制删除

如果你想保持主,开发和所有远程分支。删除所有不在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 -D `git branch`

注意:这将删除除当前签出的分支之外的所有分支

如果你使用NodeJS,我写了这个命令:

npx git-clear-branch

该命令清除除master和当前分支之外的所有本地分支。

我建议一个更温和的答案。这里的许多答案使用-D,无论更改是否合并,它都是强制删除的。这里有一行代码,它不影响那些没有合并变更的分支。

git branch --merged | egrep -v "(^\*|master|dev)" | xargs git branch -d

或者您可以尝试列出的其他示例,但只需将-D更改为-d。我知道OP问如何删除,但在大多数情况下,使用-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()
}

同时删除多个本地分支

# 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

Source .

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

但删去分支又何妨;如果它是一个小型存储库,只需删除工作区并重新克隆它!!

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

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

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

git checkout master

第二(确保你在master上)

git branch -D $(git branch)

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

git branch -D $(git branch).Trim()
git branch | grep release-1.4 | xargs -n 1 -I % sh -c 'git branch -D %'

删除所有名称与模式“release-1.4*”匹配的分支的简单方法。我还定期使用它与票据前缀一起删除所有本地工作分支,但不打扰管道分支。