3、版本控制入门:Git安装、常用命令、分支管理、与嵌入式项目结合
说实话,我见过太多嵌入式工程师还在用「项目_最终版_v12_改3.bin」这种命名方式。嗯,每次看到我都想叹气。版本控制不是可选项,是保命符。尤其是做嵌入式,固件一烧进去,出了问题你连回退的机会都没有——除非你用了Git。
这一章,我带你把Git跑通。从安装到日常操作,再到怎么跟嵌入式项目结合,咱们一步到位。
3.1 Git安装与环境配置
先别急着敲命令。我建议你装完Git之后,第一件事就是配好用户信息。不然提交的时候会报错,很烦。
git config --global user.name "你的名字"
git config --global user.email "你的邮箱"
我个人习惯再加两个配置:
git config --global core.autocrlf input # 防止换行符混乱
git config --global core.editor "vim" # 用你顺手的编辑器
小提示:Windows用户记得在安装时选「Checkout as-is, commit as-is」,不然换行符问题会让你抓狂。我在项目里吃过这个亏,代码明明没改,diff却一片红。
3.2 常用命令:够用就行
Git命令很多,但嵌入式开发常用的就那么几个。我列了个速查表,你照着用就行。
| 场景 | 命令 | 说明 |
|---|---|---|
| 初始化仓库 | git init |
在项目根目录执行一次 |
| 查看状态 | git status |
养成习惯,每次操作前看一眼 |
| 添加文件 | git add . |
把改动放进暂存区 |
| 提交 | git commit -m "信息" |
提交信息要写清楚,别写「fix」 |
| 查看历史 | git log --oneline |
简洁版日志,一眼看清 |
| 回退 | git reset --hard HEAD~1 |
撤销最近一次提交,慎用 |
| 拉取远程 | git pull |
先pull再push,避免冲突 |
| 推送远程 | git push |
把本地提交推送到服务器 |
你想想看,这些命令加起来不超过10个。但就是这10个命令,能覆盖你90%的日常操作。别被那些花里胡哨的命令吓到,先跑通这条线再说。
3.3 分支管理:嵌入式项目的命脉
分支管理是Git的精髓。尤其是嵌入式项目,硬件版本、固件版本、驱动版本经常要并行开发。没有分支,你根本玩不转。
我常用的分支策略是这样的:
- master/main:稳定发布版,只合并不直接开发
- develop:日常开发主分支
- feature/xxx:新功能分支,从develop切出来
- fix/xxx:bug修复分支
- release/vx.x:发布候选分支
核心原则:永远不要在master上直接改代码。我曾经有一次图省事,直接在master上修了个小bug,结果同事拉下来代码直接编译不过。嗯,那天下午我都在帮人擦屁股。
分支操作命令也很简单:
git branch feature/new-sensor # 创建分支
git checkout feature/new-sensor # 切换分支
git checkout -b fix/uart-bug # 创建并切换(一步到位)
git merge feature/new-sensor # 合并分支到当前分支
3.4 与嵌入式项目结合:实战要点
嵌入式项目跟纯软件项目不一样。你想想看,我们有编译器、链接脚本、硬件抽象层、芯片厂商的库——这些东西怎么管?
我总结了几条经验:
- 不要提交编译产物:.hex、.bin、.o文件统统加到.gitignore里。这些文件每次编译都不一样,提交了只会让仓库臃肿。
- 管理好工具链版本:在README里写明编译器版本、芯片SDK版本。我遇到过最坑的事,就是同事用新版本编译器编译,结果生成的固件在旧硬件上跑不起来。
- 用子模块管理第三方库:比如FreeRTOS、LwIP这些,用
git submodule引入,别直接复制代码。 - 提交信息要带硬件信息:比如「修复STM32F407 UART2中断溢出问题,硬件版本V2.1」。这样以后回溯的时候,一眼就知道问题出在哪。
警告:千万不要把芯片厂商的整个SDK包提交到仓库里。那些包动辄几百MB,而且版本更新频繁。正确的做法是用脚本下载,或者用包管理器管理。我曾经见过一个仓库,因为包含了三份不同版本的HAL库,体积直接飙到2GB——clone一次要半小时。
3.5 嵌入式Git工作流示例
下面这张图是我自己项目里用的工作流,你参考一下:
这个流程看起来复杂,其实核心就一句话:功能在分支上开发,稳定后合入develop,发布前切release,发布后打tag。我用了好几年,没出过大乱子。
3.6 .gitignore:嵌入式项目的必备配置
嵌入式项目里,有些文件是绝对不能提交的。我直接给你一个模板:
# 编译产物
*.o
*.hex
*.bin
*.elf
*.map
*.lst
# IDE配置
.idea/
.vscode/
*.uvoptx
*.uvguix
*.mxproject
# 工具链
/Drivers/
/CMSIS/
# 临时文件
*.swp
*.swo
*~
# 日志
*.log
build/
我的习惯:每次新建项目,第一件事就是创建.gitignore。别等到提交了一堆垃圾文件之后再清理,那时候已经晚了。我见过有人把整个Keil工程目录都提交了,里面还带着几十MB的临时文件——clone下来直接占满硬盘。
3.7 避坑指南:我踩过的那些坑
最后,分享几个我亲身经历过的坑,你遇到了能少走弯路:
- 大文件提交:有一次我不小心把芯片数据手册(200MB的PDF)提交了,结果仓库推不上去。后来用
git filter-branch才清理掉,折腾了一下午。 - 换行符混乱:Windows和Linux混用的团队,一定要统一换行符配置。不然每次pull下来都是满屏的diff,根本没法看。
- 忘记拉取就推送:先pull再push,这个顺序别搞反。我见过有人直接push,结果把别人的提交覆盖了——那场面,堪比车祸现场。
- 提交信息太随意:「fix」「update」「test」这种提交信息,三个月后你自己都看不懂。写清楚改了啥、为什么改、影响范围。
好了,Git这块就讲这么多。你先把环境搭好,把常用命令跑熟,然后找个嵌入式项目练练手。相信我,用上Git之后,你再也不想回到「复制粘贴备份」的原始时代了。