4、Git版本控制:Git的安装与配置、克隆ArduPilot仓库、理解分支管理、常用Git命令实战
说实话,很多刚接触ArduPilot的朋友,第一步就卡在Git上。我见过有人直接把源码当压缩包下载,改完代码没法同步,最后整个工程乱成一锅粥。Git这东西,说白了就是个时光机加协作工具。你想想看,飞控代码几百个开发者同时在改,没有版本控制,那不得天天打架?
这一章,我们就从零开始,把Git装好、配好,然后亲手把ArduPilot仓库拉下来。我会把我这些年踩过的坑、养成的习惯,都揉进这里面。
4.1 Git的安装与基础配置
先搞定安装。不同系统方法不一样,我列个表,你对着自己的系统来。
| 操作系统 | 安装方式 | 验证命令 |
|---|---|---|
| Ubuntu/Debian | sudo apt install git |
git --version |
| macOS | brew install git 或安装Xcode Command Line Tools |
git --version |
| Windows | 下载 Git for Windows,一路默认安装 | 在Git Bash里运行 git --version |
装好之后,第一件事是配置身份。这步很多人跳过,结果提交代码时显示「Unknown」,查问题都查不到人。
git config --global user.name "你的名字"
git config --global user.email "你的邮箱@example.com"
我个人习惯把用户名和邮箱写成和GitHub账号一致,这样提交记录能直接关联到个人主页。另外,再配个默认分支名,现在GitHub默认用main,但ArduPilot官方还是master,我建议你统一一下:
git config --global init.defaultBranch master
4.2 克隆ArduPilot仓库
配置完Git,下一步就是把ArduPilot的源码拉到本地。这个过程叫「克隆(clone)」。ArduPilot的官方仓库在GitHub上,地址是:
https://github.com/ArduPilot/ardupilot.git
打开终端,进到你打算放代码的目录,然后运行:
git clone https://github.com/ArduPilot/ardupilot.git
这个命令会做三件事:
- 在本地创建一个叫
ardupilot的文件夹 - 把远程仓库的所有代码和历史记录都下载下来
- 自动把远程仓库关联为
origin
下载时间取决于你的网速,ArduPilot仓库大概1-2GB。我记得第一次克隆时等了快半小时,后来发现可以用--depth=1参数只拉最新版本,省时间:
git clone --depth=1 https://github.com/ArduPilot/ardupilot.git
--depth=1就够了。但如果你要参与开发、做代码审查,建议完整克隆,因为很多调试需要回溯历史。
4.3 理解分支管理
分支是Git最核心的概念之一。我打个比方:你写飞控代码,主分支是稳定版,就像一架已经调好的飞机。你想加一个新功能,比如自动避障,你不能直接在飞机上改,万一改坏了飞不起来怎么办?正确的做法是:从主分支拉一个新分支,在新分支上改,测试通过后再合并回去。
ArduPilot的分支结构大致是这样的:
在ArduPilot里,你主要会接触到这几类分支:
| 分支类型 | 命名示例 | 用途 |
|---|---|---|
| 主分支 | master |
稳定发布版,只合并经过严格测试的代码 |
| 版本分支 | Copter-4.5, Plane-4.3 |
针对特定版本的维护分支,修复bug用 |
| 特性分支 | feature/avoidance |
开发新功能,完成后合并回版本分支 |
| 修复分支 | fix/baro-drift |
紧急修复,通常从master拉出,修完立即合并 |
4.4 常用Git命令实战
下面这些命令,是我每天都会用的。你不需要一次全记住,但要知道它们能干什么。用多了自然就熟了。
4.4.1 查看状态与历史
# 查看当前仓库状态(哪些文件改了、哪些没跟踪)
git status
# 查看提交历史(按时间倒序)
git log --oneline --graph --all
# 查看某次提交的具体改动
git show <commit-hash>
git status是我用得最多的命令,没有之一。每次提交前我都会跑一遍,确认改对了文件。
4.4.2 分支操作
# 创建新分支
git branch my-feature
# 切换到新分支
git checkout my-feature
# 创建并切换(一步到位)
git checkout -b my-feature
# 查看所有分支(*表示当前分支)
git branch -a
# 删除分支
git branch -d my-feature
-d是安全删除,如果分支没合并会报错。强制删除用-D,但慎用。
4.4.3 提交与推送
# 把文件加入暂存区
git add filename.c
# 或者一键添加所有改动
git add .
# 提交到本地仓库
git commit -m "修复气压计漂移问题"
# 推送到远程仓库
git push origin my-feature
提交信息怎么写?我有个简单的原则:第一行用英文,概括改动(不超过50字符),空一行后写详细说明。比如:
fix: correct barometer drift compensation
The previous algorithm had a timing issue that caused
the drift correction to be applied twice in some cases.
This fix ensures the correction is only applied once per cycle.
4.4.4 同步与合并
# 拉取远程最新代码(但不合并)
git fetch origin
# 拉取并合并到当前分支
git pull origin master
# 把另一个分支合并到当前分支
git merge feature/avoidance
这里有个坑:git pull本质上是git fetch加git merge。如果你本地有未提交的改动,直接git pull可能会产生冲突。我习惯先git stash暂存本地改动,拉完代码再git stash pop恢复。
4.4.5 解决冲突
冲突是Git里最让人头疼的事,但也是必须面对的。当两个人改了同一个文件的同一行,Git就不知道听谁的,它会这样标记:
<<<<<<< HEAD
这是你的改动
=======
这是别人的改动
>>>>>>> feature-branch
你需要手动编辑文件,删掉<<<<<<<、=======、>>>>>>>这些标记,保留正确的代码。然后:
git add 冲突文件
git commit -m "解决合并冲突"
git diff对比一下,确认没误删。
4.5 本章小结
这一章我们走完了Git的完整流程:安装配置、克隆仓库、理解分支、常用命令。这些东西看起来琐碎,但它们是后面所有工作的基础。你想想看,后面我们要编译固件、修改参数、提交补丁,每一步都离不开Git。
嗯,Git这东西,刚开始会觉得麻烦,但用顺手了就会发现——没有它,你根本不敢改代码。尤其是飞控这种跑在硬件上的东西,改错了可是要炸机的。