4、Git基本操作:git init、git clone、git add、git commit、git status、git log实战
好,咱们直接进入正题。这一章讲的是Git最核心的六个命令。说白了,你只要把这六个命令玩熟了,日常开发基本就够用了。我刚开始带FPGA团队的时候,发现很多同事连git status都不怎么看,结果经常出现「代码丢了」「改错了回不去」这种问题。嗯,咱们今天就把这些坑一个个填上。
4.1 git init —— 从零开始建仓库
你要用Git管理一个FPGA项目,第一步就是初始化仓库。命令很简单:
cd /path/to/your/fpga_project
git init
执行完,当前目录下会多出一个隐藏的.git文件夹。这个文件夹就是Git的「大脑」,所有版本信息都存里面。我个人习惯,新建项目的第一件事就是跑git init,哪怕还没写一行代码。
git init,而不是在.runs或.cache这些临时文件夹里。否则你会把一堆编译中间文件也纳入版本控制,那可就乱套了。
4.2 git clone —— 把远程仓库拉下来
如果你不是从零开始,而是加入一个已有的项目,那就用git clone。比如:
git clone https://github.com/example/fpga_uart.git
这会把整个仓库(包括所有历史版本)下载到本地。我记得有一次,同事从SVN转过来,以为clone只是下载最新代码,结果发现连三年前的版本都在本地,吓了一跳。其实这就是Git的设计哲学——每个人都是完整的备份。
--depth 1参数,只克隆最新版本,节省时间和磁盘空间。等需要历史记录时再用git fetch --unshallow补全。
4.3 git status —— 随时查看当前状态
这个命令我一天能跑几十次。它告诉你三件事:
- 哪些文件被修改了(但还没暂存)
- 哪些文件被暂存了(但还没提交)
- 哪些文件是未跟踪的(Git还没管它们)
git status
输出大概长这样:
On branch main
Changes not staged for commit:
modified: src/top.v
modified: constraints/top.xdc
Untracked files:
testbench/tb_top.v
你想想看,如果每次提交前不看一眼status,你很可能把不该提交的文件(比如.o、.log)也加进去了。我曾经就因为没看状态,把一个几百MB的仿真波形文件提交到了仓库,结果同事拉代码时直接崩溃……
4.4 git add —— 把改动放进「暂存区」
Git的提交分两步:先add,再commit。add就是把你想保存的改动,放到一个叫「暂存区」的地方。你可以理解成购物车——先挑好要买的东西,最后统一结账。
# 添加单个文件
git add src/top.v
# 添加所有改动(慎用!)
git add .
# 添加当前目录所有 .v 文件
git add *.v
git add .。因为Vivado或Quartus会生成大量临时文件(.jou、.log、.str等),你一不小心就把它们全加进去了。正确做法是:先用git status看清楚,然后一个个git add,或者用.gitignore文件过滤掉不需要的文件。
4.5 git commit —— 真正保存一个版本
add之后,用commit把暂存区的内容正式保存为一个版本。每次提交都要写一条消息,说明这次改了啥。
git commit -m "feat: 添加UART发送模块,支持8位数据位"
我个人习惯,提交消息要写得清晰一点。别写什么「修改bug」「更新代码」这种废话。你想想看,三个月后你回来看历史,看到「修改bug」四个字,你还能想起来改了啥吗?
4.6 git log —— 查看提交历史
想看之前都提交了啥?用git log:
git log
输出示例:
commit a1b2c3d4e5f6...
Author: Zhang San <zhangsan@example.com>
Date: Mon Mar 10 14:30:00 2025 +0800
fix: 修复UART接收时起始位检测的时序问题
commit f6e5d4c3b2a1...
Author: Li Si <lisi@example.com>
Date: Sun Mar 9 10:15:00 2025 +0800
feat: 添加波特率自动检测功能
常用的几个参数:
git log --oneline—— 一行显示一个提交,简洁明了git log --graph—— 显示分支合并图,适合看多人协作历史git log -p—— 显示每次提交的具体改动内容
我曾经在调试一个跨时钟域的问题时,就是靠git log -p一步步回溯,发现是某次提交里把同步器的级数从2级改成了1级。嗯,这种时候你就知道好用的提交消息有多重要了。
知识体系总览
下面这张图把六个命令的关系串起来了。你一看就明白:
实战演练:一个完整的FPGA模块提交流程
假设你写了一个UART接收模块,想把它纳入版本管理。完整流程如下:
- 初始化仓库:
git init - 查看状态:
git status—— 看到uart_rx.v是未跟踪的 - 添加到暂存区:
git add uart_rx.v - 再次查看状态:
git status—— 看到文件变绿了,表示已暂存 - 提交:
git commit -m "feat: 添加UART接收模块,支持8N1格式" - 查看历史:
git log --oneline—— 确认提交成功
git init只做一次,项目开始时执行git status随时用,提交前必看git add要精准,别一股脑全加git commit消息要写清楚,方便以后回溯git log帮你了解项目演变过程git clone用于从远程拉取已有项目
好了,这六个命令就是Git的「基本功」。你只要把它们练熟了,日常开发基本够用。下一章咱们会聊分支管理——那才是多人协作的真正利器。