删除所有本地git分支

Lou*_*uth 270 git bash version-control ubuntu grep

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

由于懒惰或健忘的结合,随着时间推移会发生的事情是,我最终得到了大量的本地分支,其中一些(例如尖峰)可能没有被合并.

我知道如何列出我所有的本地分支,我知道如何删除一个分支,但我想知道是否有一个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
Run Code Online (Sandbox Code Playgroud)

所有删除列出的分支的尝试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.
Run Code Online (Sandbox Code Playgroud)

我正在使用:
git 1.7.4.1
ubuntu 10.04
GNU bash,版本4.1.5(1) -
发布GNU grep 2.5.4

GoZ*_*ner 325

'git branch -d'子命令可以删除多个分支.所以,简化@ sblom的答案,但添加一个关键的xargs:

git branch -D `git branch --merged | grep -v \* | xargs`
Run Code Online (Sandbox Code Playgroud)

或者,进一步简化为:

git branch --merged | grep -v \* | xargs git branch -D 
Run Code Online (Sandbox Code Playgroud)

重要的是,正如@AndrewC所指出的那样,git branch不鼓励使用脚本.为了避免它使用类似的东西:

git for-each-ref --format '%(refname:short)' refs/heads | grep -v master | xargs git branch -D
Run Code Online (Sandbox Code Playgroud)

删除时要小心谨慎!

$ 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).
Run Code Online (Sandbox Code Playgroud)

  • 所以我发现唯一的答案是有效的。谢谢! (3认同)
  • 不适合我。收到以下错误:“致命:需要分支名称” (3认同)
  • 时隔许久,我又来给 Node.js 开发者分享另一个解决方案了。https://github.com/jmlavoier/clear-branches `npx clear-branches`。 (2认同)

mBa*_*dos 129

在github上对这个问题的评论找到了一个更好的方法:

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

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

  • 如果你在 2021 年阅读这篇文章,你很可能会遇到“致命:格式错误的对象名称 master,致命:需要分支名称”。这是因为很多 github 项目不再有 `master` 分支。他们经常使用“main”来代替。在这种情况下,请将“gitbranch--mergedmaster”替换为“gitbranch--mergedmain”。 (4认同)
  • 最后,我一直需要的解决方案 (2认同)
  • 我已经尝试过此操作,但每个分支都不断出现“错误:未找到分支“我的分支名称”。”。使用 git 版本 1.8.3.4 (Apple Git-47)。知道为什么吗? (2认同)
  • 所以。`git for-each-ref --format'%(refname:short)'refs / heads / | grep -v大师| xargs git branch -d` (2认同)
  • 与此一起学习了 xargs 用法。谢谢 (2认同)

And*_*w C 86

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 可能会做其他令人讨厌的事情,比如在当前签出的分支旁边放一个星号

git维护者有关于git branch输出的脚本的说法

要找出当前分支是什么,临时/粗心的用户可能已经围绕git分支编写脚本,这是错误的.我们积极阻止在脚本中使用任何Porcelain命令,包括git branch,因为命令的输出可能会发生变化,以帮助人类消费用例.

