我能否删除除当前分支以外的所有本地分支?

165

我想删除在输出中列出的所有分支...

$ git branch

...但保留当前分支,只需一步。这是否可能?如果是,怎么做?


3
可能是删除所有本地 git 分支的重复问题。 - Andrew C
可能是重复的问题:如何删除所有已合并的git分支? - Giulio Caccin
19个回答

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

将删除除主分支外的所有分支(将主分支替换为您想要保留的分支,但这样会删除主分支)


41
如果您想保留当前分支,请使用 grep -v ^* - Schwern
2
很多来源都给我这个脚本,但每次运行它都告诉我找不到分支 :( - tucq88
1
这不准确,例如它不会删除名为 master-copy 的分支。 - mvallebr
2
根据需要调整正则表达式,例如 grep -v "^ *master$" - Brad Koch
17
如果你想保留两个分支,请使用grep -v "master\|my-other-branch" - Derek Soike
显示剩余4条评论

144

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

git checkout master

第二步(确保你在主分支上):

git branch -D $(git branch)

如果您使用的是PowerShell,请使用以下命令:

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

9
非常快速简单。为什么这个没有被赞同? - princebillyGK
1
这对我来说是最简单和最好的答案。 - Saleh Enam Shohag
24
如果您正在使用 PowerShell,请使用 git branch -D $(git branch).Trim()。此命令将删除当前分支,但要小心使用,因为它将永久丢失该分支上的未合并更改。 - Nato Boram
1
@saran3h 尝试使用 git branch -D \git branch`` - KhogaEslam
1
在Windows上运行得非常好! - Emrah Mehmedov
显示剩余2条评论

84

根据@pankijs的回答,我创建了两个git别名:

[alias]
    # Delete all local branches but master and the current one, only if they are fully merged with master.
    br-delete-useless = "!f(){\
        git branch | grep -v "master" | grep -v ^* | xargs git branch -d;\
    }; f"
    # Delete all local branches but master and the current one.
    br-delete-useless-force = "!f(){\
        git branch | grep -v "master" | grep -v ^* | xargs git branch -D;\
    }; f"

~/.gitconfig中添加:


如@torek所指出的:

请注意,小写的-d将不会删除尚未完全合并的分支(请参阅文档)。 使用-D将删除这样的分支,即使这导致提交被“丢失”; 要非常小心地使用此选项,因为它还会删除分支reflogs,所以通常的“从意外删除中恢复”操作也无法正常工作。

基本上,如果您不确定不会丢失任何重要内容,请永远不要使用-force版本。因为它将永久丢失


2
已删除分支的提交应该在一段时间内仍然存在于引用日志中。 - CaptRespect
确实,提交记录会保存在 reflog 中。但不包括分支本身。我不会试,但我猜你可以找到你的提交记录,但无法回到分支状态?我怀疑这点。可以使用 Cherry-pick 在已删除的分支中检索提交记录,但无法恢复分支本身。 - Vadorequest
1
@Vadorequest,您可以通过执行git branch branchname commitid来重新创建指向特定提交的分支。 - pqnet
@pqnet 我不知道那会重新创建该分支的所有历史记录,谢谢,这很有用! - Vadorequest
1
@Vadorequest 自从提交对象是不可变的(并且被索引为哈希值)以来,每次编辑都需要创建一个新对象(具有不同的哈希值)。 - pqnet

28

删除除了一个特定分支外的所有分支:

git branch | grep -v "branch name" | xargs git branch -D
删除除 developmaster 以外的所有本地分支。
git branch | grep -v "develop" | grep -v "master" | xargs git branch -D

23

对于 Windows 系统,在 Powershell 中使用:

git branch | %{ $_.Trim() } | ?{ $_ -ne 'master' } | %{ git branch -D $_ }

如果您在上述代码中遇到错误,可以尝试以下代码:
git branch -D  @(git branch | select-string -NotMatch "master" | Foreach {$_.Line.Trim()})

21

一步删除除当前分支外的所有分支:

git branch | grep -v $(git rev-parse --abbrev-ref HEAD) | xargs git branch -D

该命令用于在 Git 中删除除当前分支以外的所有分支。请确保在使用此命令之前,您已经切换到要保留的分支上。

13

git branch -d(或-D)允许使用多个分支名称,但是自动提供“除我现在所在的分支之外所有本地分支”有点棘手,需要至少写一点代码。

“最佳”(正式正确)方法是使用git for-each-ref获取分支名称:

git for-each-ref --format '%(refname:short)' refs/heads

但是要确定你在哪个分支上就更难了(如果你想编写一个花哨的脚本,那么 git symbolic-ref HEAD 是“正式正确”的方法)。

更方便的方法是使用 git branch,它会打印出你的本地分支名称,并在名称前加上两个空格或(对于当前分支)一个星号*。因此,运行一些命令来删除带有*版本的字符,你将得到用空格分隔的分支名称,然后可以将其传递给 git branch -d 命令:

git branch -d $(git branch | grep -v '^*')
或者:
git branch | grep -v '^*' | xargs git branch -d

请注意,小写字母-d不会删除"未完全合并"的分支(请参阅文档)。 使用-D将删除这些分支,即使这导致提交被“丢失”; 请非常小心使用此选项,因为它也会删除分支reflog,因此通常的“从意外删除中恢复”操作也无法正常工作。


如果你想删除已经合并的分支,应该使用 git branch -D $(git branch | grep -v '^*') - Pratik Singhal
@PratikSinghal:这将删除所有其他分支,而不仅仅是Git认为“已合并”的分支。这很少是一个好主意。我已经在我的答案中指出了这两个问题。 - torek

13

删除所有已合并的分支(除了当前分支-v‘*’):

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

我还为代码库的完全清理编写了以下命令:

alias git-clean="git branch  | grep -v '*' | grep -v 'master' | xargs git branch -D  && git reset --hard && git clean -d -x -f"

引自此处


1
这仅会删除已合并的分支。 - Pratik Singhal

7

删除本地所有已合并的分支:

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

删除除了 特定分支 之外的所有分支:

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

删除除了 developmaster 以外的所有本地分支。
git branch | grep -v "develop" | grep -v "master" | xargs git branch -D

6

我使用这个命令是因为它让我更有选择地决定不想删除的分支。下面的命令会删除除了 master 分支、develop 分支和当前分支以外的所有分支。

BRANCHES=$(git branch | egrep -v "(master|develop|\*)" | xargs git branch -D)
echo $BRANCHES

所以我把这个放在我的~/.zshrc文件中。
delete_branches() {
  BRANCHES=$(git branch | egrep -v "(master|develop|\*)" | xargs git branch -D)
  echo $BRANCHES
}

alias cleanup_branches=delete_branches

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接