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
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 checkout develop切到开发主线git pull拉取最新代码git checkout -b my-feature创建自己的分支- 写代码、测试
git add+git commit提交git checkout develop切回去git merge my-feature合并git push推送到远程
git pull,结果本地develop比远程落后了好几个版本,合并时冲突一大堆。所以记住:合并前一定先git pull --rebase,保持本地和远程同步。
好了,Git这块就讲这么多。你只要把分支、提交、合并这三个概念吃透,日常开发基本够用了。至于更高级的操作比如rebase、cherry-pick,等遇到具体场景再学也不迟。
公众号:蓝海资料掘金营,微信deep3321