【问题标题】:Can I delete all the local branches except the current one?我可以删除除当前分支之外的所有本地分支吗?
【发布时间】:2015-04-18 18:51:42
【问题描述】:

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

$ git branch

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

【问题讨论】:

标签: git git-branch


【解决方案1】:
$ git branch | grep -v "master" | xargs git branch -D 

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

【讨论】:

  • 如果你想保持 current 分支使用grep -v ^*.
  • 许多来源向我展示了这个脚本,但是当我运行它时总是告诉我找不到分支:(
  • 这不准确,例如不会删除名为master-copy的分支
  • 然后根据需要调整正则表达式,例如grep -v "^ *master$"
  • 如果你想保留两个分支,请使用grep -v "master\|my-other-branch"
【解决方案2】:

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

基本上,如果您不能 300% 确定自己不会丢失任何重要的东西,则永远不要使用 -force 版本。因为它已经永远丢失了。

【讨论】:

  • 对已删除分支的提交应该仍会在 reflog 中保留一段时间。
  • 确实,提交将保留在 reflog 中。但不是分支本身。我不会尝试,但我猜你可能会找到你的提交,但回到分支状态?我怀疑是这样。 Cherry-pick 可用于检索已删除分支中的提交,但您将无法恢复分支本身。
  • @Vadorequest 你可以通过git branch branchname commitid重新创建指向某个提交的分支
  • @pqnet 我不知道这会重新创建该分支的所有历史记录,谢谢,很高兴知道!
  • @Vadorequest 因为提交对象是不可变的(并且索引为哈希),每次编辑都需要创建一个新对象(具有不同的哈希)
【解决方案3】:

first(切换到你要保留的分支>exma​​ster):

git checkout master

第二(确保确定你是ma​​ster

git branch -D $(git branch)

【讨论】:

  • 非常快速和简单。为什么这没有得到赞成?
  • 对我来说是最简单最好的答案。
  • 如果您使用的是 PowerShell,请使用git branch -D $(git branch).Trim()
  • 我们应该把$(git branch) 放在引号里吗?这不起作用:错误:找不到分支'$(git'。错误:找不到分支'分支)'。
  • @saran3h 试试git branch -D `git branch`
【解决方案4】:

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

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

删除所有本地分支,除了 developma​​ster

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

【讨论】:

    【解决方案5】:

    对于 Windows,在 Powershell 中使用:

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

    【讨论】:

      【解决方案6】:

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

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

      【讨论】:

        【解决方案7】:

        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 '^*')
        • @PratikSinghal:删除 所有 其他分支,而不仅仅是 Git 认为“合并”的分支。 这不是一个好主意。我已经在我的回答中指出了这两个项目。
        【解决方案8】:

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

        git branch --merged | grep -v '*' | xargs git branch -D
        

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

        alias git-clean="git branch  | grep -v '*' | grep -v 'master' | xargs git branch -D  && git reset --hard && git clean -d -x -f"
        

        取自here

        【讨论】:

        • 这只会删除合并的分支。
        【解决方案9】:

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

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

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

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

        删除所有本地分支,除了 developma​​ster

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

        【讨论】:

          【解决方案10】:

          我使用它是因为我可以更有选择性地选择不想删除的内容。下面这个命令会删除除 master、develop 和 current 分支之外的所有分支。

          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
          

          【讨论】:

            【解决方案11】:

            我曾经为我的 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
            

            【讨论】:

              【解决方案12】:

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

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

              ? = Where-Object

              % = Foreach-对象

              【讨论】:

                【解决方案13】:

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

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

                查看分支:

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

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

                注意避免意外删除 dev 分支: 虽然这看起来很棒(由于分支名称没有硬编码),但请注意,当您同时运行它时,您可能不会在正确的分支上签出一个删除命令。如果您当前签出的分支是 master,那么上面将列出除 master only 之外的所有分支,而您的意图是列出除 master 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
                

                以上仅坚持删除本地分支。 要删除远程分支(例如,在编辑/修剪克隆的 repo 等情况下,您希望这样做),请使用:

                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 错误,我不得不手动删除这些时髦的单引号分支。

                【讨论】:

                  【解决方案14】:

                  所以我在这里看到了很多硬编码的分支名称......而且我认为我在这里的回答更准确地反映了问题的“当前分支”部分,同时保持单行并且对于像我这样的新手来说是可读的。只是为了将功劳归于应有的位置,答案显然也基于@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 功能才能在某些命令行上运行)

                  【讨论】:

                    【解决方案15】:

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

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

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

                    【讨论】:

                    • 要打印gone 标记,您应该使用-vv(详细两次),而-a 对您没有帮助(它还列出了远程分支)
                    【解决方案16】:

                    最简单的以上所有方法:

                    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 && ...

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

                    【讨论】:

                      猜你喜欢
                      • 1970-01-01
                      • 2012-05-23
                      • 2014-05-28
                      • 2014-03-18
                      • 1970-01-01
                      • 2012-09-18
                      • 2015-11-06
                      相关资源
                      最近更新 更多