02 — 三区模型工作区、暂存区、仓库写在前面这一章要解决什么如果你刚学完「Git 是什么」心里可能还有一个更具体的困惑我在编辑器里点了「保存」为什么 Git 还说「没有东西可提交」这一章就是专门回答这个问题的。学完后你应该能用自己的话说明文件在 Git 里会待在哪三块地方分清「保存文件」和「提交历史」不是一回事看懂git status在说什么哪一块脏了知道git add和git commit各自干了哪一步读者设定大一同学几乎没有做过团队项目可以把 Git 想成「会记作业历史的工具」。1. 定位为什么要先讲「三块地方」1.1 一句话先记住Git 管文件时不是只有一个「文件夹」而是有三块地方在配合白话名字教材里的名字你现在先这样理解书桌工作区你正在改、正在看的那些文件待交作业篮暂存区「下次要正式记进历史的那一叠」档案柜本地仓库已经正式记下的一版版历史藏在.git里很多人卡住是因为把这三块当成了一块。1.2 生活里的类比先建立感觉想象你在写课程报告书桌上摊着 Word / 代码你边改边保存——这是「书桌」。写到一个小段落满意了你把它放进「待交作业篮」准备等会儿一起交——这是「暂存区」。你决定「这一阶段算完成了」把篮子里的内容正式登记进档案还写一句说明今天完成了什么——这是「提交到仓库」。关键点只在书桌保存 →档案柜里还没有新记录放进篮子但还没正式登记 →历史里仍然没有这一笔只有「放进篮子 正式登记」两步都做完 → 才算真正记进 Git 历史图书桌工作区→ 待交作业篮暂存区→ 档案柜仓库。箭头对应git add与git commit。1.3 和你已经会的事对比你已经会的容易误以为其实编辑器「保存」等于 Git 记了一笔历史只改了书桌工作区另存为很多副本等于版本管理没有统一说明、难对比、难协作网盘自动历史等于 Git网盘很少按「你主动说明为什么改」来记Git 强调你自己提交并写说明第 01 章Git ≠ 网站学 Git 就是学 GitHub本章先只谈本机三块地方还不谈上传认知锚点保存是给「现在的你」看的提交是给「以后的你 / 同学 / 助教」留证据的。1.4 本章内容目标学完能做什么目标你能做到的事说清模型指着图讲清三块地方读状态看git status知道文件在书桌还是在篮子里会两步会用git add、git commit完成一次「记历史」会对比知道git diff和「看已暂存差异」分别在比什么少踩坑不再以为「保存了就等于提交了」2. 本质三块地方到底是什么2.1 先看总图图工作区、暂存区、仓库以及add/restore/commit的方向。再看简化流程图日常两步——git add放进暂存区git commit记进仓库。2.2 用白话拆开三块1工作区 你的书桌就是你在资源管理器 / 编辑器里看到的那些项目文件。你改代码、改报告、点保存都发生在这里。只改工作区时Git 的历史还不会自动多一笔。2暂存区 待交作业篮英文教材常叫staging area或index专有名词记住即可。作用让你挑选「下一次正式记录要包含哪些改动」。可以只放一个文件也可以放很多文件不必一次把书桌上所有乱七八糟的东西都交出去。在磁盘上它对应仓库里的.git/index这类内部文件现在不用深究格式。3仓库 档案柜本机历史真正的历史记录在项目下的隐藏目录.git里。每一次git commit相当于往档案柜里塞进一张「当时项目长什么样」的快照并写一句说明。以后可以回看、对比、在出问题时找回思路。2.3 文件在 Git 眼里的「人生阶段」除了「三块地方」入门教材如 Pro Git还会用文件状态来说事。对大一同学可以先记四类感觉白话状态大致意思常见下一步未跟踪Git 还不认识这个新文件git add告诉它「请开始管」已修改但未暂存老文件改了但还没放进篮子git add放进篮子已暂存已在篮子里准备正式登记git commit干净书桌和档案柜一致没什么要交的继续写新内容图文件从「未跟踪 → 已暂存 → 已提交 → 又被修改」的常见循环。来源Pro Git 中文版《记录每次更新到仓库》知识共享署名-非商业性使用-相同方式共享 3.0。小提示上图英文标签是原书附图你只要抓住箭头方向改 → 加入暂存 → 提交 → 再改。2.4 必须先接受的几条「硬规矩」规矩白话解释保存 ≠ 提交保存只动书桌提交才进档案柜不add就commit常常等于「篮子是空的」仓库不会自动猜你想交哪份暂存的是「某一时刻的内容」add之后又改文件要再add一次篮子里才是最新未跟踪文件默认不会进历史除非你明确add或以后学忽略规则先看状态再提交git status是仪表盘养成习惯2.5 新手最常踩的坑现象原因怎么办明明改了git diff却是空的改动可能已经在暂存区里再看「已暂存的差异」见后文nothing to commit篮子是空的或根本没改已跟踪文件先git status再决定是否add提交了不该交的文件git add .加得太猛先列文件名再加重要文件一个一个加以为提交了就上传到网上了提交默认只在本机档案柜上传是以后「远程」章节的事3. 建议的学习顺序先建立书桌比喻 → 看三区总图 → 动手新建文件看状态 → git add再看状态 → git commit再看状态 → 学会两种「看差异」 → 完成章末小实验不要一上来背很多参数。这一章只要求状态说得清、两步走得顺。4. 动手准备可丢弃目录请找一个可以随便删的练习目录不要用正在交的作业仓库练手。mkdirlab-three-treescdlab-three-treesgitinit-bmaingitconfig user.nameAda Examplegitconfig user.emailadaexample.com说明git init -b main在本目录创建 Git 仓库初始分支名叫main名字和邮箱只是写在提交记录上的「作者信息」演示用虚构身份即可本系列命令样例在 Linux 上用Git 2.43.0验证过你电脑版本接近即可git--versiongit version 2.43.05. 跟着做看清「文件在哪一块」5.1 只在书桌新建文件还没告诉 Gitprintfhello\nnotes.txtgitstatus输出会类似你的提示语言可能是中文或英文意思相同On branch main No commits yet Untracked files: (use git add file... to include in what will be committed) notes.txt nothing added to commit but untracked files present (use git add to track)白话翻译你在分支main上还没有任何正式提交notes.txt是未跟踪的Git 看见了它但还没开始正式管理所以「没有可提交的内容」——因为篮子还是空的这一步动了哪一块答案工作区有了新文件暂存区还没有仓库历史还没有新提交5.2 放进待交作业篮git addgitaddnotes.txtgitstatusOn branch main No commits yet Changes to be committed: (use git rm --cached file... to unstage) new file: notes.txt白话翻译出现了 “Changes to be committed” 一类提示意思是篮子里已经有货了notes.txt已是「新文件、已暂存」命令副作用你要记住的git add 文件名把该文件当前内容放进暂存区不会自动完成提交是否上传网络不会5.3 正式记进档案柜git commitgitcommit-mdocs: 添加课堂笔记草稿gitstatus提交成功时会看到类似[main (root-commit) ........] docs: 添加课堂笔记草稿 1 file changed, 1 insertion() create mode 100644 notes.txt再看状态通常会变成「工作区干净」一类提示。白话翻译档案柜里有了第一笔正式历史-m后面是你写的说明以后回看时靠它回忆「当时为什么改」第一次提交有时叫「根提交」没有更早的父提交命令副作用git commit -m 说明把暂存区里的内容记成一笔提交推进当前分支没放进暂存区的修改不会被这次提交带走5.4 再改一次看清「改了但还没进篮子」printfhello v2\nnotes.txtgitstatus你会看到文件变成已修改并且往往在「尚未暂存」一类区域。gitdiffgit diff不加额外参数主要回答书桌相对「篮子」多改了什么若你已经add过、想看「篮子相对上一笔提交」多了什么要用gitdiff--staged有的资料也写--cached意思同类。命令白话在比什么git diff书桌 ↔ 暂存区git diff --staged暂存区 ↔ 最新提交git status用清单告诉你文件大概在哪一阶段这就是入门书里反复强调的「两种差异」没看清就容易觉得 Git「输出是空的、坏了」。5.5 一个容易晕的点add之后又改文件顺序如果是修改文件 →git add再改同一文件直接git commit那么提交进去的是第 1 步放进篮子时的版本不是你第 2 步书桌最新版。办法改完再git add一次让篮子更新再提交。6. 命令按「用途」分组先少后多6.1 看状态只读放心用命令干什么git status总览哪些未跟踪、哪些已改、哪些已暂存git status -s更短的一行式状态熟练后好用git diff看「还没进篮子」的改动细节git diff --staged看「已经在篮子里、准备提交」的改动细节6.2 在三块地方之间搬东西命令从哪到哪备注git add 路径工作区 → 暂存区新文件、改过的文件都靠它放进篮子git commit -m 说明暂存区 → 仓库正式记历史git restore 文件丢掉工作区里未提交的修改危险先确认下一章会系统讲撤销git restore --staged 文件把文件从篮子拿回取消暂存文件内容通常还在书桌上现在你只要建立印象撤销也分「撤书桌」还是「撤篮子」不要乱用「重置」类强力命令。6.3 和「整份作业一次交」的对比做法优点缺点总是git add .然后提交快容易把临时文件、密码文件一起交进去先status再按文件add清楚、安全慢一点点以后学的「挑选片段再暂存」更精细大一稍后学即可大一建议默认先git status再决定加哪些文件。7. 对照表降低记忆负担7.1 三块地方对照工作区暂存区仓库比喻书桌待交作业篮档案柜你每天怎么碰到编辑、保存git addgit commit关电脑重启后还在吗文件还在还在在.git里还在等于上传到网上了吗否否否仍是本机7.2 「保存」和「提交」对照动作给谁看有没有「为什么改」的说明能不能当正式历史回看编辑器保存现在的你通常没有弱只有当前文件git commit未来的你 / 同学有提交说明强一笔笔记录7.3 状态报告怎么读对照 Pro Git 的讲法当你执行git status时可以按这个顺序读我在哪个分支有没有「将要提交的更改」篮子里有没有货有没有「尚未暂存的更改」书桌改了但没进篮子有没有「未跟踪文件」新面孔读完这四句你就知道下一步是add、commit还是继续改。8. 安全习惯现在就能养成8.1 建议这样做习惯原因每次提交前先git status避免交错文件提交说明写人话一周后自己还看得懂一次提交只做一类事以后好回退、好检查在可删除的练习目录练手不怕点错密钥、密码文件不要add进历史很难彻底抹掉8.2 暂时不要这样做别急着用原因在正式大作业仓库乱试「强制重置」可能丢掉未提交修改还没会看status就狂用图形按钮出问题说不清状态把「提交」理解成「已经交给老师网站」本机提交 ≠ 上传8.3 推荐的最小循环背下来# 1. 改文件并在编辑器保存# 2. 看状态gitstatus# 3. 需要的话看差异gitdiff# 4. 放进篮子gitadd某个文件# 5. 再确认篮子gitstatus# 6. 正式记录gitcommit-m用一句话说明这次改了什么# 7. 确认干净gitstatus图编辑 → 看状态 → 加入暂存 → 提交 → 再查看。9. 真实场景没有项目经验也能懂9.1 写课程大作业你写了一晚上报告每完成一节就addcommit一次说明写「完成第三节实验步骤」。中途改乱了至少还能对照某一节完成时的版本。这比桌面上堆最终版-真的最终.docx清醒得多。9.2 只想提交「修错别字」不想提交「还没写完的新章节」错别字文件git add未完成章节先别add然后commit这正是暂存区存在的理由允许你挑选要记进历史的部分。9.3 和同学协作之前协作上传、拉取是后面章节。但现在就要养成本机历史清晰每次提交说得清否则文件一合并更难沟通「你改的是哪一版」。9.4 误以为「网盘同步文件夹」就够了网盘适合备份Git 适合看清改了哪几行写明为什么改以后按历史回退思路大一先建立 Git 习惯以后做课设、实习会轻松很多。10. 稍微多懂一点点可选暂存区不是可有可无的界面装饰它是 Git 设计的核心步骤之一。仓库历史在.git里删掉.git约等于丢掉 Git 历史工作区文件可能还在。图形界面编辑器侧边栏底层仍是这三块地方会看status的人用任何界面都更稳。更底层的「对象、哈希」放到原理篇再讲本章够用。11. 小实验请一定动手实验甲只提交一个文件新建仓库创建a.txt和b.txt。只把a.txt加入暂存并提交。用git status确认b.txt仍在「未跟踪」或未提交状态。通过标准你能说清为什么b.txt没有进那次提交。实验乙两种差异修改已提交的文件先不add运行git diff。再git add运行git diff和git diff --staged观察区别。通过标准能用「书桌 / 篮子 / 档案柜」解释两次输出为什么不同。实验丙add后又改修改 →add→ 再修改 → 直接commit。检查提交进去的内容是不是「中间那一版」。再addcommit把最新版补上。通过标准你再也不会默认「commit 一定会带走书桌上最新内容」。12. 常见问题问 1我可以跳过暂存区吗有些命令可以「对已跟踪文件直接提交」但对新手不推荐当默认习惯。先把三区走顺再学快捷方式。问 2git add .可以一直用吗练习可以。真正作业里更建议先status避免把临时文件加进去。问 3提交了是不是老师就能看见默认不能。提交在你电脑的档案柜里。要让别人看见需要以后学的远程推送。问 4状态输出是英文看不懂先抓关键词Untracked未跟踪、Changes to be committed将要提交 / 已在篮子、Changes not staged改了还没进篮子、nothing to commit没什么可交。中文环境下也会有对应翻译。问 5为什么要写提交说明给未来的自己看。一个月后你不会记得「那天晚上改乱的是哪一处」。问 6三区模型和「分布式」什么关系三区是本机怎么记历史分布式是多台电脑 / 远程怎么同步。先本机后远程。问 7图形按钮和命令行哪个好先命令行建立词汇再用图形加速。出问题时能读status比会点按钮更重要。问 8我需要把.git交到作业压缩包里吗按老师要求。若老师只要源码可能不需要若老师要看提交历史可能需要整个仓库。不确定就问清楚。13. 总结、学习路线与思维升华13.1 这一章请记住的点记住什么三块地方工作区、暂存区、仓库关键区别保存 ≠ 提交两步走先add再commit仪表盘提交前永远先status两种差异未暂存差异 / 已暂存差异下一章预告撤错时要说清撤的是哪一块13.2 在整个系列中的位置01 认识 Git、装好工具 02 三区模型 ← 当前最重要的地基 03 日常提交与查看历史 04 安全地撤销 05 分支与合并 06 远程协作 ……13.3 思维升华Git 不是自动备份软件而是「你主动挑选、主动说明」的历史记录工具。先问「文件现在在书桌、篮子还是档案柜」再决定按哪个键。把状态说清楚比背一百个参数更重要。13.4 参考资料以下资料帮助校对了本章难度与术语图示署名见仓库内说明文件。Pro Git 中文版 — 记录每次更新到仓库文件状态、暂存、提交的经典讲法文件生命周期图Pro Git 中文版 — 起步git status 说明git add 说明git commit 说明git diff 说明本仓库图示署名assets/diagrams/ATTRIBUTION.md命令输出样例验证环境Git 2.43.0演示作者信息为虚构Ada Example adaexample.com。13.5 本章检查清单能用「书桌 / 篮子 / 档案柜」讲清三区能解释为什么「保存了还不等于提交了」会在练习目录里完成新建 →add→commit会读git status的四个关键信息知道git diff和git diff --staged的差别知道add之后又改文件要再add提交前会先看状态而不是闭眼提交你真正「会用 Git」的起点不是背命令而是随时说得出文件现在待在哪一块。下一章我们会在这个模型上把日常提交、查看历史跑得更熟。