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
我的习惯:Windows用户一定要选「Git Bash」组件,这样你就能在Windows里用Linux风格的命令行,后面编译ArduPilot会省很多事。

装好之后,第一件事是配置身份。这步很多人跳过,结果提交代码时显示「Unknown」,查问题都查不到人。

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

我个人习惯把用户名和邮箱写成和GitHub账号一致,这样提交记录能直接关联到个人主页。另外,再配个默认分支名,现在GitHub默认用main,但ArduPilot官方还是master,我建议你统一一下:

git config --global init.defaultBranch master
注意:邮箱一定要填真实的。我曾经有个同事填了个假邮箱,后来代码出问题想找他确认,GitHub上根本搜不到人,只能一个个翻提交记录,那叫一个痛苦。

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 feature/avoidance fix/baro-drift master分支只接受经过充分测试的代码 开发者在特性分支上工作,通过Pull Request合并

在ArduPilot里,你主要会接触到这几类分支:

分支类型 命名示例 用途
主分支 master 稳定发布版,只合并经过严格测试的代码
版本分支 Copter-4.5, Plane-4.3 针对特定版本的维护分支,修复bug用
特性分支 feature/avoidance 开发新功能,完成后合并回版本分支
修复分支 fix/baro-drift 紧急修复,通常从master拉出,修完立即合并
我的建议:刚开始不要直接在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这东西,刚开始会觉得麻烦,但用顺手了就会发现——没有它,你根本不敢改代码。尤其是飞控这种跑在硬件上的东西,改错了可是要炸机的。