第 3 章:基础工作流——Git 的"三位一体"
约 1735 字大约 6 分钟
2025-12-25
你写了一些代码,想保存当前状态,但又不想覆盖之前的版本。Ctrl+S 只能把旧内容覆盖掉,想回到两小时前的版本?门都没有。Git 解决的就是这个问题——让你随时"穿越"回任意历史节点。
本章目标
掌握 Git 最核心的三个概念:工作区、暂存区、版本库,并学会日常开发的"三板斧"操作。
一、核心概念:Git 的三个区域
开工之前,先搞清楚 Git 的三个核心区域。这可能是新手最容易犯晕的地方——来,我们把 Git 想象成一次搬家。
工作区 (Working Directory) —— 你的房间。你正在里面生活,东西摊一地也没关系。对应你电脑里能直接看到的文件和文件夹,Git 管它叫"工作区"。在这里随便改、随便删,Git 不会觉得冒犯。
暂存区 (Staging Area) —— 打包箱。你把觉得整理好的东西放进去,准备封箱。可以随时往箱子里添东西,也可以拿出来。对应 Git 内部一片临时区域,存放你准备提交的修改。
Linus 为什么设计暂存区?
很多新手会问:"直接提交不就行了吗?多一步 git add 不是折腾人?"
这恰恰是 Linus 的天才设计。在 SVN 等上一代版本控制工具中,你只有两个选择:提交全部修改,或者提交单个文件,没有中间地带。
Git 的暂存区让你精细化管理每次提交。比如你改了 10 个文件——其中 5 个在修 Bug A,另外 5 个在开发功能 B。可以先 add 修 Bug 的 5 个文件,commit 一次;再 add 剩下的 5 个,再 commit 一次。两次提交各司其职,历史干净得像强迫症整理过的书架。
暂存区就是你的工作台——把杂乱的修改分拣、打包,每次只发一个主题明确的"包裹"。
- 版本库 (Repository) —— 搬家公司的卡车。封箱、贴标签之后,箱子就永久记录在卡车上了。安全,随时可以找回。对应
.git文件夹,存放所有历史版本。
二、实战:你的第一个 Git 仓库
2.1 初始化——git init
创建一个项目文件夹,打开终端,敲下:
git init执行后文件夹里多了一个隐藏的 .git 目录(没看到的话请设置显示隐藏文件)。
不要手动修改 .git 文件夹
.git 是 Git 的核心数据库,里面有版本历史、分支信息、暂存区快照等。手动改里面的任何文件,轻则仓库损坏,重则找不回你辛苦写的代码。Git 提供了全套命令来安全操作它——永远用命令,别用鼠标。
.git 文件夹里藏了什么?
简要看一眼这个"黑盒"里装了什么(不需要记,有个印象就行):
objects/—— 存放所有数据对象:文件内容、commit 记录、目录结构等,按内容的 SHA-1 哈希值命名。你的每一次 commit 都变成一个个小文件躺在这里。index—— 这就是暂存区的物理化身。一个二进制文件,记录了你git add之后、git commit之前的文件快照。HEAD—— 一个指针,指向你当前所在的分支(或者说,当前 commit)。内容通常是一行ref: refs/heads/main。refs/—— 存放分支(refs/heads/)和标签(refs/tags/)的引用,每个文件里只有一个哈希值,指向对应分支的最新 commit。
简单来说:objects 是仓库本体,index 是暂存区,HEAD 告诉你"我在哪",refs 告诉你"每条分支在哪"。
2.2 状态检查——git status
这是你以后用得最多的命令,相当于一个监控探头:谁被改了、谁在暂存区、谁还没被跟踪,一览无余。
git status刚初始化的仓库会告诉你:nothing to commit(没有东西可提交)。
程序员三大错觉:代码怎么突然跑不了了、这 Bug 很好修、下次一定写文档。
git status至少帮你破除第一个——文件状态明明白白摆在那,别再说"我觉得没改什么东西"。
2.3 创建/修改文件
在文件夹里新建 README.md,内容写 "Hello Git"。再次 git status:
Untracked files: README.md (未追踪的文件)文件显示为红色,说明它还在工作区,Git 还没有开始管它。
假设你同时有一个需要修 Bug 的 .js 文件:
// bug.js
function checkNumber(val) {
if (typeof val === 'number') {
return val * 2
}
return 0
}
console.log(checkNumber(NaN)) // NaN * 2 = NaN 💀
// typeof NaN === 'number' // true —— JavaScript 的怪异行为把这段代码放进 bug.js,然后回到 git status——两个文件都是红色(未追踪),等着你处理。
2.4 加入暂存区——git add
告诉 Git:"这个文件我改好了,放进暂存区。"
git add README.md bug.js再次 git status,文件变绿,出现在 Changes to be committed 下方——说明它们已进入暂存区。
小技巧
如果改的文件太多,不想逐个 add,用 git add . 一次性把当前目录下所有修改全部加入暂存区。. 表示当前目录。
2.5 提交——git commit
把暂存区的内容永久保存,并附上一个说明标签。
git commit -m "docs: 创建 README 文件并修复 checkNumber 的 NaN 判断"-m后面是提交信息 (Commit Message)。- 文件名和内容变化一目了然,一个月后翻看也能秒懂这次干了什么。
再次 git status——working tree clean,所有更改已安全存档。
给未来的自己留条活路
Commit Message 是给你自己(和队友)看的。以下这些写了等于没写:
updatefix改了点东西asdf(别笑,真有人这么干)
一个月后你回来看日志,看到 fix 根本想不起来修了什么。花 10 秒写清楚"做了什么、为什么做",给未来的自己多活几年。
推荐格式:类型: 简述,例如 feat: 添加登录验证、fix: 修复 NaN 输入导致的计算错误、docs: 补充 README。
三、总结:日常三板斧
以后每天要做的事,就这三步循环:
- 改代码 —— 在工作区尽情折腾
git add .—— 把改好的放入暂存区git commit -m "xxx"—— 永久存档,写好备注
这就是 Git 本地操作的核心循环。掌握这三个命令,你就已经会用了 Git 90% 的日常功能。
关键概念回顾
- 工作区 = 你看到的文件。改了不算数。
- 暂存区 =
git add之后的临时站。只有进了这里才能被 commit。 - 版本库 =
git commit之后的终点站。永久存档,随时可查。 - 三板斧 = 改 → add → commit,无限循环。