删除所有本地git分支

时间:2012-05-15 23:45:48

标签: git bash ubuntu version-control 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

所有删除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

32 个答案:

答案 0 :(得分:277)

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

答案 1 :(得分:127)

我发现了一种更好的方式in a comment on this issue on github

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

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

答案 2 :(得分:73)

不推荐解析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 branch输出

    的脚本maintainer of git has this to say
      

    要了解当前的分支是什么,休闲/粗心的用户可能会有   围绕git branch编写脚本,这是错误的。我们积极劝阻   反对使用任何Porcelain命令,包括git branch,in   脚本,因为命令的输出可能会更改为   帮助人类消费使用案例。

    建议手动编辑.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及更早版本,您需要列出所有本地分支,然后单独测试它们以查看它们是否已合并(这将显着更慢且稍微复杂一些)。

    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
    

答案 3 :(得分:55)

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

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

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

答案 4 :(得分:40)

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

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

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

答案 5 :(得分:38)

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

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

非常实用!

答案 6 :(得分:32)

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

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

上面的命令

  1. 列出所有分支机构
  2. 从列表中忽略主分支,并使用其余分支
  3. 删除分支

答案 7 :(得分:23)

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

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

答案 8 :(得分:11)

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

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

希望这有助于某人。

答案 9 :(得分:8)

如果你使用 NodeJS,我写了 this command

npx git-clear-branch

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

答案 10 :(得分:7)

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

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

这将删除除主分支以外的每个本地分支。由于您的上游分支存储在 .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

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

答案 11 :(得分:4)

这是适用于在 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()
}

答案 12 :(得分:4)

这些答案都没有完全满足我的需求,所以我们走了:

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

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

适用于Git 1.9.5。

答案 13 :(得分:4)

要删除Linux中的所有本地分支机构,除了您所在的分支机构

// hard delete

git branch -D $(git branch)

答案 14 :(得分:3)

根据此处的许多答案的组合-如果您要保留远程上存在的所有分支但删除其余分支,则以下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

答案 15 :(得分:3)

如果您想保持母版,请开发和开发所有远程分支。删除Github上不再存在的所有本地分支。

$ git fetch --prune

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

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

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

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

答案 16 :(得分:3)

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

答案 17 :(得分:2)

git branch -d [branch name]用于本地删除

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

答案 18 :(得分:2)

尽管这不是命令行解决方案,但令我惊讶的是Git GUI尚未被提出。

我99%的时间都在使用命令行,但是在这种情况下,它要么变慢了(因此出现了原始问题),要么当您使用冗长而聪明的方法时,您不知道要删除什么外壳操作。

用户界面可以解决此问题,因为您可以快速检查要删除的分支,并提醒您要保留的分支,而不必为每个分支键入命令。

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

GitUI: delete local branches

答案 19 :(得分:2)

我推荐一个更温和的答案。这里的许多答案都使用 -D,无论更改是否已合并,它都会被强制删除。这是一个单线,保留未合并更改的分支。

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

或者您可以尝试列出的其他示例,但只需将 -D 更改为 -d。我知道 OP 询问了如何删除,但在大多数用例中,使用 -d 更安全。

答案 20 :(得分:1)

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

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

答案 21 :(得分:1)

对于powershell,这将起作用:

<div *ngIf="tutorRequests.reason.includes('Que')">

答案 22 :(得分:1)

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

git branch -D `git branch`

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

答案 23 :(得分:1)

一次删除多个本地分支

np.unwrap

删除远程分支

import http.client
import ssl

conn = http.client.HTTPSConnection("210.61.209.4",context = ssl._create_unverified_context())
payload = 'username=support&pwd=stackoverflow.com&password=stackoverflow.com&pwd_r=&mp_idx=0'
headers = {
  'Connection': 'keep-alive',
  'Cache-Control': 'max-age=0',
  'sec-ch-ua': '" Not A;Brand";v="99", "Chromium";v="90", "Google Chrome";v="90"',
  'sec-ch-ua-mobile': '?0',
  'Upgrade-Insecure-Requests': '1',
  'Origin': 'https://210.61.209.4',
  'Content-Type': 'application/x-www-form-urlencoded',
  'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36',
  'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
  'Sec-Fetch-Site': 'same-origin',
  'Sec-Fetch-Mode': 'navigate',
  'Sec-Fetch-User': '?1',
  'Sec-Fetch-Dest': 'document',
  'Referer': 'https://210.61.209.4/',
  'Accept-Language': 'zh-TW,zh;q=0.9,en-US;q=0.8,en;q=0.7,vi;q=0.6,en-GB;q=0.5,zh-CN;q=0.4',
  'Cookie': '_ga=GA1.1.135496395.1606126381; ext-ssidtabOpt=n%3A0; _gid=GA1.1.798827174.1620711592; authtok=3HvvXEP2eD7eS6LRFb39IUSjYH4MMMQbc0rxrIekdJuDXrckXS69UU3XCbjT+ISn; secuRtBannerClsCookie=login'
}
conn.request("POST", "/", payload, headers)

Source

答案 24 :(得分:0)

请确保您先执行此操作

git fetch

拥有所有远程分支机构信息后,请使用以下命令删除除 master

之外的每个分支机构
 git branch -a | grep -v "master" | grep remotes | sed 's/remotes\/origin\///g' | xargs git push origin --delete

答案 25 :(得分:0)

最实用的方法:确保您没有master上的未提交工作,如果需要的话,请提交/推送,克隆存储库的新副本,然后删除旧的副本。

答案 26 :(得分:0)

为此,您可以使用git-extras

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

答案 27 :(得分:0)

上面的答案很好用。当我们在本地存储库中有很多分支并且除了少数位于本地机器中的分支之外,我们必须删除许多分支时,这是另一种方法。

第一个firstName将列出所有本地分支。

通过运行unix命令将分支名称的列转置为文件中的单行
git branch
这会将其保存在 sample.txt 文件中。 然后跑
git branch > sample.txt
在Shell中执行命令。这会将列转换为行,并在单行中复制分支名称列表。

然后运行
awk 'BEGIN { ORS = " " } { print }' sample.txt
这将删除本地列出的所有列出的分支机构

答案 28 :(得分:0)

我的包装盒上没有grep或其他unix,但这在VSCode的终端上有效:

git branch -d $(git branch).trim()

我使用小写字母d,因此它不会删除未合并的分支。

我在做母版时也处于母版状态,因此* master不存在,因此它没有尝试删除母版。

答案 29 :(得分:0)

我写了一个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

答案 30 :(得分:0)

以下脚本删除分支。使用它并自行修改,等等。

根据这个问题的其他答案,我最终为自己写了一个快速的bash脚本。我叫它&#34; gitbd&#34; (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] 

答案 31 :(得分:-2)

如果要删除测试分支,则

Step1

  • 转到其他分支机构
  • git branch -d分支名称

enter image description here

More Detail in depth