我可以删除除当前分支以外的所有本地分支吗?

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

$ git branch

... 但保持目前的分行,一步到位。这可能吗? 如果可能,如何?

74876 次浏览
$ git branch | grep -v "master" | xargs git branch -D

将删除除 master 之外的所有分支(用您想保留的分支替换 master,但随后将删除 master)

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会删除这样的分支,即使这会导致提交变成“丢失”; 要非常小心地使用它,因为这也会删除分支的重新测试,这样通常的“从意外删除中恢复”功能也不会起作用。

根据@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 将删除这些分支机构,即使这会导致提交变成“丢失”; 小心使用,因为这也会删除分支重新测试,所以通常的“从意外删除中恢复”也不起作用。

基本上,永远不要使用 -force版本,如果你不是300% 确定你不会丢失任何重要的东西。因为它丢失了 永远

删除所有合并的分支(当前 -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"

取自 给你

恕我直言,移除当地分支机构最安全的方法是:

git branch -av | grep "\[gone\]" | awk '{print $1}' | xargs git branch -d

此外,更多有关这个主题的信息,你可以找到 删除所有本地 git 分支

我曾经为我的 Windows 环境创建了这个结构,也许它可以帮助其他人。 在执行期间,不删除主分支和当前分支。所有其他合并的分支都将被删除。

@echo off
cd PATH_TO_YOUR_REPO


REM -- Variable declerations
set "textFile=tempBranchInfo.txt"
set "branchToKeep=master"
set "branchToReplaceWith="
git branch --merged > %textFile%


REM -- remove "master" from list to keep the branch
for /f "delims=" %%i in ('type "%textFile%" ^& break ^> "%textFile%" ') do (
set "line=%%i"
setlocal enabledelayedexpansion
>>"%textFile%" echo(!line:%branchToKeep%=%branchToReplaceWith%!
endlocal
)


REM -- execute branch delete commands
for /f "delims=" %%a in (%textFile%) do (
git branch -D %%a
)


REM -- remove temp-file with branch information inside
DEL %textFile%


REM -- show local branches after the cleaning
echo Local branches:
git branch


pause
exit

对于 Windows,在 Powershell 使用:

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

删除除 特定分行以外的所有分支:

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

删除除 开发师父之外的所有本地分支

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

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

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

删除除 特定分行以外的所有分支:

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

删除除 开发师父之外的所有本地分支

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

假设 git branch显示以 *为前缀的当前分支; 使用 Powershell,下面的一行程序将删除所有不以 *开始的分支。

git branch | ? { $_ -lt "*" } | % { git branch -D $_.Trim() }

? = Where-Object

% = Foreach-Object

首先(切换到要保留的分支 > < em > ex : 师父) :

git checkout master

第二(使 当然你在 师父)

git branch -D $(git branch)

所以我在这里看到了很多硬编码的分支名称... ... 我认为我在这里的答案更准确地回答了问题的“当前分支”部分,同时保持它的单行和可读性,以抨击像我这样的新手。这个问题的答案显然也基于@pankijs 的回答。

git branch | grep -v $(git branch --show-current) | xargs git branch -d

而且我在 Debian 中的.bash _ aliases 中也有一个别名。

alias gitbclean='git branch | grep -v $(git branch --show-current) | xargs git branch -d'

(尽管我认为子命令需要启用一些 bash 特性才能在某些命令行上运行)

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

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

我使用它是因为我可以更有选择性地删除我不想删除的内容。下面的命令删除除主分支、开发分支和当前分支之外的所有分支。

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

以上所有中最简单的:

  1. 中使用-“ git Branch”命令获取所有分支的列表 你的项目文件夹
  2. 复制你得到的分支列表
  3. 从列表中删除“主人”和您想保留的那些
  4. 编写命令删除以“ & &”分隔的所有分支(参见 以下例子)
  5. 如果你想删除那些有 在下面的命令中使用“-D”代替“-d”。 “-D”强制删除分支

例如:

  • git branch -d branch1 && git branch -d branch2 && git branch -d branch3 && git branch -d branch4 && git branch -d branch5 && ...

这对我很有用,我发现它非常容易删除许多分支在一起,我也得到一个消息,每个分支得到删除和错误消息的那些分支未能得到删除。

假设您试图删除所有 除了主分支 还有当前的功能分支(让我们称之为‘ team/Features/dev-Branch-name’) ,我想将其浓缩为:

  1. 首先查看要删除的分支
  2. 那就删掉

查看树枝:

git branch | grep -v -Fx "$(git branch --show-current)\|master"

我看到一些答案建议 grep -v "develop" | grep -v "master",但这是一个 还有条件,即“给我所有的分支名称,没有“发展”在他们和那些,找到那些没有“主”在他们。就我个人而言,我正在寻找一个 或者条件。

注意避免意外删除 dev 分支: 虽然这看起来很棒(由于没有对分支名称进行硬编码) ,但要注意,当您在执行 delete 命令时,可能无法在正确的分支上签出。如果当前签出的分支是 master,那么上面将列出除 master 只有之外的所有分支,而您的意图是列出除 master 还有 dev 分支之外的所有分支。

因此,我认为最好把你想要保留的分支的名称写下来,这样做是万无一失的:

git branch | grep -v -Fx 'team/features/dev-branch-name\|master'

这样做的好处是不需要在特定的分支上签出就可以正确列出。

一旦您成功地看到了要删除的分支, 删除它们:

git branch | grep -v -Fx 'team/features/dev-branch-name\|master' | xargs git branch -D

以上仅适用于删除本地分支。 也可以删除远程分支(例如,在编辑/修剪克隆的回购文件时就需要这样做) ,使用:

git branch -r | grep -v -Fx 'team/features/dev-branch-name\|master' | cut -d'/' -f 2- |  xargs -L 1 git push origin --delete

这里要做的几件事情是: -r列出所有远程分支(如果您已经删除了所有必要的本地分支,那么只剩下远程分支,您需要专门查询这些分支)。-Fx获得所有的精确匹配和 -v是一个非条件。根据 的手册页,到 cut -d'/' -f 2-意味着将结果按“/”分配,然后取字段2直到行尾(- f2 -)。如果您希望将 team/features/dev-branch-name而不是 origin/team/features/dev-branch-name通过管道连接到 xargs,那么这是非常有用的。 如果你不说 cut -d'/' -f 2-,那么你说的就是 git push origin --delete origin/branch而不是 git push origin --delete branch。前者行不通。-L 1告诉 xargs每次向 git push命令提供一行左侧输入。

即使使用上述方法,如果您有包含单引号(')的远程分支,它也不会成功。为此,你可以试试:

git branch -r | grep -v "'" | cut -d'/' -f 2- |  xargs -L 1 git push origin --delete

由于 fatal: invalid spec错误,我不得不手动删除这些时髦的单引号分支。

你只需要在当前的 git 工作树中保持签出分支,然后使用:

git branch | xargs git branch -D

您将看到几个关于不可能删除签出分支和“ *”分支(在签出分支之前放在分支列表中的符号)的错误。 如果您有多个本地 git 存储库的工作树,那么在当前存储库的其他工作树中签出的其他分支也将保持相同的错误(并且在根据分支列表中显示的符号删除“ +”分支时会出现额外的错误,然后在当前存储库的其他工作树中签出分支。

在 Linux 中,您要寻找的命令是:

git branch --list | grep -v "^* $(git branch --show-current)$" | xargs git branch -D

在这里,git branch --show-current用于获取当前分支,而不是硬编码分支名称。

当前分支标记为 *

git branch
branchA
branchB
* mybranch
otherthing

照做就是了

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

删除所有未标记为 *的分支