1. 版本管理基础概念

什么是版本管理?

版本管理,说白了就是给代码拍「快照」。

你写代码的时候,是不是经常这样?改了一堆东西,突然发现改错了,想回到昨天那个能跑的状态——但已经回不去了。我刚开始做嵌入式那会儿,就吃过这个亏。一个驱动改了三天,最后编译不过,想回退?只能靠记忆手动改回来。那叫一个痛苦。

版本管理就是解决这个问题的。它帮你记录每一次修改,想回哪个版本就回哪个版本。还能多人同时开发,互不干扰。

核心就三点:

  • 记录历史——谁、在什么时候、改了什么东西
  • 支持回退——出问题了,一键回到上一个稳定版本
  • 协同开发——多个人改同一个项目,不会互相覆盖

一句话总结:版本管理就是给你的代码上了个「后悔药」+「时光机」。

为什么嵌入式项目需要版本管理?

你可能觉得,嵌入式项目嘛,代码量不大,一个人就能搞定,用不着版本管理吧?

嗯,我以前也这么想。直到有一次……

一个客户现场的问题,需要紧急修复。我改了一行代码,编译烧录,好了。但过了两天,客户说另一个功能出问题了。我查了半天,发现是我改的那行代码引起的副作用。可问题是——我忘了原来那行代码是什么了!

这就是没有版本管理的代价。

嵌入式项目有几个特点,决定了它特别需要版本管理:

  1. 硬件依赖性强——代码和硬件版本要匹配。你换了个芯片型号,驱动全得改。没有版本管理,你都不知道哪个驱动对应哪个硬件。
  2. 调试周期长——嵌入式调试不像PC软件,改完就能跑。烧录一次可能要好几分钟。你改了一堆东西,烧进去发现不行,想回退?没有版本管理就只能重写。
  3. 多人协作复杂——嵌入式项目往往是硬件、驱动、应用层分开开发。没有版本管理,合并代码就是一场噩梦。
  4. 固件发布频繁——今天给客户A一个版本,明天给客户B一个版本。没有版本管理,你根本分不清哪个固件是给谁的。

注意:嵌入式项目一旦出问题,往往不是重启就能解决的。烧录错了固件,可能直接导致硬件损坏。版本管理不是「锦上添花」,而是「雪中送炭」。

常见版本管理工具对比

市面上主流的版本管理工具,我基本都用过。Git、SVN、ClearCase,各有各的脾气。我一个个说。

特性 Git SVN ClearCase
架构 分布式 集中式 集中式
离线工作 支持 不支持 不支持
分支管理 轻量、灵活 较重、目录复制 复杂、UCM模型
学习曲线 中等偏陡 平缓 陡峭
性能 快(本地操作) 中等(依赖网络) 慢(依赖服务器)
嵌入式适用性 低(太笨重)
费用 免费 免费/商业版收费 非常昂贵

Git

Git 是目前嵌入式项目的事实标准。为什么?

首先,它是分布式的。你想想看,你在火车上、飞机上,没有网络,照样可以提交代码、查看历史、创建分支。等有网了再同步到服务器。这一点对嵌入式开发太重要了——很多嵌入式工程师经常出差,或者客户现场没有内网。

其次,分支管理极其灵活。嵌入式项目经常需要同时维护多个版本:比如一个版本给客户A,一个版本给客户B,还有一个内部开发版。Git 的分支切换成本几乎为零。我习惯每个客户一个分支,每个功能一个分支,互不干扰。

举个例子:

# 创建客户A的分支
git checkout -b customer_a_v1.0

# 在这个分支上修改驱动
git add driver/i2c.c
git commit -m "fix: I2C timeout issue for customer A"

# 切回主分支继续开发
git checkout main

我曾经在一个项目里,用 Git 同时维护了 7 个客户分支。每个分支的固件版本都不一样。要是没有 Git,我估计得疯掉。

小技巧:嵌入式项目建议用 Git 的 tag 功能来标记固件版本。比如 v1.0.0-betav1.0.0-release。这样一眼就能看出哪个版本是正式发布的。

SVN

SVN 是集中式的。所有代码都放在服务器上,你要提交或查看历史,都得连服务器。

SVN 的优点是什么?简单。真的简单。你不需要理解什么暂存区、工作树、HEAD 指针。就是 checkout、commit、update 三板斧。我见过很多老工程师,SVN 用得贼溜,但一换 Git 就懵了。

但它的缺点也很明显:

  • 离线没法干活——没网就提交不了代码
  • 分支管理笨重——SVN 的分支本质上是目录复制,分支多了服务器磁盘爆炸
  • 合并痛苦——多人同时改同一个文件,合并冲突能让你怀疑人生

我记得有个项目,团队用 SVN,三个人同时改一个配置文件。每次合并都要花半天时间解决冲突。后来换成 Git,用分支隔离开发,再也没出过这种问题。

SVN 现在还在用的场景,主要是那些对网络要求不高、团队规模小、代码量不大的嵌入式项目。比如一些老牌的工控设备厂商,还在用 SVN。

ClearCase

ClearCase 是 IBM 的产品。怎么说呢……它很强大,但也很「重」。

ClearCase 的 UCM(统一变更管理)模型,理论上非常完善。它把代码、文档、需求、缺陷全部关联起来。适合那种大型的、需要严格审计的军工、航空航天项目。

但实际用起来呢?

  • 安装配置复杂——光装个客户端就要半天,还得配一堆环境变量
  • 性能差——操作稍微复杂点,就要等半天。我见过一个 ClearCase 的 view,更新一下要 10 分钟
  • ——一个许可证几千美金,小公司根本用不起

我曾经在一个军工项目里用过 ClearCase。说实话,功能确实强大,但每次操作都像在「开坦克」——威力大,但笨重得要命。后来项目组实在受不了,偷偷用 Git 做了一套「影子版本管理」,ClearCase 只用来应付审计。

避坑指南:如果你不是在做军工、航天这种需要严格审计的项目,千万别碰 ClearCase。它带来的管理成本,远大于它解决的问题。

怎么选?

我个人建议:

  • 新项目——无脑选 Git。社区活跃、工具链完善、免费。嵌入式领域,Git + GitHub/GitLab 是标配。
  • 老项目,团队习惯 SVN——如果项目不大,团队也稳定,继续用 SVN 也没问题。但要做好「哪天要迁移到 Git」的准备。
  • 军工/航天/严格审计——ClearCase 或者 SVN + 严格的流程管理。但说实话,我建议用 Git + 合规工具替代,成本更低、效率更高。

嗯,这就是版本管理的基础。说白了,工具只是手段,核心是「管好你的代码」。下一章我们聊聊 Git 的核心概念,保证让你彻底搞懂它到底是怎么工作的。