如何删除已合并的所有Git分支?

时间:2011-05-25 15:54:36

标签: git github version-control branch feature-branch

我有很多Git分支。如何删除已合并的分支?是否有一种简单的方法可以将它们全部删除而不是逐个删除它们?

49 个答案:

答案 0 :(得分:2656)

更新:

如果您的工作流程将其作为可能的祖先,您可以添加其他分支以排除master和dev。通常我分支出一个“sprint-start”标签和master,dev和qa不是祖先。

首先,列出在远程合并的所有分支。

git branch --merged

您可能会看到一些您不想删除的分支。我们可以添加一些参数来跳过我们不想删除的重要分支,如master或develop。以下命令将跳过master分支和其中包含dev的任何内容。

git branch --merged| egrep -v "(^\*|master|dev)"

如果要跳过,可以将其添加到egrep命令,如下所示。分支skip_branch_name不会被删除。

git branch --merged| egrep -v "(^\*|master|dev|skip_branch_name)"

删除已合并到当前已检出分支的所有本地分支:

git branch --merged | egrep -v "(^\*|master|dev)" | xargs git branch -d

如果他们是祖先,你可以看到master和dev被排除在外。


您可以使用以下命令删除合并的本地分支:

git branch -d branchname

如果未合并,请使用:

git branch -D branchname

要在旧版本的Git中从遥控器中删除它:

git push origin :branchname

在更新版本的Git中使用:

git push --delete origin branchname

从遥控器中删除分支后,您可以修剪以删除远程跟踪分支:

git remote prune origin

或修剪个别远程跟踪分支,如另一个答案所示,用:

git branch -dr branchname

希望这有帮助。

答案 1 :(得分:391)

删除已合并的远程所有分支:

git branch -r --merged | grep -v master | sed 's/origin\//:/' | xargs -n 1 git push origin

在更新版本的Git

git branch -r --merged | grep -v master | sed 's/origin\///' | xargs -n 1 git push --delete origin

答案 2 :(得分:161)

稍微扩展Adam的答案:

通过运行git config -e --global

将其添加到您的Git配置中
[alias]
    cleanup = "!git branch --merged | grep  -v '\\*\\|master\\|develop' | xargs -n 1 git branch -d"

然后您可以删除所有本地合并的分支,执行简单的git cleanup

答案 3 :(得分:79)

这也可以删除除master之外的所有合并分支。

git branch --merged | grep -v '^* master$' | grep -v '^  master$' | xargs git branch -d

答案 4 :(得分:70)

您要排除master& develop来自这些命令的分支。

本地git clear:

git branch --merged | grep -v '\*\|master\|develop' | xargs -n 1 git branch -d

远程git clear:

git branch -r --merged | grep -v '\*\|master\|develop' | sed 's/origin\///' | xargs -n 1 git push --delete origin

同步远程分支的本地注册表:

git fetch -p

答案 5 :(得分:43)

对于那些在Windows上并且更喜欢PowerShell脚本的人来说,这里是一个删除本地合并分支的人:

function Remove-MergedBranches
{
  git branch --merged |
    ForEach-Object { $_.Trim() } |
    Where-Object {$_ -NotMatch "^\*"} |
    Where-Object {-not ( $_ -Like "*master" )} |
    ForEach-Object { git branch -d $_ }
}

答案 6 :(得分:22)

我已经使用亚当的答案多年了。就是说,在某些情况下,它的行为不符合我的预期:

  1. 包含单词“ master”的分支机构被忽略,例如“ notmaster”或“ masterful”,而不是仅master分支
  2. 包含 单词“ dev”的
  3. 分支被忽略,例如“ dev-test”,而不仅仅是dev分支
  4. 删除从 current 分支的HEAD可以访问的分支(即不一定是主分支)
  5. 处于分离的HEAD状态,从当前提交中删除可达的每个分支

1和2很容易解决,只是对正则表达式进行了更改。 3取决于您想要的内容(即,仅删除尚未合并到master或当前分支的分支)。 如果您无意间在分离的HEAD状态下运行此命令,则4可能会造成灾难性的后果(尽管可以通过git reflog恢复)。

最后,我希望所有这些都在不需要单独的(Bash | Ruby | Python)脚本的单一代码中。

TL; DR

创建一个git别名“ sweep”,它接受可选的-f标志:

