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 与嵌入式项目结合:实战要点

嵌入式项目跟纯软件项目不一样。你想想看,我们有编译器、链接脚本、硬件抽象层、芯片厂商的库——这些东西怎么管?

我总结了几条经验:

  1. 不要提交编译产物:.hex、.bin、.o文件统统加到.gitignore里。这些文件每次编译都不一样,提交了只会让仓库臃肿。
  2. 管理好工具链版本:在README里写明编译器版本、芯片SDK版本。我遇到过最坑的事,就是同事用新版本编译器编译,结果生成的固件在旧硬件上跑不起来。
  3. 用子模块管理第三方库:比如FreeRTOS、LwIP这些,用git submodule引入,别直接复制代码。
  4. 提交信息要带硬件信息:比如「修复STM32F407 UART2中断溢出问题,硬件版本V2.1」。这样以后回溯的时候,一眼就知道问题出在哪。
警告:千万不要把芯片厂商的整个SDK包提交到仓库里。那些包动辄几百MB,而且版本更新频繁。正确的做法是用脚本下载,或者用包管理器管理。我曾经见过一个仓库,因为包含了三份不同版本的HAL库,体积直接飙到2GB——clone一次要半小时。

3.5 嵌入式Git工作流示例

下面这张图是我自己项目里用的工作流,你参考一下:

嵌入式Git工作流 master(发布版) develop(开发版) feature/new-sensor feature/ota-update fix/uart-bug release/v1.2 tag: v1.2.0 每次发布前,从develop切出release分支,测试通过后合并到master并打tag

这个流程看起来复杂,其实核心就一句话:功能在分支上开发,稳定后合入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之后,你再也不想回到「复制粘贴备份」的原始时代了。