建议手动编辑目录中的.git文件(如.git/refs/heads)的答案同样有问题(refs可能在.git/packed-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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

  • 这肯定是一种改进.你总是会遇到需要过滤掉*的问题,如果有人从分离的头部运行它,它确实很有趣.但主要的问题是`git branch`是一个瓷器命令,并且无法保证输出在将来的某个版本的git中不会改变. (5认同)
  • 如何确定"瓷器"和"非瓷器"GIT命令? (2认同)
  • @GoZoner如果您执行`man git`,则会为您提供每个列表 (2认同)
  • 默认情况下排除“dev”和“master”可能是一个有用的增强? (2认同)

小智 75

尝试以下 shell 命令:

git branch | grep -v "master" | xargs git branch -D
Run Code Online (Sandbox Code Playgroud)

解释:

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

  • 尽管这可能是一个正确的答案。如果没有解释什么以及如何解决原始问题,一行代码就没有多大用处。请提供您的答案的详细信息。 (3认同)

sbl*_*lom 58

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

for b in `git branch --merged | grep -v \*`; do git branch -D $b; done
Run Code Online (Sandbox Code Playgroud)

我会建议改变git branch -D $becho $b第几次以确保它会删除你想让你的分支机构.

  • 它的字面意思是“错误:找不到分支'a_branch_name'”吗?或者它是否抱怨上面“git分支”输出中的分支名称之一? (2认同)

geo*_*oom 46

删除所有分支但保持其他像"开发"和"主"的简单方法如下:

git branch | grep -v "develop" | grep -v "master" | xargs git branch -D
Run Code Online (Sandbox Code Playgroud)

很有用 !

  • 我完全不同意 Andrew C 的评论,我在 2022 年来到这里,该解决方案对我来说非常有效。谢谢吉奥姆 (27认同)
  • 这个解决方案对我有用。删除了所有本地分支。 (11认同)
  • 你已经复活了一个古老的线程并且发布了一个与现有线程完全相同的答案,这是错误的并且缺少它所具有的安全性变化.这不是一个好的答案. (5认同)
  • 这个答案很明显来自git branch的管道输出,修改它,并传递给git branch -D.不需要是卑鄙的. (5认同)
  • 这就是我一直在寻找的答案 (5认同)
  • 这不会删除任何包含单词develop或master的分支,例如“develop_feature”或“master_feature”。 (4认同)
  • 对于 Windows 运行此 ps 脚本:`gitbranch | %{ $_.Trim() } | %{ $_.Trim() } | ?{ $_ -ne '大师' } | ?{ $_ -ne '发布'} | %{ gitbranch -D $_ }` 跳过 master 和release分支 (3认同)

Hun*_*ter 45

以下命令将删除除master分支以外的所有本地分支.

git branch | grep -v "master" | xargs git branch -D
Run Code Online (Sandbox Code Playgroud)

上面的命令

  1. 列出所有分支
  2. 从列表中忽略master分支并占用其余分支
  3. 删除分支

  • 我会用`git branch | grep -v"master"| xargs git branch -d`首先所以我不删除未合并的分支,只是为了安全.但很好的答案! (3认同)
  • 这是一个powershell版本`,@(git branch | Select-String -Pattern"[^(*?)\ s?master]")| ForEach-Object {$ _.Line.Trim()} | %{git branch -D $ _}` (3认同)

Ada*_*ruk 40

请注意,我会升级到git 1.7.10.您可能会在此处获得对您的版本无效的答案.我的猜测是你必须在分支名称前加上refs/heads/.

注意,仅当您复制了工作文件夹和.git目录时,请继续执行以下操作.

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

  • 如果您具有打包的引用,或者即使您有时是从远程服务器克隆的(这将为您提供打包的文件),这将不起作用。如果您的裁判是打包的,那么裁判将不会存储在.git / refs / heads中,它们会存储在一个名为“ packed-refs”的文件中。参见http://git-scm.com/docs/git-pack-refs。 (2认同)

小智 26

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

git checkout master
Run Code Online (Sandbox Code Playgroud)

第二(确保你在master上)

git branch -D $(git branch)
Run Code Online (Sandbox Code Playgroud)

如果您使用的是 PowerShell,请使用

git branch -D $(git branch).Trim()
Run Code Online (Sandbox Code Playgroud)


cul*_*rón 23

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

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

而已.

  • 真棒!它适用于Windows****!非常感谢 (4认同)

小智 18

如果要删除所有本地分支,请使用以下简单命令:

git branch -D `git branch`
Run Code Online (Sandbox Code Playgroud)

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


Ali*_*mad 18

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

git branch | grep -v "main" | xargs git branch -D 
Run Code Online (Sandbox Code Playgroud)


ash*_*dav 16

删除linux中除所在的分支以外的所有本地分支

// hard delete

git branch -D $(git branch)
Run Code Online (Sandbox Code Playgroud)

  • 这个感觉比进入 .git 并删除东西更安全。 (2认同)

gor*_*kha 14

删除Local中所有本地分支


使用它,因为这非常简单。这将删除您计算机上的所有分支,而不是远程存储库上的所有分支。

 git branch -D $(git branch) 
Run Code Online (Sandbox Code Playgroud)


4u.*_*Ans 11

我有类似的情况,最近发现以下命令很有用.

git branch -D `git branch | awk '{ if ($0 !~ /<Branch_You_Want_to_Keep>/) printf "%s", $0 }'`
Run Code Online (Sandbox Code Playgroud)

如果你想保留多个分支,那么

git branch -D `git branch | awk '{ if ($0 !~ /<Branch_You_Want_to_Keep1>|<Branch_You_Want_to_Keep2>/) printf "%s", $0 }'`
Run Code Online (Sandbox Code Playgroud)

希望这有助于某人.


for*_*dya 11

git branch -l |grep -v master | xargs git branch -D
Run Code Online (Sandbox Code Playgroud)

但删除分支又有什么用呢?如果它是一个小存储库,只需删除工作区并重新克隆它!


Rud*_*ynh 8

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

npx git-clear-branch
Run Code Online (Sandbox Code Playgroud)

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


Kol*_*yon 8

这是适用于在 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()
}
Run Code Online (Sandbox Code Playgroud)


