3、代码版本管理:Git基础操作与分支策略
说实话,我刚入行那会儿,对Git的态度就是「能用就行」。直到有一次,我在调试一个无刷直流电机的FOC算法,改了一整天代码,结果把整个工程搞崩了。想回退?不会。想找之前的版本?找不到。那天晚上我对着屏幕发呆,深刻体会到——不会Git的电机工程师,就像不带万用表去修电路板。
好,咱们今天就把Git这块硬骨头啃下来。我保证,学完这章,你至少能应付90%的日常开发场景。
3.1 Git基础操作:从clone到push
先说说最常用的几个命令。你想想看,咱们平时写代码,无非就是:把代码拿下来 → 改一改 → 存起来 → 发回去。Git就是干这个的。
3.1.1 git clone —— 把代码拉到本地
这个最简单,但也最容易踩坑。我见过不少新手直接 git clone 完就开始改,结果发现分支不对。
# 克隆主分支
git clone https://github.com/example/motor-firmware.git
# 克隆指定分支
git clone -b develop https://github.com/example/motor-firmware.git
3.1.2 git commit —— 保存你的工作
commit就像拍照。你改完一段代码,拍一张照,以后想回来就能回来。但很多人拍的照片太模糊——commit message写个「update」或者「fix」,过两天自己都看不懂。
# 添加所有修改到暂存区
git add .
# 添加指定文件
git add src/motor_control.c
# 提交并写清楚message
git commit -m "fix: 修复FOC电流环PI参数溢出问题"
git commit --amend 把修改合并到上一个commit里。
3.1.3 git push —— 把代码发到远程
push之前,我建议你先pull一下。为什么?因为别人可能已经改了同一份代码。你不pull就push,大概率会冲突。
# 先拉取最新代码
git pull
# 再推送
git push origin develop
嗯,这里要注意:git pull 其实是 git fetch + git merge 的组合。如果你不想自动合并,可以用 git fetch 先看看远程改了啥,再手动合并。
3.2 分支管理策略:别让代码乱成一锅粥
分支管理,说白了就是「怎么让大家同时干活又不打架」。我在项目中见过最乱的情况:所有人都在master上改,改完就push,结果代码冲突多到让人崩溃。
我个人比较推荐 Git Flow 的简化版,适合咱们电机调试这种场景:
| 分支类型 | 命名规则 | 用途 |
|---|---|---|
| 主分支 | master / main | 只放稳定版本,不能直接改 |
| 开发分支 | develop | 日常开发,所有feature分支从这里拉 |
| 功能分支 | feature/xxx | 开发新功能,比如 feature/foc-optimize |
| 修复分支 | hotfix/xxx | 紧急修bug,比如 hotfix/overcurrent-protect |
我的建议:每个电机调试任务,都开一个feature分支。比如你要优化电流环,就建一个 feature/current-loop-opt。调试完了,测试通过,再合并到develop。这样即使改崩了,也不会影响别人。
3.3 .gitignore文件配置:别把垃圾文件传上去
你想想看,你的工程目录里是不是有这些文件:编译生成的 .o 文件、IDE的配置文件、调试日志……这些东西传到Git仓库里,除了占空间,没有任何意义。
.gitignore 就是用来告诉Git:这些文件你别管。
# 编译生成的文件
*.o
*.elf
*.hex
*.bin
# IDE配置文件
.idea/
.vscode/
*.swp
# 调试日志
*.log
debug/
# 临时文件
*~
.DS_Store
build/ 目录都传上去了,结果仓库体积暴涨到几百MB。后来用 git filter-branch 才清理掉,折腾了大半天。所以,项目一开始就要配好 .gitignore。
3.4 代码回滚实战:后悔药怎么吃
代码写崩了怎么办?别慌,Git给你准备了后悔药。而且不止一种。
3.4.1 git reset —— 硬回退
如果你还没push,只是本地commit错了,用reset最干脆。
# 回退到上一个commit,保留修改
git reset --soft HEAD~1
# 回退到上一个commit,不保留修改(慎用)
git reset --hard HEAD~1
--hard 会直接丢弃你的修改,用之前一定确认清楚。我一般先用 git log 看看commit历史,确认要回退到哪个版本。
3.4.2 git revert —— 安全回退
如果你已经push了,或者不想丢失历史记录,用revert。它不会删除commit,而是创建一个「反操作」的新commit。
# 回退到某个commit
git revert HEAD~1
# 回退到指定commit
git revert a1b2c3d
说白了,reset是「时光倒流」,revert是「打个补丁」。我个人在团队协作中更推荐revert,因为不会影响别人的历史。
3.4.3 实战场景:误删了关键代码
有一次我在调试电机速度环,不小心删了一段PI控制器的代码。等我发现时,已经又commit了两次。怎么办?
# 1. 先看看commit历史
git log --oneline
# 2. 找到删除代码之前的那个commit
# 假设是 abc1234
# 3. 用revert回退
git revert abc1234
# 4. 如果revert冲突了,手动解决冲突
# 然后 git add . && git commit
嗯,这里要注意:revert也可能产生冲突。如果冲突了,别慌,手动改一下代码,再commit就行。
3.5 小结
Git这东西,说白了就是熟能生巧。你刚开始可能觉得命令多、记不住,但只要你坚持用,两周之后就会形成肌肉记忆。
最后送你一句话:多commit,勤push,分支管理别偷懒。这是我在无数次「代码崩了」之后总结出来的血泪教训。