🌟 前言:理解本地仓库的核心操作
"前面我们学习了如何上传代码到远程仓库中,今天来学习一下如何操作本地仓库,一些添加、回退、创建等操作,并且理解工作区、暂存区和本地仓库之间的关系。"
Git 不只是一个“上传代码”的工具,它更是一个强大的版本控制系统。
你写的每一行代码、每一次修改,都可以被记录、回退、对比——就像拥有一个“月光宝盒”。
本笔记将带你深入理解:
- ✅ 工作区、暂存区、本地仓库的三区模型
- ✅ 如何安全地添加、提交、查看差异
- ✅ 如何优雅地回退版本、撤销修改
- ✅ 为什么 Git 使用 SHA 哈希 ID 而不是自增 ID
💡 目标:
让你从“会用 Git”升级为“懂 Git”,为后续多人协作打下坚实基础。
🧩 一、Git 三大核心区域
| 区域 | 说明 |
|---|---|
| 工作区 | 你正在编辑的文件目录(如 readme.txt) |
| 暂存区 | 临时存放你准备提交的修改(通过 git add) |
| 本地仓库 | 存储所有历史版本的数据库(.git 目录) |
📌 核心流程:
修改文件 →git add→git commit→ 版本保存
🛠️ 二、基础操作命令详解
1. git status:查看仓库状态(必用!)
bash
编辑
git status
🔍 作用:
查看当前工作区状态,是所有操作前的必备检查。
输出示例:
bash
编辑
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
modified: readme.txt
Untracked files:
(use "git add <file>..." to include in what will be committed)
newfile.txt
modified:文件已修改,但未addUntracked files:新文件,未被 Git 跟踪
2. git add <file>:添加到暂存区
bash
编辑
git add readme.txt
✅ 作用:
将文件的当前修改放入“待提交队列”(暂存区)。
💡 提示:
git add .:添加所有修改- 添加后,文件进入“准备提交”状态
3. git commit -m "message":提交到本地仓库
bash
编辑
git commit -m "append GPL"
✅ 作用:
将暂存区的内容永久保存到本地仓库,生成一个新版本。
提交后输出:
bash
编辑
[master fc19bcd] append GPL
1 file changed, 2 insertions(+)
fc19bcd:本次提交的短哈希 ID2 insertions:新增 2 行代码
🔐 三、为什么用 SHA 哈希 ID?不用自增 ID?
| 自增 ID | SHA 哈希 ID |
|---|---|
| ❌ 1, 2, 3... | ✅ fc19bcd...(唯一哈希) |
| ❌ 多人协作时容易冲突(两个分支都叫“3”) | ✅ 全局唯一,不怕冲突 |
| ❌ 无法验证数据完整性 | ✅ 哈希值可验证内容是否被篡改 |
🌐 类比:
- 自增 ID 像“房间号”(可能重复)
- SHA ID 像“指纹”(全球唯一)
🔍 四、查看差异:git diff
bash
编辑
git diff
🔍 作用:
查看工作区与暂存区之间的差异(未add的修改)。
使用场景:
- 重大提交前,先
git diff确认修改内容 - 避免误提交不该提交的代码
💡 提示:
git diff --staged:查看已add但未commit的差异
🧼 五、干净的仓库(Clean Working Tree)
bash
编辑
git status
# 输出:
# On branch master
# nothing to commit, working tree clean
图片事例
✅ 含义:
- 所有修改都已提交
- 没有未跟踪文件
- 仓库处于“干净”状态
📌 最佳实践:
每次提交后,确保仓库干净,便于后续操作。
🕰️ 六、版本回退与指针操作
1. HEAD 指针
bash
编辑
fc19bcd (HEAD -> master) append GPL
HEAD:指向当前分支的最新提交master:当前分支名
🌐 比喻:
HEAD像“播放头”,指向你当前查看的版本。
2. git reset --hard HEAD^:回退到上一个版本
bash
编辑
git reset --hard HEAD^
HEAD:当前提交^:前一个版本^2:前两个版本~3:往前 3 个提交
示例:
bash
编辑
git reset --hard HEAD^ # 回退 1 个版本
git reset --hard fc19bcd # 回退到指定版本
⚠️ 警告:
--hard会丢弃工作区修改,慎用!
3. git log --oneline:查看提交历史
bash
编辑
git log --oneline
输出:
bash
编辑
fc19bcd (HEAD -> master) append GPL
abc1234 wrote a readme file
✅ 快速查看所有提交的短 ID 和提交信息。
4. git reflog:查看所有操作记录
bash
编辑
git reflog
输出:
bash
编辑
fc19bcd HEAD@{0}: reset: moving to HEAD^
abc1234 HEAD@{1}: commit: append GPL
图片事例
✅ 作用:
记录你所有的 Git 操作(包括reset),是“后悔药”!
💡 场景:
误删提交?用git reflog找回 ID,再git reset恢复!
5. git checkout -- <file>:撤销修改
bash
编辑
git checkout -- readme.txt
✅ 作用:
将文件恢复到最近一次提交的状态,丢弃所有未提交的修改。
⚠️ 警告:
此操作不可逆!修改将永久丢失。
效果展示:
🖼️ 七、图解:Git 操作流程
📌 核心记忆:
工作区 → 暂存区 → 本地仓库 → 可回退、可撤销
代码演示:
graph TB
A[工作区] -->|git add| B[暂存区]
B -->|git commit| C[本地仓库]
C -->|git reset --hard| A
A -->|git checkout -- file| C
C -->|git log| D[查看历史]
C -->|git reflog| E[查看操作记录]
💼 八、大厂高频面试题(Git 专项)
❓ Q1: 工作区、暂存区、本地仓库的区别是什么?
✅ 参考回答:
- 工作区:你正在编辑的文件目录
- 暂存区:通过
git add临时存放修改,准备提交 - 本地仓库:通过
git commit永久保存版本历史 - 关系:修改 →
add→commit→ 版本保存
❓ Q2: git reset --hard HEAD^ 和 git checkout -- file 有什么区别?
✅ 参考回答:
| 命令 | 作用范围 | 是否影响历史 |
|---|---|---|
git reset --hard | 整个分支 | ✅ 修改提交历史 |
git checkout -- file | 单个文件 | ❌ 不影响历史 |
📌 总结:
reset是“版本回退”checkout -- file是“文件撤销”
❓ Q3: 为什么 Git 用 SHA-1 而不用自增 ID?
✅ 参考回答:
- 唯一性:SHA-1 哈希全局唯一,避免多人协作冲突
- 数据完整性:哈希值可验证内容是否被篡改
- 分布式:无需中心服务器分配 ID,适合分布式系统
💡 加分项:
虽然 SHA-1 已被破解,但 Git 的使用方式使其在版本控制场景下仍安全。
❓ Q4: git diff 和 git diff --staged 有什么区别?
✅ 参考回答:
git diff:比较工作区与暂存区git diff --staged:比较暂存区与本地仓库
📌 类比:
diff:还没add的修改diff --staged:已add但没commit的修改
❓ Q5: 如何恢复一个被 git reset --hard 删除的提交?
✅ 参考回答:
- 使用
git reflog查看所有操作记录 - 找到被删除提交的哈希 ID
- 使用
git reset --hard <commit-id>恢复
🎯 核心:
reflog是 Git 的“操作日志”,是最后的救命稻草。
✅ 九、总结:Git 核心心法
| 操作 | 命令 | 关键点 |
|---|---|---|
| 查看状态 | git status | 操作前必用 |
| 添加修改 | git add . | 进入暂存区 |
| 提交版本 | git commit -m "" | 写好提交信息 |
| 查看差异 | git diff | 提交前确认 |
| 回退版本 | git reset --hard | 慎用 --hard |
| 撤销修改 | git checkout -- file | 丢弃工作区修改 |
| 查看历史 | git log --oneline | 快速浏览 |
| 查看操作 | git reflog | “后悔药” |
🌟 记住口诀:
"先 add,再 commit;重大操作先 diff;版本回退靠 reset;撤销修改用 checkout;历史查看 log,操作记录 reflog。"
🚀 下一步
- ✅ 实践:创建一个测试项目,尝试添加、提交、回退
- ✅ 错误演练:故意删除提交,用
reflog恢复 - ✅ 进阶:学习分支管理(
git branch、git merge)
💡 Git 不是工具,而是思维方式。
掌握它,你将拥有“代码时光机”! ⏳