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

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

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

解决方法

更新: 如果您的工作流程可能将其作为祖先,则可以添加其他分支以排除像master和dev这样的分支。通常,我从\“ sprint-start \”标签分支出来,而master,dev和qa不是祖先。 首先,列出所有在远程中合并的分支。
git branch --merged
您可能会看到几个不想删除的分支。我们可以添加一些参数来跳过不想删除的重要分支,例如master或developer。以下命令将跳过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
希望这可以帮助。     ,要删除远程上已合并的所有分支:
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
UPDATE(@oliver;由于不适合注释,但已经有足够的答案了):如果您在分支ABC上,则ABC将出现在
git branch -r --merged
的结果中,因为未指定该分支,因此该分支默认为当前分支,并且分支始终有资格合并到自身(因为分支与自身之间没有区别!)。 因此,要么指定分支:
git branch -r --merged master | grep -v master ...
或第一个结帐管理员:
git checkout master | git branch -r --merged | grep -v ...
    ,只是扩大了亚当的回答: 运行running16将其添加到您的Git配置中
[alias]
    cleanup = \"!git branch --merged | grep  -v \'\\\\*\\\\|master\\\\|develop\' | xargs -n 1 git branch -d\"
然后,您可以通过简单的
git cleanup
删除所有本地合并分支。     ,这也适用于删除除master以外的所有合并分支。
git branch --merged | grep -v \'^* master$\' | grep -v \'^  master$\' | xargs git branch -d
    ,您将要从这些命令中排除
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
    ,对于那些使用Windows并喜欢PowerShell脚本的用户,以下是一种删除本地合并分支的方法:
function Remove-MergedBranches
{
  git branch --merged |
    ForEach-Object { $_.Trim() } |
    Where-Object {$_ -NotMatch \"^\\*\"} |
    Where-Object {-not ( $_ -Like \"*master\" )} |
    ForEach-Object { git branch -d $_ }
}
    ,我已经使用亚当的答案多年了。就是说,在某些情况下,它的行为不符合我的预期: 包含单词“ master”的分支被忽略,例如\“ notmaster \”或\“ masterful \”,而不是仅master分支 包含单词“ dev”的分支被忽略,例如\“ dev-test \”,而不只是dev分支 删除当前分支的HEAD可以访问的分支(即不一定是主节点) 在分离的HEAD状态下,从当前提交中删除每个可到达的分支 1和2很容易解决,只是对正则表达式进行了更改。 3取决于您想要的内容(即,仅删除尚未合并到master或当前分支中的分支)。 如果您无意中以分离的HEAD状态运行此命令,则4可能会造成灾难性的后果(尽管可以用
git reflog
恢复)。 最后,我希望所有这些都在一个单一的代码中,不需要单独的(Bash | Ruby | Python)脚本。 TL; DR 创建一个git别名\“ sweep \”,它接受可选的
-f
标志:
git config --global alias.sweep \'!git branch --merged $([[ $1 != \"-f\" ]] \\
&& git rev-parse master) | egrep -v \"(^\\*|^\\s*(master|develop)$)\" \\
| xargs git branch -d\'
并使用以下命令调用它:
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 \\”和\“ 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
这仅仅是因为如果没有另外指定,ѭ43the默认为当前分支的HEAD。至少对于我的工作流,除非本地分支已合并到主分支,否则我不希望删除它们,因此我更喜欢以下变体:
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 \'!git branch --merged $([[ $1 != \"-f\" ]] \\
&& git rev-parse master) | egrep -v \"(^\\*|^\\s*(master|develop)$)\" \\
| xargs git branch -d\'
别名接受可选的“ 27”标志。默认行为是仅删除已合并到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).
    ,Git Sweep在这方面做得很好。     ,使用Git 2.5.0版本:
git branch -d `git branch --merged`
    ,您可以将提交添加到--merged选项。 这样,您可以确保仅删除合并到原始/母版中的分支 以下命令将从您的来源中删除合并的分支。
git branch -r --merged origin/master | grep -v \"^.*master\" | sed s:origin/:: |xargs -n 1 git push origin --delete 
您可以测试将删除哪些分支,将git push origin --delete替换为echo
git branch -r --merged origin/master | grep -v \"^.*master\" | sed s:origin/:: |xargs -n 1 echo
    ,我使用以下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
    ,如何在PowerShell控制台中删除合并的分支
