版本控制入门: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最基础的操作。流程很简单:

  1. 修改文件
  2. git add把文件加入暂存区
  3. 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 版本控制 仓库初始化 git init 提交 add + commit 分支 branch + checkout 合并 merge 冲突解决 手动编辑冲突区域 → add → commit 实践建议 小步提交 · 清晰信息 · 分支隔离 · 及时合并

日常开发流程

一个典型的Git工作流是这样的:

  1. main分支创建feature/xxx分支
  2. 在分支上开发、提交
  3. 开发完成后,切回main,合并分支
  4. 如果遇到冲突,手动解决
  5. 推送远程仓库(如果有的话)

这套流程,我在多个嵌入式项目里验证过。不管是裸机程序还是RTOS项目,都适用。

一个小技巧:提交前用git diff看看改了哪些内容。我经常发现一些不该提交的调试打印语句,就是靠这个命令抓出来的。

Git不难,难的是养成习惯。刚开始可能会觉得麻烦,但用顺手了,你会发现它就像呼吸一样自然。


公众号:蓝海资料掘金营,微信deep3321