3、Git与版本控制:Git的安装与配置、克隆PX4源码、理解Git工作流

说实话,做嵌入式开发这么多年,我见过太多人栽在版本控制上。尤其是飞控这种项目,代码一乱,飞机在天上乱飞,你连回退的机会都没有。Git这东西,说白了就是你的后悔药,也是你的团队协作基石。今天咱们就把这玩意儿彻底搞明白。

3.1 Git的安装与配置

先装Git,这个没什么好说的。我个人的习惯是,不管用什么系统,都装最新稳定版。

Windows下安装

去Git官网下载安装包,一路Next就行。但有几个选项要注意:

  • 选择默认编辑器:我建议选VSCode或者Nano,别选Vim,除非你真的很熟
  • 调整PATH环境变量:选"Git from the command line and also from 3rd-party software"
  • 换行符转换:选"Checkout Windows-style, commit Unix-style line endings"——这个坑我踩过,后面细说

Linux下安装

sudo apt update
sudo apt install git

Ubuntu用户一行命令搞定。Fedora用户用dnf,Arch用户用pacman,都差不多。

macOS下安装

用Homebrew最省事:

brew install git

基础配置

装完第一件事,配置你的身份。不然你提交的代码都不知道是谁写的:

git config --global user.name "你的名字"
git config --global user.email "你的邮箱@example.com"

嗯,这里要注意,邮箱最好和你GitHub的邮箱一致,不然提交记录里头像显示不出来。

我个人还会配几个别名,省得每次敲长命令:

git config --global alias.st status
git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.ci commit

这样以后敲git st就能看状态了,是不是爽多了?

小技巧:配置完可以用 git config --list 查看所有配置。我曾经在项目里发现同事的邮箱配错了,导致GitHub上的贡献图一片空白,排查了半天。

3.2 克隆PX4源码

好了,Git装好了,咱们来干正事——把PX4的代码拉下来。

PX4的官方仓库在GitHub上,地址是:https://github.com/PX4/PX4-Autopilot

克隆命令很简单:

git clone https://github.com/PX4/PX4-Autopilot.git --recursive

等等,为什么加--recursive?因为PX4用了很多子模块(submodule),比如uORB、drivers这些。不加这个参数,你拉下来的代码会缺胳膊少腿,编译直接报错。我刚开始搞PX4时就吃过这个亏,编译到一半提示找不到头文件,折腾了一下午才发现是子模块没拉全。

如果你已经克隆完了才发现忘了加--recursive,别慌,补救方法:

git submodule update --init --recursive

克隆过程取决于你的网速,PX4仓库大概有1GB左右。如果网不好,可以考虑用国内镜像:

git clone https://gitee.com/px4/PX4-Autopilot.git --recursive
注意:克隆完成后,建议先切到稳定版本,别直接用main分支。main分支是开发分支,可能随时有变动。我一般用 git checkout v1.13.3 这样的稳定tag。

3.3 理解Git工作流

Git工作流听起来高大上,其实核心就三个概念:分支提交合并。你想想看,这就像写文档:

  • 提交:相当于保存一次草稿
  • 分支:相当于另起一页写不同版本
  • 合并:把不同页的内容整合到一起

分支(Branch)

分支是Git最强大的功能之一。在PX4开发中,我们通常这样用:

  • main/master分支:稳定版本,只用来发布
  • develop分支:日常开发的主线
  • feature分支:开发新功能时从develop拉出来,开发完再合并回去
  • bugfix分支:修bug专用

创建分支很简单:

git branch my-feature   # 创建分支
git checkout my-feature # 切换到该分支
# 或者一步到位:
git checkout -b my-feature

查看当前所有分支:

git branch -a

-a会显示远程分支,不带只显示本地。

提交(Commit)

提交是Git的最小工作单元。我见过新手一次提交几百个文件,然后写个"更新"当注释——这其实很不好。好的提交应该是:

  • 原子性:一个提交只做一件事
  • 注释清晰:让人一眼看懂你改了啥

提交的基本流程:

git status          # 先看看改了哪些文件
git add file.c      # 把文件加入暂存区
git commit -m "修复了传感器初始化时的时序问题"

如果你改了很多文件,想一次性全部提交:

git add .
git commit -m "你的注释"

但我不建议这么干。你想想看,万一你改了两个不相关的功能,以后想回退其中一个怎么办?

我的习惯:每次提交前先用 git diff 看看改了啥,确认无误再提交。曾经有一次我手滑改错了文件,还好提前检查发现了。

合并(Merge)

合并就是把两个分支的工作成果整合到一起。最常见的场景是把feature分支合并到develop:

git checkout develop   # 先切到目标分支
git merge my-feature   # 把my-feature合并进来

如果两个分支改了同一个文件的同一行,就会产生冲突。别怕,冲突很正常:

# Git会告诉你哪些文件冲突了
# 打开文件,你会看到类似这样的标记:
<<<<<<< HEAD
// 当前分支的代码
=======
// 要合并进来的代码
>>>>>>> my-feature

# 手动修改成你想要的样子,然后:
git add 冲突文件
git commit -m "解决合并冲突"

嗯,这里要注意,解决冲突时别把别人的代码删了。我建议用git mergetool调出图形化工具,看得更清楚。

Git工作流全景图

下面这张图展示了PX4开发中常用的Git工作流。说白了就是:从主线拉分支 → 开发 → 提交 → 合并回去。循环往复。

PX4开发Git工作流 时间 main v1.12 v1.13 v1.14 develop 合并 feature/new-sensor bugfix/imu-driver main(稳定发布) develop(开发主线) feature(新功能) bugfix(修复)

日常开发流程总结

说白了,你在PX4项目里每天做的事情就是:

  1. git checkout develop 切到开发主线
  2. git pull 拉取最新代码
  3. git checkout -b my-feature 创建自己的分支
  4. 写代码、测试
  5. git add + git commit 提交
  6. git checkout develop 切回去
  7. git merge my-feature 合并
  8. git push 推送到远程
避坑指南:我曾经在合并前忘了git pull,结果本地develop比远程落后了好几个版本,合并时冲突一大堆。所以记住:合并前一定先git pull --rebase,保持本地和远程同步。

好了,Git这块就讲这么多。你只要把分支、提交、合并这三个概念吃透,日常开发基本够用了。至于更高级的操作比如rebase、cherry-pick,等遇到具体场景再学也不迟。


公众号:蓝海资料掘金营,微信deep3321