Tod*_*obs 7

如果您不需要通过Git本身,您也可以手动或以编程方式删除.git/refs/heads下的.以下应该适用于Bash下的最小调整:

shopt -s extglob
rm -rf .git/refs/heads/!(master)
Run Code Online (Sandbox Code Playgroud)

这将删除除主分支以外的每个本地分支.由于您的上游分支存储在.git/refs/remotes下,因此它们将保持不变.

如果你没有使用Bash,或者想要一次递送大量的Git存储库,你可以使用GNU find做类似的事情:

find . \
    -path remotes -path logs -prune -o \
    -wholename \*.git/refs/heads/\* \! -name master -print0 |
xargs -0 rm -rf
Run Code Online (Sandbox Code Playgroud)

查找解决方案可能更具可移植性,但修剪路径和文件名很棘手,可能更容易出错.


小智 7

没有一个答案完全满足我的需求,所以我们开始:

git branch --merged | grep -E "(feature|bugfix|hotfix)/" | xargs git branch -D && git remote prune origin
Run Code Online (Sandbox Code Playgroud)

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

适用于 Git 1.9.5。


Dan*_*hie 7

虽然这不是命令行解决方案,但我很惊讶尚未建议Git GUI

我 99% 的时间都使用命令行,但在这种情况下,它要么太慢(因此是原始问题),要么在诉诸一些冗长但聪明的 shell 操作时不知道要删除什么。

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

从 UI 转到分支 --> 删除,然后 按 Ctrl+单击要删除的分支以突出显示它们。如果您想确保它们合并到一个分支(例如dev)中,请在仅在合并到时删除下将本地分支设置为dev。否则,将其设置为Always以忽略此检查。

GitUI:删除本地分支


kie*_*wic 7

在Windows命令行中,使用以下命令删除除当前已检出分支以外的所有内容:

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


小智 5

根据此处的多个答案的组合-如果您想保留远程存在的所有分支但删除其余分支,则以下oneliner可以解决问题:

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
Run Code Online (Sandbox Code Playgroud)


kap*_*pil 5

如果要保留 master、develop 和所有远程分支。删除所有不再存在于 Github 上的本地分支。

$ git fetch --prune

$ git branch | grep -v "origin" | grep -v "develop" | grep -v "master" | xargs git branch -D
Run Code Online (Sandbox Code Playgroud)

1] 它将删除远程存储库中不再使用的远程引用。

2] 这将获得您所有分支机构的列表。从列表中删除包含 master、develop 或 origin(远程分支)的分支。删除列表中的所有分支。

警告 - 这也会删除您自己的本地分支。因此,当您合并分支并在合并后进行清理时,请执行此操作,删除。