git config --global alias.sweep '!f(){ git branch --merged $([[ $1 != "-f" ]] \
&& git rev-parse master) | egrep -v "(^\*|^\s*(master|develop)$)" \
| xargs git branch -d; }; f'

并使用以下命令调用它:

git sweep

或:

git sweep -f

详细而详尽的答案

对于我来说,最简单的方法是创建带有某些分支的示例git repo并提交以测试正确的行为:

通过一次提交创建一个新的git repo

mkdir sweep-test && cd sweep-test && git init
echo "hello" > hello
git add . && git commit -am "initial commit"

创建一些新分支

git branch foo && git branch bar && git branch develop && git branch notmaster && git branch masterful
git branch --list
  bar
  develop
  foo
* master
  masterful
  notmaster

期望的行为:选择所有合并的分支,除了:master,develop或 current

原始正则表达式错过了分支“ masterful”和“ notmaster”:

git checkout foo
git branch --merged | egrep -v "(^\*|master|dev)"
  bar

使用更新的正则表达式(现在不包括“ develop”而不是“ dev”):

git branch --merged | egrep -v "(^\*|^\s*(master|develop)$)"
bar
masterful
notmaster

切换到foo分支,进行新的提交,然后基于foo签出新的分支foobar:

echo "foo" > foo
git add . && git commit -am "foo"
git checkout -b foobar
echo "foobar" > foobar
git add . && git commit -am "foobar"

我当前的分支是foobar,并且如果我重新运行以上命令以列出要删除的分支,则即使没有将其合并到master中,分支“ foo”也将包括在内:

git branch --merged | egrep -v "(^\*|^\s*(master|develop)$)"
  bar
  foo
  masterful
  notmaster

但是,如果我在master上运行相同的命令,则不包括分支“ foo”:

git checkout master && git branch --merged | egrep -v "(^\*|^\s*(master|develop)$)"
  bar
  masterful
  notmaster

这仅仅是因为git branch --merged如果没有另外指定,则默认为当前分支的HEAD。至少对于我的工作流,除非本地分支已合并到master分支,否则我不希望删除它们,因此我更喜欢以下变体:

git checkout foobar
git branch --merged $(git rev-parse master) | egrep -v "(^\*|^\s*(master|develop)$)"
  bar
  masterful
  notmaster

分离的HEAD状态

依靠git branch --merged的默认行为在分离的HEAD状态下会产生更大的后果:

git checkout foobar
git checkout HEAD~0
git branch --merged | egrep -v "(^\*|^\s*(master|develop)$)"
  bar
  foo
  foobar
  masterful
  notmaster

这将删除我刚才所在的分支“ foobar”和“ foo”,这几乎肯定不是期望的结果。 但是,使用我们修改后的命令:

git branch --merged $(git rev-parse master) | egrep -v "(^\*|^\s*(master|develop)$)"
  bar
  masterful
  notmaster

一行,包括实际的删除

git branch --merged $(git rev-parse master) | egrep -v "(^\*|^\s*(master|develop)$)" | xargs git branch -d

所有内容都打包成一个git别名“ sweep”:

git config --global alias.sweep '!f(){ git branch --merged $([[ $1 != "-f" ]] \
&& git rev-parse master) | egrep -v "(^\*|^\s*(master|develop)$)" \
| xargs git branch -d; }; f'

别名接受可选的-f标志。默认行为是仅删除已合并到master的分支,但是-f标志将删除已合并到当前分支的分支。

git sweep
Deleted branch bar (was 9a56952).
Deleted branch masterful (was 9a56952).
Deleted branch notmaster (was 9a56952).
git sweep -f
Deleted branch foo (was 2cea1ab).

答案 7 :(得分:21)

Git Sweep做得很好。

答案 8 :(得分:15)

使用Git版本2.5.0:

*-self

答案 9 :(得分:13)

您可以将提交添加到--merged选项。 这样你就可以确保只删除合并到的分支,即origin / master

以下命令将从您的原点删除合并的分支。

git branch -r --merged origin/master | grep -v "^.*master" | sed s:origin/:: |xargs -n 1 git push origin --delete 

您可以测试将删除哪些分支替换git push origin --delete with echo

git branch -r --merged origin/master | grep -v "^.*master" | sed s:origin/:: |xargs -n 1 echo

