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

sen*_*rio 78 git git-branch

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

$ git branch
Run Code Online (Sandbox Code Playgroud)

但保持现有的分支,一步到位.那可能吗?如果是这样,怎么样?

pan*_*ijs 151

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

将删除除master之外的所有分支,用要保留的分支替换master(将删除master)

  • 如果你想保持*current*分支使用`grep -v ^*`. (24认同)
  • 如果要保留两个分支,请使用grep -v“ master \ | my-other-branch”。 (7认同)
  • 很多消息来源给我看这个脚本,但是当我运行它时总是告诉我找不到分支:( (2认同)
  • 然后根据需要调整正则表达式,例如`grep -v "^ *master$"` (2认同)

Vad*_*est 59

根据@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"
Run Code Online (Sandbox Code Playgroud)

要加入 ~/.gitconfig


并且,正如@torek所指出的那样:

请注意,小写-d不会删除"非完全合并"分支(请参阅文档).使用-D 将删除这样的分支,即使这导致提交变得"丢失"; 请谨慎使用它,因为这样也会删除分支reflog,因此通常的"从意外删除中恢复"的东西也不起作用.

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

  • 提交到已删除的分支应该仍然在引用日志中保留一段时间。 (2认同)

Kho*_*lam 53

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

git checkout master
Run Code Online (Sandbox Code Playgroud)

第二(确保你在master 上

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

  • 如果您使用的是 PowerShell,请使用“gitbranch -D $(gitbranch).Trim()”。 (10认同)
  • 非常快速和容易。为什么这没有得到投票? (4认同)
  • 在窗户上工作就像一个魅力! (2认同)

tor*_*rek 13

git branch -d(或-D)允许多个分支名称,但是在不编写至少一点代码的情况下自动提供"除了我现在的那个之外的所有本地分支"有点棘手.

"最佳"(形式上正确的)方法是git for-each-ref用于获取分支名称:

git for-each-ref --format '%(refname:short)' refs/heads
Run Code Online (Sandbox Code Playgroud)

但是git symbolic-ref HEAD,如果你想编写一个花哨的脚本,那就更难找出你所在的分支(对于这种情况,这是"正式正确"的方法).

更方便的是,您可以使用git branch,它打印您的本地分支名称前面有两个空格或(对于当前分支)用星号打印*.因此,通过某些操作来删除*版本,并留下以空格分隔的分支名称,然后您可以将其传递给git branch -d:

git branch -d $(git branch | grep -v '^*')
Run Code Online (Sandbox Code Playgroud)

要么:

git branch | grep -v '^*' | xargs git branch -d
Run Code Online (Sandbox Code Playgroud)

请注意,小写-d不会删除"非完全合并"分支(请参阅文档).使用-D将删除这样的分支,即使这导致提交变得"丢失"; 请谨慎使用它,因为这样也会删除分支reflog,因此通常的"从意外删除中恢复"的东西也不起作用.


Dan*_*Dye 13

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

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


Ste*_*rov 11

要删除所有合并的分支(当前除外-v ‘*’):

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

我也为repo完成清理做了这样的命令:

alias git-clean="git branch  | grep -v '*' | grep -v 'master' | xargs git branch -D  && git reset --hard && git clean -d -x -f"
Run Code Online (Sandbox Code Playgroud)

取自这里.


Rob*_*vus 9

对于 Windows,在 Powershell 中使用:

git branch | %{ $_.Trim() } | ?{ $_ -ne 'master' } | %{ git branch -D $_ }
Run Code Online (Sandbox Code Playgroud)


Asa*_*oor 7

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

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

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

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


bas*_*amp 6

假设您寻求删除除master 分支和当前功能分支(让其称为“team/features/dev-branch-name”)之外的所有分支,我想将其浓缩为:

  1. 首先查看你要删除的分支
  2. 然后删除它们

查看分支:

git branch | grep -v -Fx "$(git branch --show-current)\|master"
Run Code Online (Sandbox Code Playgroud)

我看到一些答案表明grep -v "develop" | grep -v "master",但这是一个AND条件,即“给我所有其中没有“develop”的分支名称,并找到其中没有“master”的分支名称”。就我个人而言,我一直在寻找OR条件。

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

因此,我认为最好通过实际写出您想要保留的分支的名称来确保万无一失:

git branch | grep -v -Fx 'team/features/dev-branch-name\|master'
Run Code Online (Sandbox Code Playgroud)

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

一旦您成功看到要删除的分支,请通过发出以下命令来删除它们:

git branch | grep -v -Fx 'team/features/dev-branch-name\|master' | xargs git branch -D
Run Code Online (Sandbox Code Playgroud)

以上仅坚持删除本地分支。要也删除远程分支(例如,在编辑/修剪通过存储库克隆的情况下您想要执行此操作),请使用:

git branch -r | grep -v -Fx 'team/features/dev-branch-name\|master' | cut -d'/' -f 2- |  xargs -L 1 git push origin --delete
Run Code Online (Sandbox Code Playgroud)

这里发生的几件事-r是:列出所有远程分支(如果您已经删除了所有必要的本地分支,那么只剩下远程分支,您需要专门查询这些分支)。-Fx获取所有精确匹配并且-v是 NOT 条件。根据cut的手册页, tocut -d'/' -f 2-表示将结果除以“/”,然后取字段 2 直到行尾 (-f 2-)。如果您希望通过管道team/features/dev-branch-name而不是origin/team/features/dev-branch-nameto ,这非常有用xargs。如果你不这样做cut -d'/' -f 2-,那么你就会说“git push origin --delete origin/branch而不是” git push origin --delete branch。前者不起作用。一次一行向命令提供左侧输入的-L 1指示。xargsgit push

即使有了上述内容,如果您有包含单引号 ( ') 标记的远程分支,它也不会成功。为此,您可以尝试:

git branch -r | grep -v "'" | cut -d'/' -f 2- |  xargs -L 1 git push origin --delete
Run Code Online (Sandbox Code Playgroud)

由于错误,我确实不得不手动删除这些时髦的单引号千疮百孔的分支fatal: invalid spec


Asa*_*oor 5

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

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

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

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

删除除developmaster之外的所有本地分支

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


Jus*_*ice 5

我使用它是因为我对不想删除的内容更有选择性。下面的命令删除除 master、develop 和当前分支之外的所有分支。

BRANCHES=$(git branch | egrep -v "(master|develop|\*)" | xargs git branch -D)
echo $BRANCHES
Run Code Online (Sandbox Code Playgroud)

所以我把这个放在我的 ~/.zshrc

delete_branches() {
  BRANCHES=$(git branch | egrep -v "(master|develop|\*)" | xargs git branch -D)
  echo $BRANCHES
}

alias cleanup_branches=delete_branches
Run Code Online (Sandbox Code Playgroud)