git branch --merged | %{git branch -d $_.Trim()}
如果要排除主名称或任何其他分支名称,则可以使用PowerShell这样的PowerShell Select-String进行管道传输并将结果传递给
git branch -d
git branch -d $(git branch --merged | Select-String -NotMatch \"master\" | %{$_.ToString().Trim()})
    ,kuboon的答案缺少删除分支名称中包含单词master的分支。 以下是对他的回答的改进:
git branch -r --merged | grep -v \"origin/master$\" | sed \'s/\\s*origin\\///\' | xargs -n 1 git push --delete origin
当然,它不会删除\“ master \”分支本身:)     ,Git中没有命令可以自动为您执行此操作。但是您可以编写一个使用Git命令的脚本,以提供所需的内容。根据您使用的分支模型,可以通过多种方式完成此操作。 如果您需要知道分支是否已合并到master中,则如果myTopicBranch已合并,则以下命令将不会产生任何输出(即,您可以将其删除)
$ git rev-list master | grep $(git rev-parse myTopicBranch)
您可以使用Git branch命令并解析Bash中的所有分支,并在所有分支上进行
for
循环。在此循环中,使用上述命令检查是否可以删除分支。     ,
git branch --merged | grep -Ev \'^(. master|\\*)\' | xargs -n 1 git branch -d
将删除除当前检出的分支和/或
master
以外的所有本地分支。 这是对那些希望了解这些命令的人的有用文章:Git Clean:删除已合并的分支,作者:史蒂文·哈曼(Steven Harman)。     ,您可以使用
git-del-br
工具。
git-del-br -a
您可以使用
pip
安装
pip install git-del-br
附注:我是该工具的作者。欢迎任何建议/反馈。     ,如果您想删除已经合并到您当前所在的分支中的所有本地分支,那么基于较早的答案,我想出了一个安全的命令来执行此操作:
git branch --merged | grep -v \\* | grep -v \'^\\s*master$\' | xargs -t -n 1 git branch -d
此命令不会影响您当前的分支或主分支。它还使用xargs的-t标志告诉您它在做什么之前。     ,亚当\\的别名版本的更新答案:
[alias]
    branch-cleanup = \"!git branch --merged | egrep -v \\\"(^\\\\*|master|dev)\\\" | xargs git branch -d #\"
另外,请参阅此答案以获取有关转义复杂别名的便捷提示。     ,我使用git-flow esque命名方案,因此这对我来说非常安全:
git branch --merged | grep -e \"^\\s\\+\\(fix\\|feature\\)/\" | xargs git branch -d
它基本上查找以字符串
fix/
feature/
开头的合并提交。     ,尝试以下命令:   
git branch -d $(git branch --merged | grep -vw $(git rev-parse --abbrev-ref HEAD))
通过使用
git rev-parse
将获得当前分支名称以将其排除。如果收到错误,则意味着没有要删除的本地分支。 要对远程分支机构执行相同操作(用您的远程名称更改
origin
),请尝试:   
git push origin -vd $(git branch -r --merged | grep -vw $(git rev-parse --abbrev-ref HEAD) | cut -d/ -f2)
如果您有多个遥控器,请在
cut
之前加上
grep origin |
以仅过滤
origin
。 如果以上命令失败,请尝试首先删除合并的远程跟踪分支:   
git branch -rd $(git branch -r --merged | grep -vw $(git rev-parse --abbrev-ref HEAD))
然后再次
git fetch
遥控器并再次使用前面的
git push -vd
命令。 如果您经常使用它,请考虑将其作为别名添加到
~/.gitconfig
文件中。 如果您错误地删除了一些分支,请使用
git reflog
查找丢失的提交。     ,基于这些答案,我也制作了自己的Bash脚本! 它使用
git branch --merged
git 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
}
    ,下面的查询对我有用
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连接则效果不佳。     ,截至2018.07 将其添加到
~/.gitconfig
[alias]
部分:
sweep = !\"f() { git branch --merged | egrep -v \\\"(^\\\\*|master|dev)\\\" || true | xargs git branch -d; }; f\"
现在您可以致电ѭ99进行所需的清理。     ,在安装了git bash的Windows上,egrep -v将不起作用
git branch --merged | grep -E -v \"(master|test|dev)\" | xargs git branch -d
其中
grep -E -v
等于
egrep -v
使用
-d
删除已合并的分支或
-D
删除未合并的分支     ,编写一个脚本,Git在其中检查出已合并到master的所有分支。 然后做ѭ105。 最后,删除合并的分支。
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
    ,公认的解决方案非常好,但是存在一个问题,即它还删除了尚未合并到远程中的本地分支。 如果您查看输出,将会看到类似
$ 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)
分支
bla
issue_248
是本地分支,将被静默删除。 但是您还可以看到单词“ 110”,表示分支已被推送到远程(现已消失),因此表示可以删除分支。 因此,原始答案可以更改为(分割成多行以缩短行长)
git branch --merged master -v | \\
     grep  \"\\\\[gone\\\\]\" | \\
     sed -e \'s/^..//\' -e \'s/\\S* .*//\' | \\
      xargs git branch -d
保护尚未合并的分支。 另外,也不需要为保护主机而对主机进行grepping操作,因为它起源远方,并且不会消失。     ,对我而言,
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
    ,为了避免从master以外的任何其他分支意外运行命令,我使用以下bash脚本。否则,从已关闭母版的分支中运行
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
    ,
$ git config --global alias.cleanup
\'!git branch --merged origin/master | egrep -v \"(^\\*|master|staging|dev)\" | xargs git branch -d\'
(分成多行以提高可读性) 调用\“ git cleanup \\”将删除已经合并到原始服务器/主服务器中的本地分支。它跳过了master,staging和dev,因为在正常情况下我们不想删除它们。 分解一下,这就是它的作用:
git config --global alias.cleanup
这将创建一个名为\“ cleanup \”的全局别名(跨所有存储库) 命令开头的ѭ129表示我们将使用一些非git命令作为此别名的一部分,因此我们需要在此处实际运行bash命令
git branch --merged origin/master
该命令返回已经合并到“ 131”的分支名称列表
egrep -v \"(^\\*|master|staging|dev)\"
这将从已合并的分支列表中删除master,staging和dev分支。我们不想删除这些分支,因为它们不是功能。
xargs git branch -d
这将为每个未合并的分支运行
git branch -d xxxxx
命令。这将一一删除本地分支。     ,要使用以下别名(master16ѭ)删除已合并到主分支I的本地分支:
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.
消息,而我当前的结帐与master分支不同。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-