答案 10 :(得分:12)

我使用以下Ruby脚本删除已合并的本地和远程分支。如果我正在为具有多个遥控器的存储库执行此操作并且只想从一个存储库中删除,我只需将一个select语句添加到遥控器列表中以仅获取我想要的遥控器。

#!/usr/bin/env ruby

current_branch = `git symbolic-ref --short HEAD`.chomp
if current_branch != "master"
  if $?.exitstatus == 0
    puts "WARNING: You are on branch #{current_branch}, NOT master."
  else
    puts "WARNING: You are not on a branch"
  end
  puts
end

puts "Fetching merged branches..."
remote_branches= `git branch -r --merged`.
  split("\n").
  map(&:strip).
  reject {|b| b =~ /\/(#{current_branch}|master)/}

local_branches= `git branch --merged`.
  gsub(/^\* /, '').
  split("\n").
  map(&:strip).
  reject {|b| b =~ /(#{current_branch}|master)/}

if remote_branches.empty? && local_branches.empty?
  puts "No existing branches have been merged into #{current_branch}."
else
  puts "This will remove the following branches:"
  puts remote_branches.join("\n")
  puts local_branches.join("\n")
  puts "Proceed?"
  if gets =~ /^y/i
    remote_branches.each do |b|
      remote, branch = b.split(/\//)
      `git push #{remote} :#{branch}`
    end

    # Remove local branches
    `git branch -d #{local_branches.join(' ')}`
  else
    puts "No branches removed."
  end
end

答案 11 :(得分:10)

如何在PowerShell控制台中删除合并的分支

git branch --merged | %{git branch -d $_.Trim()}

如果要排除或任何其他分支名称,可以像这样使用PowerShell Select-String进行管道传输,并将结果传递给git branch -d

git branch -d $(git branch --merged | Select-String -NotMatch "master" | %{$_.ToString().Trim()})

答案 12 :(得分:8)

kuboon的回答错过了删除分支名称中包含master一词的分支。 以下改进了他的答案:

git branch -r --merged | grep -v "origin/master$" | sed 's/\s*origin\///' | xargs -n 1 git push --delete origin

当然,它不会删除“master”分支本身:)

答案 13 :(得分:8)

Git中没有自动执行此操作的命令。但是你可以编写一个使用Git命令的脚本来为你提供所需的东西。这可以通过多种方式完成,具体取决于您使用的分支模型。

如果您需要知道某个分支是否已合并为master,如果myTopicBranch已合并,则以下命令将不会产生任何输出(即您可以将其删除)

$ git rev-list master | grep $(git rev-parse myTopicBranch)

您可以使用Git branch命令解析Bash中的所有分支,并在所有分支上执行for循环。在此循环中,您可以使用上面的命令检查是否可以删除分支。

答案 14 :(得分:6)

git branch --merged | grep -Ev '^(. master|\*)' | xargs -n 1 git branch -d将删除除当前已检出分支和/或master之外的所有本地分支。

对于那些希望了解这些命令的人来说,这是一篇有用的文章:Git Clean: Delete Already Merged Branches, by Steven Harman

答案 15 :(得分:5)

Adam's updated answer的别名版本:

[alias]
    branch-cleanup = "!git branch --merged | egrep -v \"(^\\*|master|dev)\" | xargs git branch -d #"

另外,请参阅this answer以获取有关转义复杂别名的方便提示。

答案 16 :(得分:5)

您可以使用git-del-br tool

git-del-br -a

您可以使用

通过pip进行安装
pip install git-del-br

P.S:我是这个工具的作者。欢迎任何建议/反馈。

答案 17 :(得分:4)

尝试以下命令:

  

git branch -d $(git branch --merged | grep -vw $(git rev-parse --abbrev-ref HEAD))

使用git rev-parse将获取the current branch name以排除它。如果您收到错误,则表示没有要删除的本地分支。

要对远程分支执行相同操作(使用您的远程名称更改origin),请尝试:

  

git push origin -vd $(git branch -r --merged | grep -vw $(git rev-parse --abbrev-ref HEAD) | cut -d/ -f2)

如果您有多个遥控器,请在grep origin |之前添加cut,以仅过滤origin

如果上述命令失败,请先尝试删除合并的远程跟踪分支:

  

git branch -rd $(git branch -r --merged | grep -vw $(git rev-parse --abbrev-ref HEAD))

然后再次git fetch遥控器,再次使用上一个git push -vd命令。

如果您经常使用它,请考虑在~/.gitconfig文件中添加别名。

如果您错误地删除了某些分支,请使用git reflog查找丢失的提交。

答案 18 :(得分:4)

以下查询适用于我

for branch in  `git branch -r --merged | grep -v '\*\|master\|develop'|awk 'NR > 0 {print$1}'|awk '{gsub(/origin\//, "")}1'`;do git push origin --delete $branch; done

这将过滤grep管道中的任何给定分支。

适用于http克隆,但对于ssh连接效果不佳。

答案 19 :(得分:4)

我使用git-flow esque命名方案,所以这对我来说非常安全:

fix/

它基本上查找以字符串feature/或{{1}}开头的合并提交。

答案 20 :(得分:4)

基于我做出的一些答案my own Bash script to do it too

它使用git branch --mergedgit branch -d删除已合并的分支,并在删除之前提示您输入每个分支。

merged_branches(){
  local current_branch=$(git rev-parse --abbrev-ref HEAD)
  for branch in $(git branch --merged | cut -c3-)
    do
      echo "Branch $branch is already merged into $current_branch."
      echo "Would you like to delete it? [Y]es/[N]o "
      read REPLY
      if [[ $REPLY =~ ^[Yy] ]]; then
        git branch -d $branch
      fi
  done
}

答案 21 :(得分:4)

如果您要删除已经合并到当前分支的所有本地分支,那么我会根据之前的答案提出一个安全命令:

git branch --merged | grep -v \* | grep -v '^\s*master$' | xargs -t -n 1 git branch -d

此命令不会影响当前分支或主分支。它还会在使用xargs的-t标志之前告诉你它在做什么之前。

答案 22 :(得分:3)

对我来说git branch --merged不显示通过GitHub PR合并的分支。我不确定原因,但是我使用以下行删除所有没有远程跟踪分支的本地分支

diff <(git branch --format "%(refname:short)") <(git branch -r | grep -v HEAD | cut -d/ -f2-) | grep '<' | cut -c 3- | xargs git branch -D

说明:

  • git branch --format "%(refname:short)"给出了本地分支机构的列表
  • git branch -r | grep -v HEAD | cut -d/ -f2-给出了一个远程分支机构列表,过滤掉了HEAD
  • diff <(...) <(...)在括号内给出两个命令的输出差异
  • grep '<'过滤第一个列表中存在但第二个列表中不存在的分支
  • cut -c 3-给出从第3个字符开始的行,因此删除了前缀<
  • xargs git branch -D对每个分支名称执行git branch -D

或者,您可以避免像这样grep -v '<'

diff --old-line-format="%L" --new-line-format="" --unchanged-line-format="" <(git branch --format "%(refname:short)") <(git branch -r | grep -v HEAD | cut -d/ -f2-) | xargs git branch -D

答案 23 :(得分:3)

截至2018.07

将此添加到[alias]的{​​{1}}部分:

~/.gitconfig

现在,您只需调用sweep = !"f() { git branch --merged | egrep -v \"(^\\*|master|dev)\" || true | xargs git branch -d; }; f" 即可执行所需的清理工作。

答案 24 :(得分:3)

编写一个脚本,其中Git检出已合并为master的所有分支。

然后执行git checkout master

最后,删除合并的分支。

for k in $(git branch -ra --merged | egrep -v "(^\*|master)"); do
  branchnew=$(echo $k | sed -e "s/origin\///" | sed -e "s/remotes\///")
  echo branch-name: $branchnew
  git checkout $branchnew
done

git checkout master

for k in $(git branch -ra --merged | egrep -v "(^\*|master)"); do
  branchnew=$(echo $k | sed -e "s/origin\///" | sed -e "s/remotes\///")
  echo branch-name: $branchnew
  git push origin --delete $branchnew
done

答案 25 :(得分:2)

我用这个:

git branch --delete $(git branch --format '%(refname:short)' --merged | grep --invert-match 'main\|master\|branch-to-skip')

它以指定格式列出所有合并的分支,然后将该列表提供给 git branch --delete。

答案 26 :(得分:2)

接受的解决方案非常好,但有一个问题是它还删除了尚未合并到远程的本地分支。

如果你查看输出,你会看到类似

的内容
$ git branch --merged master -v
  api_doc                  3a05427 [gone] Start of describing the Java API
  bla                      52e080a Update wording.
  branch-1.0               32f1a72 [maven-release-plugin] prepare release 1.0.1
  initial_proposal         6e59fb0 [gone] Original proposal, converted to AsciiDoc.
  issue_248                be2ba3c Skip unit-for-type checking. This needs more work. (#254)
  master                   be2ba3c Skip unit-for-type checking. This needs more work. (#254)

分支blaissue_248是本地分支,将以静默方式删除。

但是你也可以看到单词[gone],它表示已被推送到遥控器的分支(现在已经消失),因此表示可以删除分支。

因此可以将原始答案更改为(拆分为多行以缩短行长)

git branch --merged master -v | \
     grep  "\\[gone\\]" | \
     sed -e 's/^..//' -e 's/\S* .*//' | \
      xargs git branch -d

保护尚未合并的分支机构。 此外,还不需要为主人保护它来保护它,因为它有一个远程原点并且不会显示为已经消失。

答案 27 :(得分:2)

在安装了git bash的Windows上,egrep -v将无效

null

其中git branch --merged | grep -E -v "(master|test|dev)" | xargs git branch -d 相当于grep -E -v

使用egrep -v删除已经合并的分支或 -d删除未合并分支

答案 28 :(得分:1)

为了避免从master以外的任何其他分支意外运行命令,我使用以下bash脚本。否则,从已关闭master的分支运行git branch --merged | grep -v "\*" | xargs -n 1 git branch -d可能会删除主分支。

#!/bin/bash

branch_name="$(git symbolic-ref HEAD 2>/dev/null)" ||
branch_name="(unnamed branch)"     # detached HEAD
branch_name=${branch_name##refs/heads/}

if [[ $branch_name == 'master' ]]; then
   read -r -p "Are you sure? [y/N] " response
   if [[ $response =~ ^([yY][eE][sS]|[yY])$ ]]; then
       git branch --merged | grep -v "\*" | xargs -n 1 git branch -d
   fi
else
   echo "Refusing to delete branches that are not merged into '$branch_name'. Checkout master first."
fi

答案 29 :(得分:1)

来自 git cleanup

git-toolbelt 脚本 <块引用>

删除所有已经合并到master或 发展。保持其他分支位于周围。删除将是最保守的。

删除本地和远程源中的分支。

答案 30 :(得分:1)

$ git config --global alias.cleanup
'!git branch --merged origin/master | egrep -v "(^\*|master|staging|dev)" | xargs git branch -d'

(为了便于阅读,分成多行)

调用“ git cleanup”将删除已经合并到原始服务器/主服务器中的本地分支。它跳过了master,staging和dev,因为在正常情况下我们不想删除它们。

打破这一点,这就是它的作用:

  1. git config --global alias.cleanup
    • 这将创建一个名为“ cleanup”的全局别名(遍及您的所有存储库)
  2. 命令开头的!表示我们将使用一些非git命令作为此别名的一部分,因此我们需要在此处实际运行bash命令
  3. git branch --merged origin/master
    • 此命令返回已经合并到origin/master中的分支名称列表
  4. egrep -v "(^\*|master|staging|dev)"
    • 这将从已经合并的分支列表中删除master,staging和dev分支。我们不想删除这些分支,因为它们不是功能。
  5. xargs git branch -d
    • 这将为每个未合并的分支运行git branch -d xxxxx命令。这样会一一删除本地分支。

答案 31 :(得分:1)

为此创建了python脚本:

import sys
from shutil import which
import logging
from subprocess import check_output, call

logger = logging.getLogger(__name__)

if __name__ == '__main__':
    if which("git") is None:
        logger.error("git is not found!")
        sys.exit(-1)

    branches = check_output("git branch -r --merged".split()).strip().decode("utf8").splitlines()
    current = check_output("git branch --show-current".split()).strip().decode("utf8")
    blacklist = ["master", current]

    for b in branches:
        b = b.split("/")[-1]

        if b in blacklist:
            continue
        else:
            if input(f"Do you want to delete branch: '{b}' [y/n]\n").lower() == "y":
                call(f"git branch -D {b}".split())
                call(f"git push --delete origin {b}".split())

答案 32 :(得分:1)

我发现最简单的方法是仅删除本地分支,而不删除远程分支:

$ git branch --merged | grep -v master | xargs -n 1 git branch -D

此命令将仅删除已经合并到您的主分支中的分支。如果您不想删除其他分支,例如staging,请小心。

答案 33 :(得分:1)

对于Windows,您可以安装Cygwin并使用以下命令删除所有远程分支:

git branch -r --merged | "C:\cygwin64\bin\grep.exe" -v master | "C:\cygwin64\bin\sed.exe" 's/origin\///' | "C:\cygwin64\bin\xargs.exe" -n 1 git push --delete origin

答案 34 :(得分:1)

如果将OhMyZSHgit plugin结合使用,则可以使用gbda别名。

答案 35 :(得分:1)

注意:我对以前的答案不满意(不适用于所有系统,不适用于远程,未指定--merged分支,未完全过滤)。因此,我添加了自己的答案。

主要有两种情况:

本地

您要删除已经已合并到另一个本地分支的本地分支。删除期间,您想要保留一些重要的分支,例如master,develop等。

git branch --format "%(refname:short)" --merged master | grep -E -v '^master$|^feature/develop$' | xargs -n 1 git branch -d

注释

  • git branch output --format“ ..”用于去除空格并允许精确的grep匹配
  • 使用
  • grep -E代替 egrep,因此它也可以在没有egrep的系统(即Windows的git)中使用。
  • grep -E -v '^master$|^feature/develop$'用于指定我不想删除的本地分支
  • xargs -n 1 git branch -d:执行本地分支的删除(对远程分支无效)
  • 当然,如果您尝试删除当前已签出的分支,则会收到错误消息。因此,我建议您预先转换为大师。

远程

您要删除已已合并到另一个远程分支的远程分支。在删除过程中,您想保留一些重要的分支,例如HEAD,master,发行版等。

git branch -r --format "%(refname:short)" --merged origin/master | grep -E -v '^*HEAD$|^*/master$|^*release' | cut -d/ -f2- | xargs -n 1 git push --delete origin

注释

  • 对于远程,我们使用-r选项并提供完整分支名称origin/master
  • grep -E -v '^*HEAD$|^*/master$|^*release'用于匹配我们不想删除的远程分支。
  • cut -d/ -f2-:删除不需要的“ origin /”前缀,否则该前缀将由git branch命令打印出来。
  • xargs -n 1 git push --delete origin:执行远程分支的删除。

答案 36 :(得分:0)

假设我有一个名为upstream的远程和一个原点(GitHub样式,我的fork是起源,上游是上游)。

我不想从上游删除任何主人,HEAD或任何东西。我也不想删除开发分支,因为这是我们从中创建PR的公共分支。

列出所有远程分支,按合并的分支进行过滤:

git branch -r

从该列表中删除包含我知道在我不想删除的分支名称中的单词的行:

sed '/develop\|master\|HEAD\|upstream/d'

从引用名称中删除远程名称(origin / somebranch变为somebranch):

sed 's/.*\///'

使用xargs调用一行代码:

xargs git push --delete origin

将所有内容组合在一起得到:

git branch -r --merged | sed '/develop\|master\|HEAD\|upstream/d' |  sed 's/.*\///' | xargs git push --delete origin

这将让我只有一些我曾经参与过的分支,但还没有合并。然后你可以逐个删除它们,因为它们不应该太多。

找到你不再需要的分支:

git branch -ar

假设您找到要删除的branch1,branch2和branch3:

git push --delete origin branch1 branch2 branch3

答案 37 :(得分:0)

for b in $(git branch -a | grep -v "\(master\|remotes\)"); do \ 
git branch -D $b; done && git fetch -p

答案 38 :(得分:0)

要删除合并的分支,git-delete-merged-branches比Shell hacks更健壮,更方便。它还可以检测到基准合并和壁球合并。它的自述文件有more details

答案 39 :(得分:0)

如果您希望删除已合并的本地分支以及删除其遥控器,请选择我喜欢的单行:

git branch --merged | xargs -I_br -- sh -c 'git branch -d _br; git push origin --delete _br'

答案 40 :(得分:0)

答案 41 :(得分:0)

如果您使用的是Windows,则可以将Windows Powershell与Out-GridView配合使用(不幸的是,它现在已在Powershell Core中消失了),以获得一个不错的分支列表,并用鼠标选择要删除的分支: / p>

git branch --merged | Out-GridView -PassThru | % { git branch -d $_.Trim() }

enter image description here 单击确定后,Powershell会将此分支名称传递给git branch -d命令并将其删除 enter image description here

答案 42 :(得分:0)

  

这是删除git分支的方法

git branch -D BranchName

答案 43 :(得分:0)

我一直在使用以下方法在一个cmd中删除合并的本地和远程分支

我的bashrc文件中包含以下内容:

function rmb {
  current_branch=$(git branch --no-color 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/')
  if [ "$current_branch" != "master" ]; then
    echo "WARNING: You are on branch $current_branch, NOT master."
  fi
  echo "Fetching merged branches..."
  git remote prune origin
  remote_branches=$(git branch -r --merged | grep -v '/master$' | grep -v "/$current_branch$")
  local_branches=$(git branch --merged | grep -v 'master$' | grep -v "$current_branch$")
  if [ -z "$remote_branches" ] && [ -z "$local_branches" ]; then
    echo "No existing branches have been merged into $current_branch."
  else
    echo "This will remove the following branches:"
    if [ -n "$remote_branches" ]; then
      echo "$remote_branches"
    fi
    if [ -n "$local_branches" ]; then
      echo "$local_branches"
    fi
    read -p "Continue? (y/n): " -n 1 choice
    echo
    if [ "$choice" == "y" ] || [ "$choice" == "Y" ]; then
      # Remove remote branches
      git push origin `git branch -r --merged | grep -v '/master$' | grep -v "/$current_branch$" | sed 's/origin\//:/g' | tr -d '\n'`
      # Remove local branches
      git branch -d `git branch --merged | grep -v 'master$' | grep -v "$current_branch$" | sed 's/origin\///g' | tr -d '\n'`
    else
      echo "No branches removed."
    fi
  fi
}

原始source

这不会删除master分支,但是会删除合并的本地和远程分支。将其保存在rc文件中后,只需运行rmb,就会看到丢失的合并分支,这些分支将被清除并要求确认操作。您也可以修改代码以不要求再次确认,但是最好保留它。

答案 44 :(得分:0)

My Bash script contribution基于mmrobin's answer

它需要一些有用的参数来指定包含和排除,或者只检查/删除本地或远程分支,而不是两者。

glDrawElements(GL_TRIANGLES, 3, GL_FLOAT, 0);

答案 45 :(得分:0)

如果您使用的是分支模型,如HubFlow或GitFlow,您可以使用此命令删除合并的功能分支:

git branch --merged | grep feature.* | grep -v "\*" | xargs -n 1 git branch -d

答案 46 :(得分:0)

Windoze友好的Python脚本(因为git-sweep在Wesnoth存储库上被阻塞):

#!/usr/bin/env python
# Remove merged git branches. Cross-platform way to execute:
#
#   git branch --merged | grep -v master | xargs git branch -d
#
# Requires gitapi - https://bitbucket.org/haard/gitapi
# License: Public Domain

import gitapi

repo = gitapi.Repo('.')
output = repo.git_command('branch', '--merged').strip()
for branch in output.split('\n'):
  branch = branch.strip()
  if branch.strip(' *') != 'master':
    print(repo.git_command('branch', '-d', branch).strip())

https://gist.github.com/techtonik/b3f0d4b9a56dbacb3afc

答案 47 :(得分:0)

要删除已合并到主分支的本地分支,我使用以下别名(git config -e --global):

cleanup = "!git branch --merged master | grep -v '^*\\|master' | xargs -n 1 git branch -D"

我正在使用git branch -D来避免error: The branch 'some-branch' is not fully merged.消息,而我当前的结帐与主分支不同。

答案 48 :(得分:-1)

鉴于您要删除合并的分支,除非另有说明,否则仅需要删除远程跟踪分支。

因此,要删除这些分支,您可以通过

git branch --remote --merged origin/master | egrep -v "(^\*|master|development)" | cut -b 10- | xargs git push --delete origin

这将删除除masterdevelopment之外的所有合并分支(合并到主分支)。