3、Git核心概念:工作区、暂存区、本地仓库、远程仓库的关系与操作流程
说实话,很多FPGA工程师刚开始用Git时,最懵的就是这四个区到底在干嘛。
我记得有个同事,直接把整个工程文件夹往远程仓库一推,结果发现.git目录占了几个G,还带了一堆编译中间文件。嗯,这就是没搞懂工作区和暂存区的区别。
今天咱们就把这四个概念彻底捋清楚。
3.1 四个区的定义与角色
先给个直观的比喻,你想想看:
- 工作区(Working Directory):就是你电脑上能看到、能编辑的文件夹。比如你的vivado_project/目录。说白了,这就是你干活的地方。
- 暂存区(Staging Area / Index):一个临时存放区,用来收集你准备提交的改动。我个人习惯叫它「候车室」——你决定哪些文件上车,哪些再等等。
- 本地仓库(Local Repository):藏在.git目录里的数据库。你每次git commit,就是把暂存区的内容永久存到本地仓库里。
- 远程仓库(Remote Repository):放在服务器上的仓库,比如GitHub、GitLab或者公司内网搭建的仓库。大家通过它来同步代码。
核心一句话:工作区是你改代码的地方,暂存区是你挑代码的地方,本地仓库是你存代码的地方,远程仓库是你分享代码的地方。
3.2 四个区的关系图
下面这张图,我建议你保存下来。每次搞不清流程时,看一眼就明白了。
💡 我的经验:刚开始用Git时,我总喜欢一次性git add .把所有文件都扔进暂存区。后来发现这样很容易把编译生成的临时文件也提交了。现在我都是先git status看看改了哪些,再一个一个git add。虽然慢一点,但心里踏实。
3.3 标准操作流程
一个典型的FPGA项目开发流程,在Git里走一遍是这样的:
- 初始化仓库:
git init或git clone - 修改文件:在Vivado里改代码、加IP核、调约束
- 查看状态:
git status—— 这个命令我一天能敲几十遍 - 添加到暂存区:
git add <文件>或git add . - 提交到本地仓库:
git commit -m "描述信息" - 推送到远程仓库:
git push
举个例子,假设你刚改了一个时序约束文件:
# 1. 看看改了啥
git status
# 输出:modified: constraints/timing.xdc
# 2. 把约束文件加入暂存区
git add constraints/timing.xdc
# 3. 提交到本地仓库
git commit -m "调整了DDR接口的建立时间约束"
# 4. 推送到远程
git push origin main
3.4 避坑指南
⚠️ 我曾经踩过的坑:
- 忘了git add就直接commit:Git只会提交暂存区里的内容。如果你改了文件但没git add,commit是不会包含这些改动的。我刚开始时经常纳闷「明明改了代码,怎么提交后还是旧的?」——嗯,就是忘了add。
- git commit -m 写得太随意:比如「改了bug」、「更新代码」。这种描述过一个月你自己都看不懂。我现在的习惯是:
git commit -m "[模块名] 具体改动内容",比如「[DDR] 将写数据延迟从2.5ns调整为3.0ns,解决高频下数据采样错误」。 - git push 前不pull:如果远程仓库有别人推送的新提交,你的push会被拒绝。正确做法是先
git pull,解决冲突后再push。
3.5 四个区的数据流向总结
| 操作 | 数据流向 | 常用命令 | 说明 |
|---|---|---|---|
| 添加 | 工作区 → 暂存区 | git add | 把改动「标记」为待提交 |
| 提交 | 暂存区 → 本地仓库 | git commit | 生成一个永久的历史快照 |
| 推送 | 本地仓库 → 远程仓库 | git push | 把本地历史同步到服务器 |
| 拉取 | 远程仓库 → 本地仓库 | git pull | 获取远程的最新历史 |
| 查看 | 工作区 ↔ 暂存区 | git diff | 对比工作区和暂存区的差异 |
记住这个原则:工作区是你随便折腾的地方,暂存区是你精挑细选的地方,本地仓库是你存档的地方,远程仓库是你和团队同步的地方。四个区各司其职,别混着用。
好了,这四个区的概念和操作流程就讲到这里。你只要记住那张图,再配合git status多看几遍,很快就能形成肌肉记忆。