GitFlow工作流
我们以智能驾驶软件的一个版本开发为例,详细讲解 GitFlow 工作流。假设我们正在开发一个名为"自动驾驶系统( ADS )"的软件,当前版本为v1.0,接下来要开发v1.1版本。main :当前生产版本是v1.0develop :正在集成v1.1的功能假设我们要开发两个新功能:自适应巡航( ACC )和车道保持( LKA )。这两个功能分别由两个团队开发。从 develop 分支创建两个功能分支
我们以智能驾驶软件的一个版本开发为例,详细讲解 GitFlow 工作流。
样例1
假设我们正在开发一个名为"自动驾驶系统( ADS )"的软件,当前版本为v1.0,接下来要开发v1.1版本。
分支结构:
main :当前生产版本是v1.0
develop :正在集成v1.1的功能
步骤:
1.准备开发新功能
假设我们要开发两个新功能:自适应巡航( ACC )和车道保持( LKA )。这两个功能分别由两个团队开发。
2.创建功能分支
从 develop 分支创建两个功能分支:
· feature / ACC
· feature / LKA
开发团队分别在各自的功能分支上开发。他们可以自由地提交代码,而不会影响主分支。我将结合一个智能驾驶软件开发的详细案例,来深入讲解GitFlow工作流的每个分支是如何运作的。
3. 完成功能开发
当 ACC 功能开发完成,开发团队将 feature / ACC 合并回 develop 分支。同样, LKA 功能完成后,也将 feature / LKA 合并回 develop 分支。
注意:合并时通常使用- - no - ff (非快进合并)方式,这样可以保留功能分支的历史记录,并且能够清晰地看到一起提交的功能集合。
4.准备发布
当 develop 分支上的功能集成得足够多,可以准备发布v1.1时,我们从 develop 分支创建一个发布分支。
· release /v1.1
在这个分支上,我们不再添加新功能,只进行测试、修复 bug 、更新文档等工作。如果有 bug 需要修复,直接提交到 release /v1.1分支。
5.发布版本
当 release /v1.1分支稳定后,我们将它合并到 main 分支和 develop 分支:
.合并到 main :使用一个带注释标签(v1.1)标记这个版本。
.合并到 develop :是为了将发布分支上的 bug 修复同步到开发分支,避免后续重复出现同样的问题。
6.紧急热修复
假设v1.0版本在线上发现一个紧急 bug (比如:传感器数据解析错误),我们需要立即修复。
从 main 分支(v1.0标签)创建一个热修复分支:
· hotfix / sensor - parser
在热修复分支上修复 bug ,然后进行测试。修复完成后,将热修复分支合并到 main 和 develop 分支:
.合并到 main :打上新的版本标签v1.0.1
.合并到 develop :确保后续版本也包含这个修复。
注意:热修复分支是从 main 分支创建的,而不是 develop 。因为 main 代表当前生产版本,而 develop 可能已经包含了尚未发布的新功能,不适合用于紧急修复。
通过这样的流程,我们保证了:
· main 分支始终是稳定可发布的。
· develop 分支是集成最新功能的地方,相对稳定但不一定随时可发布。
.功能开发在独立分支进行,不会相互干扰。
.发布分支隔离了发布前的测试和 bug 修复,不影响新功能的开发。
.热修复分支可以快速响应生产环境的问题。
在实际操作中,我们使用 Git 命令如下:
创建功能分支(以 ACC 为例):
git checkout develop
git checkout - b feature / ACC
…开发并提交…
git checkout develop
git merge -- no - ff feature / ACC
git branch - d feature / ACC
创建发布分支:
git checkout develop
git checkout - b release /v1.1
…测试、修复 bug 、更新版本号等.
git checkout main
git merge -- no - ff release /v1.1
git tag - a v1.1- m " Release version 1.1"
git checkout develop
git merge -- no - ff hotfix / sensor - parser git branch - d hotfix / sensor - parser
注意:在实际团队协作中,我们通常使用代码仓库(如 GitLab 、 GitHub )的合并请求( Merge Request )或拉取请求( Pull Request )来完成合并,而不是直接使用 git merge 命令。这样可以在合并前进行代码审查和自动化测试。
以上就是 GitFlow 在智能驾驶软件开发中的一个详细案例。
样例2
案例背景
假设我们正在为"AlphaCar"智能驾驶系统开发一个名为"Navigator"的核心软件栈,当前线上稳定运行的版本是 V1.2.0。我们计划在下个季度发布 V1.3.0,该版本将包含两个主要新功能:
1. Traffic Light Recognition (TLR): 交通信号灯识别功能。
2. Highway Auto Pilot (HAP): 高速公路自动巡航功能。
同时,我们需要维护当前已上车的V1.2.0版本。
---
GitFlow 详细流程与案例解析
让我们跟踪这个项目的完整开发周期。
初始状态
· main 分支: 代码对应的是 V1.2.0 版本,这是目前车辆上运行的稳定版本。代码被打上了 v1.2.0 的Tag。
· develop 分支: 已经从 main 分支拉取,并准备集成 V1.3.0 的新功能。
# 在Git图形界面或日志中,初始状态大致如下
* [main] (Tag: v1.2.0) - Stable release for vehicles
|
* [develop] - Initial branch from main for v1.3.0 development
一. 功能开发阶段 (feature/*)
场景: 两个开发团队需要并行开发 TLR 和 HAP 功能。
操作:
1. 两位团队负责人分别从 develop 分支创建自己的功能分支。
# 团队A创建交通灯识别功能分支
git checkout develop
git checkout -b feature/traffic-light-recognition
# 团队B创建高速巡航功能分支
git checkout develop
git checkout -b feature/highway-autopilot
2. 在两个 feature/* 分支上,团队进行独立的开发、提交和初步测试,互不干扰。
# 在 feature/traffic-light-recognition 分支上
git add -A
git commit -m "feat: implement basic traffic light detection model"
git commit -m "feat: add integration with planning module"
# ... 多次提交
3. 当功能开发完成并通过团队内部测试后,需要将其合并回 develop 分支。
· 通常通过 通常使用代码仓库(如 GitLab 、 GitHub )的合并请求( Merge Request )或拉取请求( Pull Request )来完成合并,而不是直接使用 git merge 命令。这样团队成员在MR中进行代码审查,确保代码质量。
· CI/CD流水线会自动运行,对该功能分支进行编译和测试。
# 合并 TLR 功能 (假设使用MR)
# 1. 在GitLab/GitHub上创建从 `feature/traffic-light-recognition` 到 `develop` 的Merge Request。
# 2. 经过评审和CI通过后,合并。
# 3. 合并后,可以删除功能分支。
git branch -d feature/traffic-light-recognition
此时状态:
develop分支已经集成了TLR和HAP两个功能的完整代码,它包含了所有为V1.3.0准备的新特性,但可能还不稳定。

二. 发布准备阶段 (release/*)
场景: 所有V1.3.0的功能都已合并到 develop 分支,现在需要准备发布。
操作:
1. 从 develop 分支创建一个发布分支。分支名通常包含版本号。
git checkout develop
git checkout -b release/v1.3.0
2. 在这个分支上,严格禁止添加新功能。所有工作聚焦于:
· 深度测试: 进行全面的系统集成测试、仿真测试等。
· 修复Bug: 只修复测试中发现的Bug。这些修复应该直接提交到 release/v1.3.0 分支。
· 文档准备: 更新版本说明、用户文档等。
· 版本号迭代: 将版本号从 1.3.0-SNAPSHOT 改为 1.3.0。
3. 同时,需要将在这个分支上修复的Bug同步回 develop 分支,确保后续开发也 包含这些修复。
# 在 release/v1.3.0 上修复了一个bug后
git checkout develop
git merge release/v1.3.0 # 或者使用cherry-pick只合并特定的bug修复提交
# 这可能会遇到冲突,需要手动解决,因为develop可能已经有了新的提交。
此时状态:
release/v1.3.0分支经过测试和Bug修复,已经变得非常稳定,达到了可发布的状态。develop 分支也包含了所有发布前的修复。
---
3. 正式发布阶段 (main)
场景: release/v1.3.0 分支通过了所有测试,可以正式发布了。
操作:
3.1. 将 release 分支合并到 main 分支。这个合并通常是一个快进合并或一个保证历史的合并提交。
git checkout main
git merge --no-ff release/v1.3.0 # --no-ff 保留分支历史,即使可以快进
3.2. 在 main 分支上为这次发布打上一个语义化版本标签。
git tag -a v1.3.0 -m "Release version 1.3.0 with TLR and HAP features"
3.3. 将 release 分支的最终状态也合并回 develop 分支(如果之前没有持续同步的话)。
git checkout develop
git merge --no-ff release/v1.3.0
3.4. 删除发布分支,因为它已经完成了历史使命。
git branch -d release/v1.3.0
此时状态:
· main 分支: 代码完全对应 V1.3.0 发布版本,是新的稳定基准。
· develop 分支: 包含了发布后的所有更新,可以立即基于它开始下一个版本(如V1.4.0)的功能开发。

4. 紧急修复阶段 (hotfix/*)
场景: V1.3.0版本上车后,发现一个紧急的安全漏洞(例如,某个 corner case 下规划模块可能产生急刹),需要立即修复,不能等到V1.4.0发布。
操作:
1. 从 main 分支(而不是 develop!)创建热修复分支。
git checkout main
git checkout -b hotfix/emergency-brake-fix
2. 在该分支上全力修复这个紧急问题,并进行充分的测试。
# 在 hotfix/emergency-brake-fix 分支上
git add -A
git commit -m "fix(planning): resolve unexpected emergency brake in specific corner case"
3. 修复完成后,将热修复分支合并回 main 分支,并打上新的修订版本号标签。
git checkout main
git merge --no-ff hotfix/emergency-brake-fix
git tag -a v1.3.1 -m "Hotfix: fix for unexpected emergency braking"
4. 至关重要的一步: 将此次热修复也合并回 develop 分支,确保下一个大版本也包含这个修复,避免问题重现。
git checkout develop
git merge --no-ff hotfix/emergency-brake-fix
# 这里可能会遇到冲突,需要手动解决,因为develop的代码可能已经发生了较大变化。
5. 删除热修复分支。
git branch -d hotfix/emergency-brake-fix
最终状态:
· main 分支: 代码对应 V1.3.1,这是包含紧急修复的最新稳定版本,可以立即OTA到车辆上。
· develop 分支: 也包含了这个紧急修复,后续的V1.4.0开发不会再次引入该Bug。

总结
通过这个案例,我们可以看到GitFlow为智能驾驶开发带来了:
· 清晰的职责分离: main 只管稳定发布,develop 只管功能集成,feature 只管开发,release 只管测试,hotfix 只管救火。
· 并行开发支持: 多个功能团队可以互不干扰地工作。
· 稳定的发布流程: release 分支确保了发布版本的代码冻结和充分测试。
· 快速的应急响应: hotfix 分支提供了一条绕过常规开发流程的"绿色通道",用于处理线上紧急问题。
· 可追溯性: 每一个正式版本在 main 分支上都有精确的Tag对应,符合功能安全的标准要求。
这套流程虽然看起来复杂,但对于智能驾驶这种对安全、质量和版本管理有极高要求的领域,它提供了至关重要的纪律性和可靠性保障。
更多推荐

所有评论(0)