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

时间:2015-02-17 22:24:01

标签: git git-branch

我想删除

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

但保持当前分支,一步。那可能吗?如果是这样,怎么样?

16 个答案:

答案 0 :(得分:134)

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

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

答案 1 :(得分:46)

根据@pankijs的回答,我制作了两个git别名:

render() {
    const { input: { value, onChange }, callback, async, ...rest } = this.props;

    if (async) {
      return (
        <Select.Async
          onChange={(val) => {
            onChange(val);
            callback(val);
          }}
          value={value}
          {...rest}
        />
      );
    }

    return (
      <Select
        onChange={(val) => {
          onChange(val);
          callback(val);
        }}
        value={value}
        {...rest}
      />
    );
  }

要添加到[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"

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

  

请注意,小写~/.gitconfig不会删除&#34;非完全合并&#34;分支(参见文档)。使用-d 会删除此类分支,即使这会导致提交失败&#34 ;; 小心使用,因为这会删除分支reflog,以便通常&#34;从意外删除中恢复&#34;东西也不起作用。

基本上,如果您不是300%确定您不会失去任何重要的东西,请不要使用-D版本。因为它已经永远

答案 2 :(得分:12)

git branch -d(或-D)允许多个分支机构名称,但自动提供&#34;所有本地分支机构(不包括我现在正在进行的分支机构)&#34有点棘手34;没有编写至少一点代码。

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

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

但是,如果你想写一个分支,你就更难找出你所在的分支(git symbolic-ref HEAD是#34;正式的正确#34;方法花哨的剧本)。

更方便的是,您可以使用git branch打印您的本地分支名称前面有两个空格,或者(对于当前分支)打印一个星号*。因此,运行此操作以删除*版本,然后您将使用以空格分隔的分支名称,然后将其传递给git branch -d

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

或:

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

请注意,小写-d不会删除&#34;非完全合并&#34;分支(参见文档)。使用-D将删除此类分支,即使这会导致提交变为&#34;丢失&#34 ;;请谨慎使用它,因为这会删除分支reflogs,以便通常&#34;从意外删除恢复&#34;东西也不起作用。

答案 3 :(得分: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

答案 4 :(得分:3)

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

git checkout master

秒(确保确保您在主控上)

git branch -D $(git branch)

答案 5 :(得分:2)

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

@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

答案 6 :(得分:2)

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

Foo.objects.first().bar.all()

删除除 develop master

以外的所有本地分支机构
git branch | grep -v "branch name" | xargs git branch -D

答案 7 :(得分:2)

假设# The problem: Serialize a [psobject]-wrapped array (0, 0): PS> ConvertTo-Json -InputObject (New-Object int[] 2) # Note the extra object with the "count" (element count) and "value" property (elements) { "value": [ 0, 0 ], "Count": 2 } # Remove the ETS definitions for System.Array Remove-TypeData System.Array # Rerun the command: PS> ConvertTo-Json -InputObject (New-Object int[] 2) # OK [ 0, 0 ] 显示以PS> $arr = New-Object int[] 2; ConvertTo-Json -InputObject $arr # Note the extra object with the "count" (element count) and "value" property (elements) { "value": [ 0, 0 ], "Count": 2 } # $arr.psobject.BaseObject bypasses the [psobject] wrapper PS> ConvertTo-Json -InputObject $arr.psobject.BaseObject # OK [ 0, 0 ] 为前缀的当前分支;使用Powershell,以下一个划线员将删除所有不以git branch开头的分支。

*

* =哪里对象

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

答案 8 :(得分:2)

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

答案 9 :(得分:1)

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

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

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

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

删除除 develop master

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

答案 10 :(得分:0)

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

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

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

答案 11 :(得分:0)

对于Windows,在Powershell中使用:

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

答案 12 :(得分:0)

所以我在这里看到很多硬编码的分支名称...而且我认为这里的答案更准确地回答了问题的“当前分支”部分,同时使其保持单行且易于被像我这样的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命令在某些命令行上运行)

答案 13 :(得分:0)

要删除当前分支以外的所有分支,请执行以下步骤:

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

答案 14 :(得分:0)

最简单的

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

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

答案 15 :(得分:0)

假设您要删除所有除了主分支当前功能分支(我们称之为“团队/功能/开发分支名称”),我想把它浓缩为:

  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 是非条件。根据 cut 的手册页,cut -d'/' -f 2- 表示将结果除以“/”,然后取字段 2 直到行尾(-f 2-)。如果您希望通过管道将 team/features/dev-branch-name 而不是 origin/team/features/dev-branch-namexargs,这很有用。 如果您不使用 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

由于 fatal: invalid spec 错误,我确实不得不手动删除这些时髦的单引号充斥着的分支。