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 文件都提交了,仓库瞬间变得臃肿不堪。

正确的做法是:

  1. 先创建项目目录,进入目录
  2. 编写 .gitignore 文件,排除不需要跟踪的文件
  3. 再执行 git init
  4. 添加文件并提交
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 升级包制作中的核心操作流程。你可以把它贴在工位旁边,用的时候扫一眼。

Git 在 OTA 升级包开发中的核心流程 1. 安装与配置 git config --global 2. 仓库初始化 git init + .gitignore 3. 分支管理 main / develop / feature 日常开发循环 git add → git commit git pull → git push 分支操作 git checkout -b feature/xxx git merge --no-ff 标签发布 git tag -a v1.0.0 git push --tags OTA 升级包发布流程 develop 分支 → release/v1.x.x 分支(仅修 bug)→ 合并到 main → 打标签 v1.x.x → 构建升级包 紧急修复:从 main 拉 hotfix 分支 → 修复 → 合并回 main 和 develop → 打补丁标签 ⚠️ 避坑提醒 1. 不要提交编译产物(.o、.bin、build/) 2. 每次合并到 main 必须打附注标签

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 的你,会感谢现在的自己。