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

Can I delete all the local branches except the current one?

我想删除在 ...

的输出中列出的所有分支
$ git branch

...但保持当前分支,一步。那可能吗?如果可以,怎么做?

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

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

git branch -d(或-D)允许多个分支名称,但是自动提供"all local branches excluding the one I'm on now"而不编写至少一点代码有点棘手。

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

git for-each-ref --format '%(refname:short)' refs/heads

但是之后更难弄清楚你在哪个分支(git symbolic-ref HEAD 是 "formally correct" 方法,如果你想写一个花哨的脚本)。

更方便的是,您可以使用 git branch,它会打印您的本地分支名称,前面有两个 space 或(对于当前分支)前面有一个星号 *。因此,运行 通过一些删除 * 版本的东西,你剩下 space 分隔的分支名称,然后你可以将其传递给 git branch -d:

git branch -d $(git branch | grep -v '^*')

或:

git branch | grep -v '^*' | xargs git branch -d

请注意,小写 -d 不会删除 "non fully merged" 分支(请参阅文档)。使用 -D 将删除此类分支,即使这会导致提交变为 "lost";小心使用它,因为这也会删除分支引用日志,所以通常的 "recover from accidental deletion" 东西也不起作用。

根据@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 指出的那样:

Note that lowercase -d won't delete a "non fully merged" branch (see the documentation). Using -D will delete such branches, even if this causes commits to become "lost"; use this with great care, as this deletes the branch reflogs as well, so that the usual "recover from accidental deletion" stuff does not work either.

基本上,如果您不能 300% 确定不会丢失任何重要内容,请不要使用 -force 版本。因为它已经失去了永远.

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

取自here

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

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

此外,您可以找到与此主题相关的更多信息Delete all local git branches

我曾经为我的 Windows 环境创建过这个结构。也许它会帮助别人。 执行过程中,master和当前分支没有被删除。无论如何,所有其他合并的分支都将被删除。

@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

对于 Windows,在 Powershell 中使用:

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

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

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

删除除developmaster

以外的所有本地分支
git branch | grep -v "develop" | grep -v "master" | xargs git branch -D

删除本地所有合并分支:

git branch -D `git branch --merged | grep -v \* | xargs`

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

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

删除除developmaster

以外的所有本地分支
git branch | grep -v "develop" | grep -v "master" | xargs git branch -D

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

开头的分支

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

? = Where-Object

% = Foreach-对象

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

git checkout master

second(确保确定你在master

git branch -D $(git branch)

所以我在这里看到很多硬编码的分支名称...而且我认为我在这里的回答对问题的 "current branch" 部分更准确,同时保持单行并且可读到 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 功能需要在某些命令行上为 运行 的子命令启用)

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

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

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

以上所有方法中最简单的

  1. 使用 - "git branch" 命令获取所有分支的列表 你的项目文件夹
  2. 复制你得到的分支列表
  3. 从列表中删除“master”以及您要保留的那些
  4. 编写命令删除所有分支,用“&&”分隔(见 下面的示例)
  5. 如果你想删除那些有 未完全合并在下面的命令中使用“-D”而不是“-d”。 "-D" 强行删除分支

示例:

  • git branch -d branch1 && git branch -d branch2 && git branch -d branch3 && git branch -d branch4 && git branch -d branch5 && ...

这对我有用,我发现一起删除许多分支非常容易,而且我还收到每个被删除的分支的消息和那些未能删除的分支的错误消息。

假设您试图删除所有 除了 主分支 当前功能分支(我们称之为 'team/features/dev-branch-name') ,我想将其浓缩为:

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

查看分支:

git branch | grep -v -Fx "$(git branch --show-current)\|master"

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

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

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

git branch | grep -v -Fx 'team/features/dev-branch-name\|master'

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

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

git branch | grep -v -Fx 'team/features/dev-branch-name\|master' | xargs git branch -D

以上仅坚持删除本地分支。 要也删除远程分支(例如,在 editing/trimming 克隆回购协议的情况下,您希望这样做),请使用:

git branch -r | grep -v -Fx 'team/features/dev-branch-name\|master' | cut -d'/' -f 2- |  xargs -L 1 git push origin --delete

这里发生了一些事情:-r 是列出所有远程分支(如果您已经删除了所有必要的本地分支,那么只剩下远程分支,您需要专门查询这些分支). -Fx 获得所有精确匹配,而 -v 是 NOT 条件。根据 cut 的手册页,cut -d'/' -f 2- 意味着用“/”分割结果,然后取字段 2 直到行尾 (-f 2-)。如果您希望将 team/features/dev-branch-name 而不是 origin/team/features/dev-branch-name 传送到 xargs,这将很有用。 如果你不 cut -d'/' -f 2-,那么你会说 git push origin --delete origin/branch 而不是 git push origin --delete branch。前者不起作用。 -L 1 告诉 xargs 一次一行向 git push 命令提供左侧输入。

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

git branch -r | grep -v "'" | cut -d'/' -f 2- |  xargs -L 1 git push origin --delete

由于 fatal: invalid spec 错误,我不得不手动删除这些古怪的单引号分支。

您可以只保留您需要保留的签出分支 - 当前 git 工作树中的签出主分支然后使用:

git branch | xargs git branch -D

您会看到一些关于无法删除签出分支和“*”分支(放置在签出分支之前的分支列表中的符号)的错误。 如果本地 git 存储库有多个工作树,则在那里签出的其他分支也将保留相同的错误(以及根据分支列表中分支之前的分支列表中显示的符号删除“+”分支时的其他错误在当前存储库的其他工作树中签出。