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


Answers:


66

基于@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%不会丢失任何重要内容,请不要使用该版本。因为它永远消失


2
提交到已删除的分支仍应在引用日志中保留一段时间。
CaptRespect

实际上,提交将保留在更新日志中。但是分支本身不是。我不会尝试,但是我想您可能会找到您的提交,但是又回到分支状态了吗?我很怀疑。Cherry-pick可用于在已删除的分支中检索提交,但您将无法还原分支本身。
Vadorequest '18

1
@Vadorequest,您可以通过执行以下操作重新创建指向某个提交的分支git branch branchname commitid
pqnet

@pqnet我不知道会重新创建该分支的所有历史记录,非常感谢!
Vadorequest '18

1
@Vadorequest因为提交对象是不可变的(并且被索引为哈希),所以每次编辑都需要创建一个新的对象(具有不同的哈希值)
pqnet

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

将删除除master以外的所有分支(将master替换为您要保留的分支,但随后它将删除master)


29
如果要保留当前分支使用grep -v ^*
Schwern 2015年

2
许多资源向我展示了此脚本,但是当我运行该脚本时,总是告诉我找不到分支:(
tucq88

1
这是不准确的,它不会删除名为的分支master-copy,例如
mvallebr '17

2
然后根据需要调整正则表达式,例如grep -v "^ *master$"
Brad Koch

7
如果要保留两个分支使用grep -v "master\|my-other-branch"
德里克·索克

17

首先(切换到要保留的分支> exmaster):

git checkout master

第二(确保掌握掌握

git branch -D $(git branch)

3
非常快速和容易。为什么这个不被认可?
princebillyGK

1
这是对我来说最简单,最好的答案。
Saleh Enam Shohag

1
如果您使用的是PowerShell,请使用git branch -D $(git branch).Trim()
NatoBoram

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会删除这些分支,即使这会导致提交“丢失”;请谨慎使用此选项,因为这也会删除分支引用日志,因此通常的“从意外删除中恢复”的方法也不起作用。


git branch -D $(git branch | grep -v '^*')如果要删除已合并的那些分支,则应为。
Pratik Singhal '18

@PratikSinghal:删除所有其他分支,而不仅仅是Git认为“合并”的分支。这很少是一个好主意。我已经在回答中指出了这两个项目。
torek's

12

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

10

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

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

删除所有本地分支(开发掌握除外)

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

6

对于Windows,在Powershell中使用:

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

4

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

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

3

我曾经为Windows环境创建了此构造。也许会帮助别人。在执行期间,不会删除master和current分支。无论如何,所有其他合并的分支将被删除。

@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

3

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

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


2

假设git branch显示当前分支以*;使用Powershell的下面的一行将删除所有不以开头的分支*

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

? =对象

% = Foreach对象


1

因此,我在这里看到很多硬编码的分支名称...而且我认为这里的答案更准确地回答了问题的“当前分支”部分,同时使它保持单行且对像我这样的bash新手可读。只是将信用归于到期,答案显然也基于@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功能才能使sub命令在某些命令行上运行)


1

我之所以使用它,是因为我对不想删除的内容更具选择性。以下命令删除除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

0

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

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

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


打印gone您应该使用的标记-vv(详细两次),但-a对您没有帮助(它还会列出远程分支)
pqnet
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.