当前位置: 首页>>技术教程>>正文


删除所有本地git分支

, , , ,

问题描述

我遵循一个开发过程,为每个新功能或故事卡创建一个新的本地分支。完成后,我将分支合并到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

尝试删除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,版本4.1.5(1)-发布GNU grep 2.5.4

最佳答案

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

次佳答案

我找到了一个更好的方法in a comment on this issue on github

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

编辑:添加了no-color选项,但不包括稳定分支(根据需要添加其他分支)

第三种答案

不建议解析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可能还会执行其他令人讨厌的解析操作,例如在当前签出的分支旁边放置一个星号

maintainer of git has this to say关于围绕git branch输出的脚本编制

To find out what the current branch is, casual/careless users may have scripted around git branch, which is wrong. We actively discourage against use of any Porcelain command, including git branch, in scripts, because the output from the command is subject to change to help human consumption use case.

建议手动编辑.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

在Git 2.6.X及更早版本的Git中,您将需要列出所有本地分支,然后分别对其进行测试,以查看它们是否已合并(这将显著降低速度并变得稍微复杂一些)。

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

第四种答案

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

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

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

第五种答案

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

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

很有用 !

第六种答案

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

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

上面的命令

  1. 列出所有分支

  2. 从列表中忽略主分支,并选择其余分支

  3. 删除分支

第七种答案

请注意,我将升级到git 1.7.10。您可能会在这里获得不适用于您的版本的答案。我的猜测是,您必须在分支名称前加上refs/heads/

注意,仅当您复制了工作文件夹和.git目录时,才进行以下操作。

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

第八种答案

我发现仅使用文本编辑器和Shell会更容易。

  1. 在 shell 中键入git checkout <TAB>。将显示所有本地分支机构。

  2. 将它们复制到文本编辑器,删除您需要保留的那些。

  3. 用空格替换换行符。 (在SublimeText中,这非常容易。)

  4. 打开 shell ,键入git branch -D <PASTE THE BRANCHES NAMES HERE>

而已。

第九种答案

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

// hard delete

git branch -D $(git branch)

第十种答案

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

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

希望这对某人有帮助。

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/8905.html,未经允许,请勿转载。