Release Branch — 是 Git Flow 中的一个分支,从 develop 创建,用于准备特定版本的发布。在这个分支中,确定应用程序版本、修复最后的问题并更新元数据——而不添加新功能。根据 Vincent Driessen, 2010 的说法,发布分支将发布准备与当前开发分开,使得可以并行进行这两项活动。
要点
release/X.Y.Z,按应用程序版本命名。Release Branch(发布分支)——是 Git Flow 中的一个临时分支,从 develop 创建,当团队决定当前功能集准备好发布时。这个分支存在的时间正好是最终准备发布所需要的时间——从几小时到几天不等。
发布分支的主要目的——冻结特定功能集用于发布,而不停止后续版本的开发。当发布分支正在准备发布时,其他开发人员可以继续将功能分支合并到 develop 中以备下一次发布。
在发布分支中不创建新功能——只进行问题修复、应用程序版本更新、本地化和文档。所有工作完成后,发布分支合并到 main(标记为发布)并合并回 develop(以便问题修复进入未来版本)。
根据 Atlassian, 2024 的说法,发布分支对于具有定期发布周期的项目至关重要——它们确保发布过程的可预测性和稳定性。
生命周期——发布分支从创建到删除包括几个阶段。理解每个阶段有助于团队同步行动并避免错误。
release/2.5.0 的分支。develop 继续接受下一个版本的功能分支。v2.5.0。第 6 点——合并回 develop——经常被遗忘,但这至关重要。没有这一步,在发布中进行的问题修复将不会进入 develop,在下一次发布中同样的问题可能会再次出现。
发布分支的生命周期取决于发布的复杂性和 develop 中代码的质量。对于中等规模的移动应用程序,平均准备时间为 2 到 5 个工作日。
在发布分支中执行严格受限的任务集。任何偏离此列表的行为都会违反 Git Flow 模型并对发布的稳定性造成风险。
| 更改类型 | 允许 | 示例 |
|---|---|---|
| 版本管理 | 是 | 更新 build.gradle 中的 versionName |
| 问题修复 | 是 | 修复启动时的崩溃 |
| 本地化 | 是 | 为新屏幕添加翻译 |
| 文档 | 是 | 更新 CHANGELOG 和 README |
| 新功能 | 否 | 添加新的个人资料屏幕 |
| 重构 | 否 | 重写网络层 |
| 更新库 | 谨慎 | 仅用于问题修复的补丁版本 |
禁止新功能规则——发布分支中最重要的一条。如果功能未能赶上发布,就等待下一个周期。试图将未完成的功能推入发布分支——是截止日期延误和生产中问题的首要原因。
在发布分支中必须更新应用程序的版本号。对于 Android,这是 build.gradle 中的 versionCode 和 versionName 字段,对于 iOS——Info.plist 中的 CFBundleShortVersionString。
// build.gradle(应用级)——在发布分支中更新版本
android {
defaultConfig {
versionCode 42
versionName "2.5.0"
}
}
// 对于 iOS——更新 Info.plist
// CFBundleShortVersionString = 2.5.0
// CFBundleVersion = 42
初学开发人员经常混淆 release 和 hotfix 分支,尽管它们的用途根本不同。选择分支类型的错误可能导致关键修复延迟或发布过程中断。
如果在发布准备过程中(在 release 分支中)发现问题——这是普通的问题修复。如果在生产中(在 main 上)发现问题——这是 hotfix,它从 main 创建,即使发布分支已经存在。
统一的发布分支命名标准简化了仓库中的导航,并允许 CI/CD 系统自动确定该分支与发布过程相关。
release/2.5.0。release/merlin。release/2024-12-01。release/X.Y.Z 格式——更可取,因为它将分支与将要分配给发布的版本号明确关联。这简化了搜索和 CI/CD 脚本的自动处理。
合并回(merge back)发布分支到 develop——是最重要但也经常被忽略的操作之一。没有这一步,发布中做的所有问题修复将只保留在发布版本中,不会进入下一个发布周期。
合并回过程在发布分支已合并到 main 之后执行。首先 release 合并到 develop,然后——删除。这保证 develop 包含发布准备过程中进行的所有修复。
合并回后可能出现冲突——特别是如果在 develop 中已经出现了修改相同文件的新功能分支。负责发布的开发人员解决这些冲突并将 develop 推送到服务器。
一些团队使用 rebase 而不是 merge 进行合并回,以保持历史线性。然而,merge 对 develop 更安全,因为它不会重写可能已被其他开发人员使用的提交历史。
让我们看看发布分支的完整工作周期:从创建到成功发布 2.5.0 版本移动应用程序后删除。
# 1. 从 develop 创建发布分支
git checkout develop
git pull origin develop
git checkout -b release/2.5.0
# 2. 更新版本和问题修复
git add build.gradle
git commit -m "Bump version to 2.5.0"
# 3. 修复问题(仅限 bugfixes)
git add src/fix/
git commit -m "Fix crash on payment screen"
# 4. 将发布分支推送到服务器
git push origin release/2.5.0
# 5. 将 release 合并到 main
git checkout main
git pull origin main
git merge --no-ff release/2.5.0
git tag -a v2.5.0 -m "Release 2.5.0"
git push origin main --tags
# 6. 合并回 develop
git checkout develop
git merge --no-ff release/2.5.0
git push origin develop
# 7. 删除发布分支
git branch -d release/2.5.0
git push origin --delete release/2.5.0
命令 5 和 6——双重合并——至关重要。首先 main 接收发布代码和标签,然后 develop 与 release 的问题修复同步。如果跳过步骤 6,发布中的修复将不会进入下一个开发周期。
对于有定期发布的移动项目,通过 CI/CD 脚本可以自动化创建发布分支和更新版本的过程。GitHub Actions 允许创建一个工作流,点击按钮即可创建带有自动版本更新的发布分支。
对于有定期发布的移动项目,通过 CI/CD 脚本可以自动化创建发布分支和更新版本的过程。GitHub Actions 允许创建一个工作流,点击按钮即可创建带有自动版本更新的发布分支。
# GitHub Actions——创建发布分支的自动化
name: Create Release Branch
on:
workflow_dispatch:
inputs:
version:
description: 'Release version (e.g. 2.5.0)'
required: true
jobs:
create-release:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Create release branch
run: |
git checkout develop
git checkout -b release/${{ inputs.version }}
git push origin release/${{ inputs.version }}
常见问题
如果遵循 Git Flow,一次只能有一个发布分支。有两个活跃的发布分支意味着团队试图并行发布两个版本——这违反了顺序发布原则并造成版本混乱。
通过 git revert 从发布分支中删除未完成功能的提交,并将功能推迟到下一次发布。切勿将未完成的功能发布到生产环境——技术债务和潜在问题不值得匆忙。
对于只有一个修复的简单发布,可以跳过发布分支并直接从 develop 合并到 main。但对于标准发布,发布分支是必需的——它固定版本、隔离准备并确保问题修复的双重合并。
在 main 中使用 git revert 创建一个新的提交来撤消发布的所有更改。然后使用命令 git push origin --delete vX.Y.Z 删除发布标签。修复问题后,使用增加的补丁号创建新的发布分支。
Release candidate(RC)——是通过最终测试的构建产物。Release branch——是创建 release candidate 的 Git 分支。一个发布分支可以在修复问题过程中生成多个 RC 构建(RC1、RC2 等)。
总结
release/X.Y.Z,版本号遵循 SemVer。我们将开发一款交钥匙移动应用程序
IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。