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,哪怕还没写一行代码。

小技巧: 如果你用的是Vivado或Quartus,建议在工程目录的根目录执行git init,而不是在.runs.cache这些临时文件夹里。否则你会把一堆编译中间文件也纳入版本控制,那可就乱套了。

4.2 git clone —— 把远程仓库拉下来

如果你不是从零开始,而是加入一个已有的项目,那就用git clone。比如:

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

这会把整个仓库(包括所有历史版本)下载到本地。我记得有一次,同事从SVN转过来,以为clone只是下载最新代码,结果发现连三年前的版本都在本地,吓了一跳。其实这就是Git的设计哲学——每个人都是完整的备份。

注意: 克隆大仓库时(比如包含大量IP核的FPGA项目),建议加上--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,再commitadd就是把你想保存的改动,放到一个叫「暂存区」的地方。你可以理解成购物车——先挑好要买的东西,最后统一结账。

# 添加单个文件
git add src/top.v

# 添加所有改动(慎用!)
git add .

# 添加当前目录所有 .v 文件
git add *.v
实战建议: 在FPGA项目中,我强烈建议不要直接用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」四个字,你还能想起来改了啥吗?

提交频率: 在FPGA开发中,我建议每完成一个独立功能就提交一次。比如「添加了FIFO模块」「修改了时钟分频逻辑」「修复了跨时钟域同步问题」。不要等到下班前才一次性提交,那样提交消息会变得又臭又长。

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级。嗯,这种时候你就知道好用的提交消息有多重要了。

知识体系总览

下面这张图把六个命令的关系串起来了。你一看就明白:

Git基本操作流程 工作区 你的源代码文件 (.v / .xdc / .tcl) 暂存区 准备提交的改动 (购物车) 本地仓库 已保存的版本历史 (.git 目录) git add git commit 辅助命令(随时可用) git status 查看当前状态 git log 查看提交历史 git init / clone 创建/克隆仓库 核心流程:工作区 → git add → 暂存区 → git commit → 本地仓库

实战演练:一个完整的FPGA模块提交流程

假设你写了一个UART接收模块,想把它纳入版本管理。完整流程如下:

  1. 初始化仓库git init
  2. 查看状态git status —— 看到uart_rx.v是未跟踪的
  3. 添加到暂存区git add uart_rx.v
  4. 再次查看状态git status —— 看到文件变绿了,表示已暂存
  5. 提交git commit -m "feat: 添加UART接收模块,支持8N1格式"
  6. 查看历史git log --oneline —— 确认提交成功
核心要点:
  • git init 只做一次,项目开始时执行
  • git status 随时用,提交前必看
  • git add 要精准,别一股脑全加
  • git commit 消息要写清楚,方便以后回溯
  • git log 帮你了解项目演变过程
  • git clone 用于从远程拉取已有项目

好了,这六个命令就是Git的「基本功」。你只要把它们练熟了,日常开发基本够用。下一章咱们会聊分支管理——那才是多人协作的真正利器。


专注资料整理