
开发工具CLI版本控制【免费下载链接】git-extrasGIT utilities -- repo summary, repl, changelog population, author commit percentages and more项目地址https://gitcode.com/gh_mirrors/gi/git-extras点击查看免费下载git-delete-merged-branches是 Git Extras 套件中的一个小而实用的清理工具它扫描当前HEAD下所有已合并的分支并自动安全删除同时通过默认分支保护机制避免误删主干。读完本文你将掌握该命令的完整行为模型、底层 Bash 实现原理、默认分支判定规则以及如何结合配套命令构建一套本地分支清理流程。命令概览SYNOPSIS该命令的使用形式极其简单不需要任何子命令或参数参见 man/git-delete-merged-branches.mdgit delete-merged-branches命令描述DESCRIPTION给出的核心语义是删除所有已合并到当前HEAD的分支。即使你当前正运行在某个默认分支的后代分支上它也不会删除默认分支本身。这一点是它区别于裸用git branch -d加循环脚本的关键安全设计。逐行拆解底层实现原理该命令的真实实现非常精炼完整源码位于 bin/git-delete-merged-branches全文件仅 7 行#!/usr/bin/env bash branches$(git branch --no-color --merged | grep -vE ^(\*|\) | grep -v $(git_extra_default_branch) | grep -v svn) if [ -n $branches ] then echo $branches | xargs git branch -d fi整个流程是一条清晰的处理管道分四步完成第 1 步列出所有已合并分支git branch --no-color --merged会列出当前HEAD中已合并的所有本地分支。--no-color至关重要它关掉了 Git 对分支名的颜色渲染保证后续grep与xargs拿到的是纯净的裸分支名否则带 ANSI 转义序列的文本会把整条管道搅乱。Git Extras 的 History.md 显示这一选项是在一次专门提交中为git-delete-merged-branches添加的。第 2 步排除当前分支与默认分支grep -vE ^(\*|\) | grep -v $(git_extra_default_branch)grep -vE ^(\*|\)过滤掉以*当前检出分支或checkout 检出时标记的分支开头的行grep -v $(git_extra_default_branch)过滤掉默认分支名这是防止误删主干的核心防线由于--merged的结果中当前分支本身也必然已合并如果不过滤git branch -d会直接报错所以这一过滤既是安全需要也是正确性需要。第 3 步排除 svn 相关分支grep -v svn过滤掉任何名称中包含svn的分支。这是为了兼容 git-svn 工作流——这类分支往往有特殊的管理语义不应被批量清理。第 4 步逐个安全删除echo $branches | xargs git branch -d关键点在于这里使用的是-d安全删除而非-D强制删除只有当分支确实已合并到当前HEAD时-d才允许删除否则 Git 会拒绝并报错。xargs按行将分支名批量传给git branch -d由于上一步已用--no-color净化了输出分支名之间不会出现误切分问题。另外注意一个细节整个删除动作被if [ -n $branches ]包裹即没有已合并分支时命令静默退出不会抛出任何错误。仓库 History.md 记录了该命令历史上曾因无分支可删时 xargs 报错的问题而改用xargs -r的历史最终演变为当前这种先判空再执行的稳健写法。默认分支判定从 master 到 main 的配置化演进前述第 2 步用到的git_extra_default_branch是一个通用工具函数定义在 helper/git-extra-utilitygit_extra_default_branch() { local extras_default_branch init_default_branch extras_default_branch$(git config --get git-extras.default-branch) init_default_branch$(git config --get init.defaultBranch) if [ -n $extras_default_branch ]; then echo $extras_default_branch elif [ -n $init_default_branch ]; then echo $init_default_branch else echo main fi }判定优先级清晰git config git-extras.default-branchGit Extras 专属配置优先级最高git config init.defaultBranchGit 2.28 自带的默认分支初始化配置作为回退main两项均未配置时的内置兜底值。仓库 Readme.md 明确指出自 Git Extras 6.4 起git delete-merged-branches等一批命令还包括git archive-file、git delta、git pull-request、git show-merged-branches、git show-unmerged-branches、git squash假定的默认分支名已从master改为main。如果你的仓库主分支仍是master需要显式配置否则默认分支保护会失效、存在误删风险# 方式一Git Extras 专属配置优先生效 git config git-extras.default-branch master # 方式二Git 全局配置被方式一覆盖 git config init.defaultBranch master实战示例在包含若干已合并功能分支的仓库中直接运行示例输出参见 Commands.md$ git delete-merged-branches Deleted feature/themes (was c029ab3). Deleted feature/live_preview (was a81b002). Deleted feature/dashboard (was 923befa). ...每行输出遵循 Git 标准格式Deleted 分支名 (was 短哈希)你可以据此核对被删分支对应的提交便于事后追溯。运行前建议先预览。由于git delete-merged-branches本身没有--dry-run选项可先使用同套件中的git show-merged-branches命令说明见 man/git-show-merged-branches.md查看将要被清理的对象$ git show-merged-branches feature/themes feature/live_preview feature/dashboard该命令的内部实现bin/git-show-merged-branches与删除命令共享同一套已合并 排除默认分支的筛选逻辑只是最后以只读方式输出分支名git branch --no-color --merged | grep -v \* | grep -v $(git_extra_default_branch) | tr -d 所以一个稳妥的清理流程是先git show-merged-branches确认清单再执行git delete-merged-branches落地删除。运行环境与依赖安装与依赖说明详见 Installation.md。该命令的运行前提为bash 4.0macOS 自带的旧版 bash 可能过老需brew install bash升级Git 2.17xargs命令列表中的必备依赖项git delete-merged-branches、git-force-clone、git-sed、git-scp等命令均依赖它。在 Debian/Ubuntu、Fedora、openSUSE、RHEL/CentOS 等发行版上均可通过系统包管理器直接安装 git-extras例如sudo apt install git-extras或sudo dnf install git-extras。常见问题与注意事项1. 为什么有时一个分支明明合并过却没被删该命令的判定基准是当前检出的HEAD。git branch --merged只反映分支的所有提交已可达于当前 HEAD因此若分支只是合入了其他分支而非当前 HEAD它不会被识别为可删若当前位于旧分支上可能只有极少数分支符合条件。想清理合入指定分支的分支可改用配套的git delete-squashed-branches 分支名用法见 Commands.md。2. 会不会误删主分支不会前提是默认分支判定配置正确。命令内置了三重保护过滤默认分支名、过滤 svn 分支、使用-d安全删除。唯一需要警惕的场景是仓库默认分支不是main且未配置git-extras.default-branch/init.defaultBranch——此时默认分支会被当作普通已合并分支参与筛选。因此建议在master主分支的仓库上先执行上文给出的配置命令。3. 删除能否撤销git branch -d删除的只是引用提交对象仍保留在对象库中直到被git gc回收。若误删可通过git reflog找回分支的短哈希后重建git branch 分支名 短哈希4. 为什么与git delete-gone-branches不同两者都属于分支清理类命令但针对不同场景详见 Commands.mdgit delete-merged-branches清理已合并入当前 HEAD的本地分支git delete-gone-branches清理远程跟踪分支已消失git branch -vv中标记为[gone]的本地分支且自带--dry-run预览选项。实践中两者互补前者处理工作已完成的分支后者处理上游已被删除的残留分支。小结git delete-merged-branches以 7 行 Bash 实现了一个语义明确、防护完备的清理命令--no-color保证管道纯净、grep -v链路排除当前分支/默认分支/svn 分支、git branch -d兜底安全删除。结合 helper/git-extra-utility 中可配置的默认分支判定逻辑以及git show-merged-branches的只读预览配合它足以成为你日常维护本地仓库、控制分支膨胀的高频工具。赞分享开发工具CLI版本控制【免费下载链接】git-extrasGIT utilities -- repo summary, repl, changelog population, author commit percentages and more项目地址https://gitcode.com/gh_mirrors/gi/git-extras点击查看免费下载相关推荐AutoRAG 文档地图RAG AutoML 工具的数据创建、管线优化与部署指南AutoRAG 文档地图RAG AutoML 工具的数据创建、管线优化与部署指南 AutoRAG 是一个面向“你自己的数据”的 RAGRetrieval A教程文档5分钟上手SubsAI新手必备的AI字幕生成工具使用教程5分钟上手SubsAI新手必备的AI字幕生成工具使用教程 SubsAI是一款强大的AI字幕生成工具它结合了Web界面、命令行工具和Python包的优势借助Git Delete Merged Branches 项目教程Git Delete Merged Branches 项目教程 1. 项目介绍 git delete merged branches 是一个开源项目旨在帮助开上一篇Rocker-Bogie悬挂系统如何让六轮机器人征服极限地形下一篇LaTeX论文提交arXiv的终极清理指南轻松解决50MB限制创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考