4、Git基础操作:从零开始掌控代码版本

说实话,我见过太多嵌入式工程师还在用「项目_v1_最终版_改3.rar」这种命名方式。嗯,每次看到我都想叹气。Git 这东西,说白了就是给你的代码装上一台时光机。今天咱们就把最核心的七个命令讲透。

4.1 git init:让一个普通文件夹变成仓库

你有一个项目文件夹,里面全是 .c 和 .h 文件。怎么让 Git 开始管理它?

cd my_embedded_project
git init

就这么简单。执行后,文件夹里会多出一个隐藏的 .git 目录。这就是 Git 的「大脑」——所有版本信息都存这里。

注意:千万别手贱去删 .git 目录。删了就等于格式化你的版本历史。我曾经有个同事,觉得 .git 占地方就删了,结果整个项目回退不了,加班到凌晨三点。

我个人习惯是:新建项目第一件事就是 git init。哪怕还没写代码,先建仓库再说。养成习惯,后面省大事。

4.2 git clone:把别人的代码搬到自己电脑上

你从 GitHub 或者公司 GitLab 上看到一个项目,想拿下来改改?

git clone https://github.com/example/stm32_driver.git

这条命令会做三件事:

  • 在本地创建一个同名文件夹
  • 把远程仓库的所有代码下载下来
  • 自动建立远程跟踪分支

说白了,就是「一键复制整个项目」。我在项目中遇到过最坑的情况是:有人用 git clone 时没注意网络环境,下载到一半断了,然后手动去复制文件。结果 .git 目录不完整,后面 push 全是冲突。记住:clone 必须完整执行完,中途断了就删掉重来。

4.3 git add:把修改「放进篮子」

你改了几个文件,想让 Git 记住这些改动。但 Git 不会自动跟踪所有文件——你得告诉它「我要管这个」。

# 添加单个文件
git add main.c

# 添加所有改动的文件
git add .

# 添加当前目录下所有 .c 文件
git add *.c

这里有个概念叫「暂存区」。你可以把 git add 理解为:把文件放进一个临时篮子,还没正式打包。

我的习惯:从来不用 git add . 一股脑全加。我会用 git status 先看看改了哪些,然后一个一个加。为什么?因为有时候你改了个调试用的临时文件,不小心加进去就尴尬了。

4.4 git commit:给代码拍一张快照

这是 Git 最核心的操作。你改完一段功能,觉得「嗯,这个版本可以了」,就拍一张快照。

git commit -m "修复了UART接收中断的溢出bug"

每次 commit 都会生成一个唯一的 SHA-1 哈希值。这就是你的「版本号」。

关于 commit message,我有三条铁律:

  • 用中文写,团队里大家都看得懂
  • 说清楚「做了什么」,而不是「做了什么文件」
  • 控制在50字以内,太长的拆成多行
避坑指南:我曾经见过有人 commit message 写「改了点东西」。三个月后回来看,鬼知道改了啥。你想想看,如果芯片出了问题要回退版本,这种 message 能帮你找到正确的版本吗?

4.5 git status:随时看看仓库状态

这是我最常用的命令,没有之一。一天能敲几十遍。

git status

它会告诉你三件事:

  • 哪些文件被改了但还没 add
  • 哪些文件已经 add 了但还没 commit
  • 有没有新增的文件还没被跟踪

输出结果会用颜色区分:红色表示未跟踪或已修改,绿色表示已暂存。嗯,看一眼就清楚。

我个人习惯是:每次 commit 之前,先 git status 确认一下。别漏了文件,也别多加了不该加的东西。

4.6 git log:翻翻历史记录

你想看看之前都提交过什么?

# 查看完整历史
git log

# 只看最近3条
git log -3

# 一行显示一条,更清爽
git log --oneline

输出会显示:commit 哈希值、作者、日期、提交信息。这就是你的项目「日记本」。

实用技巧:git log --oneline --graph 可以看分支图。我在项目中排查问题时,经常靠这个图来理清「哪个分支先合并的」「哪个提交引入了 bug」。

4.7 git diff:看看具体改了啥

git status 告诉你「改了哪些文件」,但没告诉你「具体改了哪一行」。这时候就需要 git diff

# 查看工作区和暂存区的差异
git diff

# 查看暂存区和上次commit的差异
git diff --staged

# 比较两个commit之间的差异
git diff commit1_hash commit2_hash

输出会用 +- 标记新增和删除的行。绿色表示新增,红色表示删除。

我记得有一次,一个同事说「我就改了一行代码」,结果 git diff 一看,改了三十行。为什么?因为他把缩进全改了。所以我现在每次 commit 前,都会 git diff 扫一眼,确认改动范围。

总结一下这七个命令的关系

命令 作用 使用频率
git init 创建新仓库 每个项目一次
git clone 复制远程仓库 每个项目一次
git add 将改动放入暂存区 每天多次
git commit 将暂存区内容生成版本 每天多次
git status 查看当前仓库状态 非常频繁
git log 查看提交历史 经常
git diff 查看具体改动内容 经常
核心工作流:改代码 → git status(确认改了啥) → git add(放入暂存区) → git status(再确认一次) → git diff --staged(检查具体改动) → git commit(生成版本) → git log(确认提交成功)

这七个命令,就是 Git 的「七种武器」。你不需要一开始就记住所有参数,先把这七个用熟。后面那些高级操作,都是在这基础上搭积木。

嗯,下一章咱们聊聊分支管理。那才是 Git 真正强大的地方。