关于 git-flow-next
这是一份在采用 classic 预设的仓库中使用 Gitflow CLI git-flow-next 的操作指南,涵盖安装、分支生命周期和旧版分支迁移。它规定功能分支先整理为单个提交再变基,以保留作者信息。
主要功能
- 01通过 mise 安装 git-flow-next
- 02初始化 classic 预设
- 03功能、发布、热修复与缺陷分支流程
- 04功能分支单提交变基策略
- 05从旧版 git-flow 分支迁移
适用场景
- 01在仓库中设置 Gitflow 分支
- 02将功能分支整理为单个提交并变基
- 03创建并完成发布或热修复分支
- 04替换已安装的旧版 git-flow 二进制文件
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ petr-korobeinikov/ skills --skill git-flow-next安装后在 Claude Code 中输入/git-flow-next确认已加载。
详细介绍
git-flow-next
git-flow-next(https://git-flow.sh/,仓库 gittower/git-flow-next)
是本技能适用的 Gitflow CLI——
不包括其他 git-flow 分支版本。
不要与已弃用的分支版本混淆
这两款旧工具也会提供 git-flow 二进制文件,
因此很容易混淆。
nvie/gitflow— 2010 年前后的原始 shell 脚本, 十多年来无人维护。petervanderdoes/gitflow-avh— AVH 分支版本, 已不再积极开发。
如果 command -v git-flow 指向 mise 的 shim 目录之外,
或者 brew list 显示 git-flow / git-flow-avh,
请在安装 git-flow-next 之前执行下方的从旧版 git-flow / gitflow-avh 迁移流程。
二进制文件名称(git-flow)相同;
在 $PATH 中只能有一个生效。
硬性规则
-
只允许使用 git-flow-next。 不得使用
nvie/gitflow、gitflow-avh或任何 shell 脚本分支版本。 -
必须通过 mise 的 aqua 后端安装,遵循
mise技能的要求 — 在mise.toml中固定为aqua:gittower/git-flow-next, 并记录在mise.lock中。 此处必须使用显式的aqua:前缀, 覆盖mise技能对裸名称的偏好: 裸名称git-flow在 mise 的注册表中存在歧义 (旧版nvie/gitflow和gitflow-avh也使用这个名称), 因此,直接指定 aqua 软件包是确保使用 git-flow-next 的唯一方式。 不得使用brew install git-flow-next、 不得手动下载二进制文件、 不得使用go install。 -
功能分支的上游合并策略必须是变基为单个提交。 分支会在完成之前合并为一个手写说明的提交(而非由合并工具完成), 这样可以保留原始作者信息,也不会把每个 WIP 提交的说明拼接到
develop上。 每个仓库只在一个地方执行一次:- 本地完成工作流 —
设置
gitflow.branch.feature.upstreamstrategy = rebase, 使git flow feature finish将功能分支线性变基到develop, 不创建合并提交。 贡献者负责先将分支合并为单个提交 (运行git rebase -i $(git merge-base HEAD develop),对 第一个提交以外的每个提交使用fixup,然后写一条干净的说明), 再运行git flow feature finish。 不要使用upstreamstrategy = squash— 它会创建一个没有原始作者信息的新提交,并默认拼接所有提交说明, 而这正是本策略要避免的行为。 - PR 审查工作流 —
不设置该键,并将托管平台的 PR 合并按钮配置为变基并合并
(不要选“压缩并合并”,也不要直接“创建合并提交”)。
贡献者在请求审查之前,先在本地将分支合并为单个提交
(如上所述进行交互式变基),
这样合入
develop的就是他们编写的一条干净提交。 托管平台的“压缩并合并”不可作为替代方案 — 默认情况下,它会将每个提交的说明拼接到提交正文中, 而且根据平台设置, 生成的提交可能会将合并者而非贡献者标为作者。 合并者必须在每个 PR 上手动覆盖这两项设置。
每个仓库选择一种方式; 混用会导致重复应用或失败。 发布和热修复保留默认的
merge策略, 以确保合并提交与版本标签保持对应。 - 本地完成工作流 —
设置
-
使用
classic预设。main和develop是长期存在的分支; 主题前缀为feature/、release/、hotfix/、bugfix/。 其他预设(github、gitlab)不在本技能范围内 — 如果项目明确要求使用其中一种, 请参阅 git-flow-next 上游文档, 不要应用本技能的其余内容。
根据文档核实记忆
git-flow-next 还很新,不同版本之间会更改标志名称、配置键和预设行为。 如果以下任何内容——命令标志、配置键、预设内容、二进制文件名称、版本可用性——看起来陌生或已过时,请在编写配置或运行命令前,前往 https://git-flow.sh/docs 核实。 不要猜测。
流程:通过 mise 安装
本技能说明要安装什么;
mise 技能规定如何安装——
创建包含必需 [settings] 区块的 mise.toml、
运行 mise trust / mise install / mise ls、
处理锁文件,
以及提交更改。
如果项目尚未使用 mise,
请先运行 mise 技能的设置流程;
不要在此重复其步骤。
git-flow-next 专属步骤:
-
选择一个固定版本 (发布版本: https://github.com/gittower/git-flow-next/releases)。
-
通过显式的
aqua:后端, 在mise.toml的[tools]下添加条目——pkgs/gittower/git-flow-nextaqua 软件包会提供一个git-flow二进制文件, 硬性规则 2 解释了为什么此处不能安全地使用裸名称:[tools] "aqua:gittower/git-flow-next" = "1.1.0" -
按照
mise技能运行安装后, 专门验证 git-flow-next:git flow version
它应显示固定版本。
如果显示其他版本,
说明另一个 git-flow 二进制文件正在 $PATH 中遮蔽 mise 管理的版本——
使用 command -v git-flow 找到它并将其移除
(常见原因是通过 Homebrew 安装了旧版
git-flow 或 git-flow-avh)。
流程:初始化仓库
在仓库根目录运行。
classic 预设会配置 Gitflow 分支和前缀:
main ← develop ← feature/,
以及 release/、hotfix/、bugfix/。
--defaults 会跳过交互式提示。
git flow init --preset=classic --defaults
如果生产分支不是 main,
或任何分支/前缀需要使用不同名称,
请去掉 --defaults 并传入文档中说明的覆盖项
(--main=master、--develop=…、--feature=feat/ 等)。
然后,在本地完成工作流(硬性规则 3)中, 启用功能分支完成时的变基:
git config gitflow.branch.feature.upstreamstrategy rebase
在 PR 审查工作流中, 跳过此命令,改为将平台的 PR 合并按钮配置为“变基并合并”。
验证:
git config --get-regexp '^gitflow\.'
输出应列出预设的分支和前缀条目。
对于本地完成工作流,输出还必须包含
gitflow.branch.feature.upstreamstrategy rebase;
对于 PR 审查工作流,该键必须缺失。
流程:功能分支生命周期
以下流程描述的是本地完成工作流
(硬性规则 3):
贡献者先在本地将功能分支压缩为单个提交,
然后 git flow feature finish 会将该提交变基到 develop。
对于 PR 审核工作流,
请跳转到下方的替代流程。
开始:
git flow feature start <name>
这会从 develop 创建 feature/<name> 并检出该分支。
按常规在该分支上工作 —
提交;如有需要,可推送以备份或共享。
发布(可选,用于协作):
git flow feature publish <name>
压缩为单个提交(硬性规则 3):
在完成之前,
以当前 develop 为基准对功能分支进行交互式变基,
并将除第一个提交外的所有提交合并到第一个提交中,
然后将最终的提交消息改写为简洁、完整的摘要。
git rebase -i $(git merge-base HEAD develop)
# In the editor: keep the first line as `pick`,
# change every following line to `fixup` (drops their messages) or
# `squash` (keeps and lets you edit them).
# Save and exit; if you used `squash` or `reword`,
# the editor reopens for the final commit message —
# write a clean, self-contained summary.
如果现有提交消息都不值得保留,可使用以下等效快捷方式:
git reset --soft $(git merge-base HEAD develop)
git commit -m "<clean summary of the feature>"
压缩后,
git log develop..HEAD 应恰好显示一个提交。
完成:
git flow feature finish <name>
设置 upstreamstrategy=rebase 后,
该命令会:
- 切换到
develop, - 将(现在只有一个提交的)
feature/<name>线性地变基到develop— 不会创建合并提交, 并保留原作者信息和手写的提交消息, - 删除本地
feature/<name>分支。
之后推送 develop。不带参数的简写适用于当前分支:
git flow finish
如果跳过压缩步骤,
git flow feature finish 仍会执行变基,
但功能分支上的每个 WIP 提交都会作为单独的提交进入 develop —
这不符合本技能要求的策略。
finish 还会删除功能分支,
因此要恢复,就需要对 develop 本身进行交互式变基
(git rebase -i origin/develop),将新提交压缩为一个提交,
并且必须在推送之前完成 —
只有这些提交仍在本地时,这样做才安全。
不要跳过压缩步骤。
PR 审核替代流程
在 PR 审核工作流中(硬性规则 3),
变基合并由托管平台上的
“rebase and merge”按钮完成,
而不是通过 git flow feature finish。
贡献者仍须在创建或更新 PR 之前,
在本地将分支压缩为单个提交
(使用上述相同的 git rebase -i / git reset --soft 流程) —
否则多个提交会进入 develop,
从而违背该策略。
PR 合并后:
- 远程功能分支已被删除 (在常见设置下,平台会在合并时将其删除);
- 使用
git branch -d feature/<name>(或git flow feature delete <name>)删除本地副本; - 不要运行
git flow feature finish— 这会重复应用更改或导致失败。
流程:发布分支
发布分支保留默认的合并策略, 以便将合并提交与标签配对。
git flow release start 1.4.0
# bump version files, update changelog, commit
git flow release finish 1.4.0 --tag --message "release 1.4.0"
release finish 会合并到 main,
为合并创建标签,
将 main 合并回 develop,
并删除发布分支。
流程:热修复分支
git flow hotfix start 1.4.1
# fix, commit
git flow hotfix finish 1.4.1 --tag --message "hotfix 1.4.1"
hotfix finish 与 release finish 类似:
合并到 main,
创建标签,
将 main 合并回 develop,
并删除热修复分支。
流程:缺陷修复分支
缺陷修复分支和功能分支一样,以 develop 为目标,
但仅用于非功能类缺陷;
生产环境修复应通过 hotfix 进行。
其生命周期与功能分支相同:
git flow bugfix start <name>
# fix, commit
git flow bugfix finish <name>
bugfix finish 使用默认的 merge 上游策略。
如果仓库希望像功能分支一样压缩缺陷修复分支
(硬性规则 3 中的本地完成工作流),
请设置相应的键,并遵循相同的“先压缩后完成”流程
(交互式变基 → 单个提交 → 完成):
git config gitflow.branch.bugfix.upstreamstrategy rebase
在 PR 审核工作流中,
将缺陷修复分支按功能分支处理 —
由平台执行变基合并,
不在本地运行 git flow bugfix finish。
迁移流程:从旧版 git-flow / gitflow-avh 迁移
当 command -v git-flow 指向 Homebrew 或手动安装的 nvie/gitflow 或 petervanderdoes/gitflow-avh,或者 brew list / apt list --installed 显示已安装 git-flow 或 gitflow-avh 时触发。
-
确认现有设置使用的是旧版分支:
command -v git-flow, 然后运行git-flow version— 旧版 AVH 分支会输出AVH Edition, nvie 的版本会输出类似0.4.x的版本号,且不带 Go/Tower 归属信息。 -
读取旧版 Gitflow 配置 — 仅提取分支名称和前缀名称, 不要原样重新应用。 旧版分支和 git-flow-next 使用不同的键结构 (旧版:
gitflow.branch.master、gitflow.prefix.feature; git-flow-next:gitflow.branch.<type>.parent、gitflow.branch.<type>.prefix), 因此不能直接重新应用捕获到的键 — 它们只能作为git flow init标志参数的取值来源:git config --get-regexp '^gitflow\.'记下
gitflow.branch.master、gitflow.branch.develop、gitflow.prefix.feature、gitflow.prefix.release、gitflow.prefix.hotfix和gitflow.prefix.bugfix的值。 -
删除旧版二进制文件:
- Homebrew:
brew uninstall git-flow或brew uninstall git-flow-avh。 - 手动安装:从其
$PATH所在位置删除二进制文件。
- Homebrew:
-
按照上述流程安装 git-flow-next。
-
重新运行
git flow init, 将第 2 步捕获的名称作为覆盖值传入 (若某个值已与 classic 预设默认值一致,则省略对应标志):git flow init --preset=classic \ --main=<captured master/main> \ --develop=<captured develop> \ --feature=<captured feature prefix> \ --release=<captured release prefix> \ --hotfix=<captured hotfix prefix> \ --bugfix=<captured bugfix prefix>如果捕获到的所有值都与 classic 默认值一致, 只需运行
git flow init --preset=classic --defaults。 -
按照工作流重新应用 rebase 设置(硬性规则 3):
- local-finish:
运行
git config gitflow.branch.feature.upstreamstrategy rebase, 并对每个功能分支执行先压缩再完成的流程 (交互式 rebase → 单个提交 →git flow feature finish); - PR-review: 跳过此配置, 将平台的 PR 合并按钮设置为“rebase and merge”, 并在创建 PR 之前在本地将功能分支压缩为单个提交。
- local-finish:
运行
-
验证
git flow version显示mise.toml中指定的 git-flow-next 版本, 并确认command -v git-flow指向~/.local/share/mise/(或 mise 放置 shim 的其他位置)。
报告
完成更改后,
说明新增或更新了 mise.toml 中的哪一项
(工具、后端、版本),
设置了哪些 gitflow.* 键,
删除了哪些旧版二进制文件,
以及用户接下来应运行的命令
(git flow version、
git flow feature start <name>,
或适合当前任务的其他命令)。