Git 进阶操作:分支策略与协作实战
分支管理,说白了就是团队协作的交通规则。没有规则,大家各开各的车,早晚撞在一起。我在智能座舱项目里见过太多因为分支混乱导致的发布事故——代码合丢了、功能漏了、冲突改坏了。嗯,今天我们就来把这些坑填上。
两种主流分支策略:Git Flow 与 Trunk Based
先看一张对比图,帮你快速建立整体认知:
Git Flow:适合座舱的正式发布场景
Git Flow 有 5 种核心分支,每种分支有明确的职责。我参与过的几个量产座舱项目,用的都是 Git Flow 的变体。
| 分支类型 | 命名示例 | 用途 | 生命周期 |
|---|---|---|---|
| main | main / master | 生产就绪代码 | 永久 |
| develop | develop | 日常开发集成分支 | 永久 |
| feature | feature/hmi-v2 | 新功能开发 | 开发完成后删除 |
| release | release/2.1.0 | 发布前测试与修复 | 发布后合并删除 |
| hotfix | hotfix/crash-fix | 生产环境紧急修复 | 修复后合并删除 |
我的习惯:座舱项目里,release 分支至少保留 2 周。这期间只修 bug,不加新功能。我曾经因为赶进度在 release 分支上加了新功能,结果测试全乱套,发布延期了 3 天。
Trunk Based:适合快速迭代的座舱敏捷团队
如果你团队小、发布频繁,Trunk Based 更合适。核心规则就一条:所有人往主干合并,每天至少一次。
- 分支存活时间不超过 2 天
- 每次提交必须通过 CI 构建
- 功能开关(Feature Toggle)代替长分支
我有个项目从 Git Flow 切到 Trunk Based 后,集成周期从 2 周缩短到 2 天。但前提是——你的自动化测试覆盖率要够高,否则主干分分钟变废墟。
合并(Merge)与变基(Rebase)
这两个操作经常被搞混。我直接说结论:
| 操作 | 效果 | 什么时候用 |
|---|---|---|
| git merge | 保留完整分支历史 | 合并 feature 到 develop、发布分支 |
| git rebase | 线性化提交历史 | 个人分支同步主干、清理本地提交 |
注意:永远不要在公共分支上执行 rebase!你想想看,如果大家对同一个分支 rebase,历史会被重写,其他人 pull 的时候会崩溃。我见过有人对 develop 分支 rebase,结果整个团队花了半天才把历史恢复回来。
冲突解决:别慌,一步步来
冲突是家常便饭。座舱项目里,最常冲突的文件是 HMI 配置文件、资源索引和协议头文件。我的解决流程:
- 先拉最新代码:
git pull --rebase或git merge origin/develop - 查看冲突文件:
git status列出所有冲突 - 手动编辑:打开文件,找到
<<<<<<<标记 - 选择保留:保留当前分支、传入分支,或手动合并
- 标记已解决:
git add <file> - 继续操作:
git rebase --continue或git merge --continue
避坑指南:我曾经在解决冲突时,不小心删掉了一段关键的座舱安全逻辑。结果编译通过了,但运行时仪表盘黑屏。从那以后,我解决完冲突一定会跑一遍完整的单元测试和集成测试。
Cherry-pick:精准移植提交
Cherry-pick 就是从某个分支挑一个或多个提交,应用到当前分支。座舱项目里常用场景:
- hotfix 修复从 release 分支移植到 main
- 某个功能提交从 develop 移植到 release 分支
- 紧急修复跨版本移植
基本用法:
# 查看提交哈希
git log --oneline
# 移植单个提交
git cherry-pick a1b2c3d
# 移植多个提交
git cherry-pick a1b2c3d e4f5g6h
# 移植一段连续提交
git cherry-pick a1b2c3d..e4f5g6h
我的经验:Cherry-pick 后一定要检查是否有冲突。如果 cherry-pick 的提交依赖其他提交,可能会引入不完整的代码。我习惯在 cherry-pick 后跑一次 diff,确认移植的内容是完整的。
实战:座舱项目分支操作示例
假设我们正在开发座舱的 HMI 2.0 版本:
# 1. 从 develop 创建 feature 分支
git checkout develop
git checkout -b feature/hmi-v2
# 2. 开发过程中同步主干
git fetch origin
git rebase origin/develop
# 3. 开发完成,合并回 develop
git checkout develop
git merge --no-ff feature/hmi-v2
# 4. 创建 release 分支
git checkout -b release/2.1.0
# 5. 修复 bug 后 cherry-pick 到 main
git checkout main
git cherry-pick -x 9a8b7c6
你想想看,如果没有分支策略,每个人都在 main 上直接提交,那发布前根本没法控制哪些功能进、哪些不进。分支策略不是束缚,是保护。
核心总结:分支策略选型取决于团队规模和发布节奏。座舱项目建议用 Git Flow 变体,但如果你做的是持续交付的座舱平台,Trunk Based 更高效。合并用 merge 保留历史,变基用 rebase 保持整洁。冲突解决要冷静,cherry-pick 要谨慎。