大家好,我是程序员柏风,AI 最全的 Vibecoding 学习地图 http://coderoadmap.cn 作者。
Git 基础概念
这一课你将能做到
- 用一句话说清 Git 是什么、解决什么问题,并解释「版本控制」的真实含义
- 在本机安装 Git、完成身份配置(user.name / user.email),并用
git --version验证 - 讲清 Git 的三大区域(工作区、暂存区、仓库)以及文件在它们之间的流转
为什么要学
想象你写论文:改一版存一份「论文v1.docx」「论文v2.docx」「论文最终版.docx」「论文最终版真的不改了.docx」……一周后你自己都分不清哪份是哪份。代码比论文严重得多:多人同时改同一个文件、要回滚到上周能跑的版本、要知道某行代码是谁什么时候为什么改的。版本控制系统(VCS)就是干这个的。
Git 是目前事实上的唯一标准:Linux 内核、Spring、Vue、你公司的项目、本站 java-nav 的代码,全部托管在 Git 上。不会 Git 就没法参与任何现代团队协作,面试第一关就过不去。学会 Git 的回报是终身的——它是程序员最重要的工具,没有之一。
先建立图像
Git 的核心心智模型是三大区域 + 一条提交历史链:
工作区 (Working Directory) 暂存区 (Staging Area) 本地仓库 (Repository)
┌──────────────────┐ add ┌──────────────────┐ commit ┌──────────────────┐
│ 你正在编辑的文件 │ ──────> │ 准备打包的改动清单 │ ─────> │ 永久的版本快照 │
│ UserService.java │ │ UserService.java │ │ commit a1b2c3 │
│ index.html │ <────── │ │ <───── │ commit d4e5f6 │
└──────────────────┘ restore └──────────────────┘ reset └──────────────────┘
提交历史是一条链,每个 commit 有一个唯一哈希(如 a1b2c3d),指向它的「父亲」:
HEAD -> main
A(初始提交) <- B(加登录) <- C(修bug) <- D(加缓存)
理解这张图,后面所有命令(add / commit / reset / restore / switch)都只是在这三个区域之间搬动文件。
跟着做
步骤 1:安装 Git 并验证
Windows 去 git-scm.com 下载安装包,一路下一步即可。macOS 用 brew install git,Linux 用发行版包管理器。装完打开终端:
git --version
# git version 2.45.0.windows.1 ← 看到版本号即成功
步骤 2:配置身份(全局只需一次)
Git 会把作者信息写进每条 commit,必须先配置:
git config --global user.name "Zhang San"
git config --global user.email "zhangsan@example.com"
git config --global init.defaultBranch main
git config --list
--list 能回显你的配置,确认 name/email 没写错。邮箱建议和 GitHub 账号一致,这样提交头像能正确显示。
步骤 3:创建第一个仓库
mkdir git-demo && cd git-demo
git init
# Initialized empty Git repository in .../git-demo/.git/
git init 在当前目录生成隐藏的 .git/ 文件夹——这就是「本地仓库」,里面存了所有历史。删掉它,这个目录就退回普通文件夹。
步骤 4:感受三大区域
echo "hello git" > README.md
git status
# Untracked files: README.md ← 在工作区,Git 还没跟踪
git add README.md
git status
# Changes to be committed: new file: README.md ← 进了暂存区
git commit -m "初始提交:添加 README"
git status
# nothing to commit, working tree clean ← 进了仓库,工作区干净
git status 是你用得最多的命令,任何时候不知道当前什么状态,敲它。
讲清楚要点
- Git 是分布式版本控制:每个人电脑上都有完整历史,不联网也能提交、看日志、切分支。这是和 SVN(集中式)的本质区别——SVN 服务器挂了大家都停工,Git 无所谓。
- commit 是快照不是差异:每个 commit 记录的是那一刻所有文件的完整快照(内部用哈希去重,所以不贵)。理解成「存档点」:随时可以读档回到任何一个。
- 暂存区是「打包台」:你改了 5 个文件,但只想把其中 2 个作为一次提交,就先
git add那 2 个到暂存区,再 commit。暂存区让你精确控制每次提交的内容。 - commit message 要写成「做了什么」:如「修复登录接口空指针」「新增用户导出 CSV」。不要写「update」「fix」「改了点东西」——三个月后你自己都不知道改了啥。
.git目录就是一切:它包含全部对象、分支指针、配置。git clone本质就是把它完整拷一份。
你可能会懵的地方
-
Git 和 GitHub 是一个东西吗? 不是。Git 是装在你电脑上的版本控制工具(本地软件);GitHub 是把 Git 仓库放到云端的托管网站(还有 GitLab、Gitee 等)。可以只用 Git 不用 GitHub,但团队协作基本离不开托管平台。
-
为什么说 Git 几乎不丢数据? 只要 commit 过,内容就进了
.git对象库,即使你删了分支、reset 错了,也能通过git reflog找回。真正危险的是「从未 commit 的修改」——所以养成勤提交的习惯。 -
git add .和git add -A一样吗? 现代 Git 里基本等价(都暂存当前目录全部变化)。老版本里git add -A会包含仓库根目录外的路径。日常用git add .或git add 具体文件即可。 -
commit 的哈希为什么是 40 位乱码? 那是 SHA-1 哈希,由提交内容+作者+时间+父提交计算而来,保证全球唯一。平时显示前 7 位(如
a1b2c3d)就够用了。 -
一个文件夹能同时属于两个仓库吗? 不能也不应该。
.git只能有一个。常见踩坑:在项目父目录误敲git init,导致子目录的.git被嵌套。
错法对照
| 错法 | 问题 | 正解 |
|---|---|---|
| 直接改代码从不 commit | 崩溃/改错无法回滚 | 每完成一个小功能就 commit |
| commit message 写「update」「aaa」 | 无法追溯改动意图 | 用祈使句写清楚做了什么 |
在桌面/根目录随手 git init | 把整个盘变成仓库 | 只在项目根目录 init |
| 把 node_modules、.idea 提交进去 | 仓库膨胀、冲突不断 | 用 .gitignore 排除 |
git config 不写 --global 又换了目录 | 每个项目都要重配 | 全局配一次,项目级再覆盖 |
卡点急救
git命令提示「不是内部或外部命令」:Windows 安装时没加 PATH。重新运行安装包,勾选「Git from the command line」,或重装后重启终端。- 误在错误目录执行了
git init:直接删掉该目录下隐藏的.git文件夹即可(Remove-Item -Recurse -Force .git),不影响文件本身。 - commit 后想改作者信息:最近一次提交用
git commit --amend --reset-author --no-edit;历史批量改写用git filter-repo(初学者先知道有这回事)。
面试常问
-
Git 和 SVN 的区别? 核心:Git 分布式、SVN 集中式。Git 每人本地有完整仓库,离线可提交、分支极轻量(指针移动);SVN 依赖中央服务器,分支是目录拷贝、又重又慢。Git 合并基于三方对比,SVN 容易冲突。
-
Git 的三大区域是什么? 工作区(Working Directory):磁盘上实际编辑的文件;暂存区(Staging/Index):
git add后放入的待提交清单;本地仓库(Repository):git commit后形成的永久快照,存于.git。文件流转:工作区 →(add)→ 暂存区 →(commit)→ 仓库。 -
为什么说 Git 的 commit 是不可变的? 每个 commit 的哈希由内容计算而来,内容一改哈希就变,等于生成了新 commit。所以历史无法被悄悄篡改——这是 Git 完整性的基石。
自测三问
- 工作区、暂存区、本地仓库分别存什么?用哪两个命令在它们之间移动文件?
git init做了什么?删掉.git会发生什么?- 为什么要求 commit message 写清楚?给出一个好例子和一个坏例子。
小结一句话
Git 通过「工作区—暂存区—仓库」三层结构管理代码快照,commit 是链式存档点,学会它你就拥有了代码的时光机。
延伸
- Pro Git 中文版(官方权威书)
- 下一课:基本 Git 操作——真正开始 add / commit / log / restore,把本站代码跑起来改一遍。