3、版本控制工具 Git:安装、仓库初始化、分支管理与标签
做 OTA 升级包开发,版本控制是基本功。我见过不少团队,升级包出了 bug,想回退却找不到历史版本,最后只能全员加班排查。说白了,Git 就是你的「后悔药」和「时光机」。这一节,我带你从零搭好 Git 环境,把分支和标签玩明白。
3.1 Git 安装与环境配置
不同操作系统安装方式略有差异,但核心步骤一致。我个人习惯在 Linux 服务器上做 OTA 构建,但开发机用 Windows 或 macOS 也很常见。
| 操作系统 | 安装方式 | 验证命令 |
|---|---|---|
| Ubuntu/Debian | sudo apt install git |
git --version |
| CentOS/RHEL | sudo yum install git |
git --version |
| macOS | brew install git 或安装 Xcode CLI |
git --version |
| Windows | 下载 Git for Windows 安装包 | git --version (Git Bash) |
装完之后,第一件事是配置身份信息。这步很多人会忘,但提交记录里如果作者信息是乱的,后面追查问题会非常痛苦。
git config --global user.name "Your Name"
git config --global user.email "your.email@example.com"
git config --global core.editor "vim" # 我个人习惯用 vim
git config --global merge.tool "vimdiff"
我的习惯: 我会把
user.name 设置成「姓名-部门」的格式,比如 张三-OTA组。这样在大型项目里,一看提交记录就知道是谁改的、属于哪个团队。
3.2 仓库初始化与首次提交
初始化一个 Git 仓库非常简单。但我要提醒你:不要在已有代码的目录里直接 git init 然后一股脑全加进去。我吃过这个亏——把编译生成的 .o 文件和 .bin 文件都提交了,仓库瞬间变得臃肿不堪。
正确的做法是:
- 先创建项目目录,进入目录
- 编写
.gitignore文件,排除不需要跟踪的文件 - 再执行
git init - 添加文件并提交
mkdir ota-upgrade-builder
cd ota-upgrade-builder
# 先写 .gitignore,再初始化
echo "*.o" >> .gitignore
echo "*.bin" >> .gitignore
echo "build/" >> .gitignore
git init
git add .
git commit -m "chore: init OTA builder project"
我曾经踩过的坑: 有一次我把
.gitignore 写在了子目录里,结果根目录的编译产物全被提交了。后来我养成了习惯:.gitignore 必须放在仓库根目录,并且提交前用 git status 确认一遍。
3.3 分支管理策略
OTA 升级包的开发,分支策略直接影响到发布效率。我推荐使用 Git Flow 的简化版,适合嵌入式固件开发。
核心分支只有两条:
- main:只存放经过完整测试、可以发布的版本
- develop:日常开发的主干,所有特性分支从这里拉出
辅助分支包括:
- feature/*:新功能开发,比如
feature/delta-compression - hotfix/*:紧急修复,直接从 main 拉出,修完合并回 main 和 develop
- release/*:发布准备分支,只做 bug 修复,不做新功能
# 创建 develop 分支
git branch develop
git checkout develop
# 或者一步到位
git checkout -b develop
# 创建特性分支
git checkout -b feature/delta-compression develop
# 合并特性分支到 develop
git checkout develop
git merge --no-ff feature/delta-compression
# 创建发布分支
git checkout -b release/v1.2.0 develop
为什么用 --no-ff? 默认的 fast-forward 合并会丢失分支历史。加上
--no-ff 后,即使可以快进,也会生成一个合并提交,保留「这条分支曾经存在过」的信息。我在排查问题时,经常靠这个标记快速定位到某次特性合并。
3.4 标签管理与版本号规范
标签是 Git 里最容易被人忽略的功能。但做 OTA 升级,标签就是你的版本锚点。每次发布正式版,都必须打标签。
我习惯用 语义化版本号:v主版本.次版本.修订号,比如 v1.2.3。
- 主版本:不兼容的 API 变更,或者升级包格式大改
- 次版本:向下兼容的新功能,比如新增一种压缩算法
- 修订号:向下兼容的问题修复,比如修复了某个设备型号的升级失败问题
# 创建轻量标签(只存指针)
git tag v1.0.0
# 创建附注标签(推荐,包含作者、日期、说明)
git tag -a v1.0.0 -m "Release v1.0.0: initial OTA upgrade support"
# 给历史提交打标签
git tag -a v0.9.0 9fceb02 -m "Pre-release v0.9.0"
# 推送标签到远程
git push origin v1.0.0
# 推送所有标签
git push origin --tags
我的习惯: 附注标签一定要写清楚变更内容。比如
v1.1.0: add delta compression, reduce upgrade package size by 40%。这样半年后回来看,一眼就知道这个版本的价值。
3.5 知识体系总览
下面这张图概括了 Git 在 OTA 升级包制作中的核心操作流程。你可以把它贴在工位旁边,用的时候扫一眼。
3.6 常用命令速查表
下面这个表格是我平时用得最多的 Git 命令。你把它存下来,忘了就翻一眼。
| 操作场景 | 命令 | 说明 |
|---|---|---|
| 配置 | git config --global user.name "xxx" |
设置全局用户名 |
| 初始化 | git init |
在当前目录创建 Git 仓库 |
| 查看状态 | git status |
查看工作区和暂存区状态 |
| 添加文件 | git add . |
添加所有变更到暂存区 |
| 提交 | git commit -m "msg" |
提交暂存区内容 |
| 创建分支 | git checkout -b feature/xxx |
创建并切换到新分支 |
| 合并分支 | git merge --no-ff feature/xxx |
合并并保留分支历史 |
| 打标签 | git tag -a v1.0.0 -m "msg" |
创建附注标签 |
| 推送标签 | git push origin --tags |
推送所有本地标签到远程 |
最后说一句: 别把 Git 当备份工具用。我见过有人每天下班前把整个目录压缩上传到网盘——那叫存档,不叫版本控制。Git 的核心价值是追溯每一次变更的原因。养成写清晰提交信息的习惯,未来某个深夜排查 bug 的你,会感谢现在的自己。