版本控制入门:Git基础概念、仓库初始化、提交与分支、合并与冲突解决
版本控制这件事,说白了就是给你的代码装一台“时光机”。
我刚入行那会儿,项目文件夹里全是“final_v1”、“final_v2”、“最终版_再也不改”这种名字。直到有一次我把同事的代码覆盖了,两个人对着一个文件面面相觑……嗯,从那以后,我成了Git的忠实布道者。
Git是什么?为什么嵌入式项目离不开它?
Git是一个分布式版本控制系统。你想想看,我们做嵌入式开发,代码、配置文件、脚本、文档,动不动几十上百个文件。没有版本控制,改错了想回退?难。多人协作想合并?更难。
Git的核心思想就三点:
- 快照:每次提交都保存整个项目的状态,不是只存差异
- 本地化:大部分操作都在你电脑上完成,不需要联网
- 分支:可以同时开发多个功能,互不干扰
我个人习惯:每个嵌入式项目从第一天就初始化Git仓库。哪怕只有我一个人写代码,这个习惯也从来没断过。为什么?因为“改坏了想回去”这种需求,迟早会来。
仓库初始化:从零开始
创建一个Git仓库,只需要一行命令:
cd /path/to/your/project
git init
执行完,项目目录下会多出一个隐藏的.git文件夹。这就是你的版本库,所有历史记录都存在里面。
我曾经见过有人把.git文件夹删了,说“太占空间”。结果项目出了问题,想回退版本,发现历史全没了……所以,.git文件夹千万别动。
注意:不要在已有的Git仓库里再执行git init,这会重新初始化,导致历史丢失。
提交:把代码“拍个照”
提交是Git最基础的操作。流程很简单:
- 修改文件
- 用
git add把文件加入暂存区 - 用
git commit提交
git add main.c
git add include/
git commit -m "添加了UART驱动初始化代码"
这里有个小细节:git add是把文件放到“暂存区”,git commit才是真正生成一个快照。为什么要分两步?因为有时候你改了好几个文件,但只想提交其中一部分。比如你修复了一个bug,同时加了一个新功能,最好分两次提交,方便以后回溯。
我的建议:提交信息要写清楚。别写“fix bug”这种,要写“修复了UART接收缓冲区溢出导致系统崩溃的问题”。半年后你回头看,会感谢现在的自己。
分支:并行开发的利器
分支是Git最强大的功能之一。你可以把它想象成平行宇宙——每个分支上的代码互不影响。
嵌入式项目里,我常用的分支策略是这样的:
| 分支名称 | 用途 |
|---|---|
main |
稳定版本,只合入经过测试的代码 |
develop |
日常开发,所有功能先合到这里 |
feature/xxx |
新功能开发,比如feature/i2c-driver |
fix/xxx |
bug修复分支 |
创建和切换分支:
git branch feature/i2c-driver
git checkout feature/i2c-driver
# 或者一步到位
git checkout -b feature/i2c-driver
你可以在分支上随意修改、提交,完全不影响main分支。等开发完了,再合并回去。
合并与冲突解决
合并就是把一个分支的改动,应用到另一个分支上。最常用的命令是:
git checkout main
git merge feature/i2c-driver
如果两个分支修改了同一个文件的同一行代码,Git就不知道谁是对的。这时候就会产生冲突。
冲突长什么样?打开冲突文件,你会看到类似这样的内容:
<<<<<<< HEAD
int baud_rate = 115200;
=======
int baud_rate = 9600;
>>>>>>> feature/i2c-driver
<<<<<<< HEAD和=======之间是当前分支的内容,=======和>>>>>>>之间是待合并分支的内容。你需要手动决定保留哪个,或者改成新的值。
避坑指南:我曾经在合并时,看到冲突就慌了,直接把整个文件删了重新写。后来发现其实只需要改冲突的那几行。记住,git status会告诉你哪些文件有冲突,git diff可以查看具体差异。冷静处理,别冲动。
解决完冲突后,记得:
git add 冲突文件
git commit -m "合并feature/i2c-driver,解决baud_rate冲突"
知识体系总览
下面这张图,把Git的核心概念串起来了:
日常开发流程
一个典型的Git工作流是这样的:
- 从
main分支创建feature/xxx分支 - 在分支上开发、提交
- 开发完成后,切回
main,合并分支 - 如果遇到冲突,手动解决
- 推送远程仓库(如果有的话)
这套流程,我在多个嵌入式项目里验证过。不管是裸机程序还是RTOS项目,都适用。
一个小技巧:提交前用git diff看看改了哪些内容。我经常发现一些不该提交的调试打印语句,就是靠这个命令抓出来的。
Git不难,难的是养成习惯。刚开始可能会觉得麻烦,但用顺手了,你会发现它就像呼吸一样自然。
公众号:蓝海资料掘金营,微信deep3321