💡 Git 是现代软件开发的基石。无论你是独立开发者,还是参与大型团队协作,掌握 Git 都是必不可少的技能。本文将基于你提供的学习概要,系统、全面、深入地讲解 Git 的核心概念与操作流程,并补充大量实用细节,助你真正理解 Git 的工作原理。
📁 一、Git 基础认知:仓库、分支与协作
❌ 同一个项目中不能有多个 Git 仓库?
✅ 正确理解:
虽然技术上可以在一个项目目录下嵌套多个.git目录(即子模块或子仓库),但常规开发实践中,一个逻辑项目应只对应一个 Git 仓库。
原因如下:
- 管理混乱:多个仓库会导致提交历史割裂,难以追踪整体变更。
- 协作困难:团队成员无法统一拉取/推送代码。
- 工具链不兼容:CI/CD、IDE 插件等通常默认识别根目录下的
.git。
🧠 最佳实践:
如果你需要管理多个相关项目,推荐使用:
- Monorepo(单体仓库):如 React、Babel 等大型项目采用的方式,所有子项目放在一个仓库中,通过目录区分。
- Git Submodule / Subtree:用于引入外部依赖仓库(高级用法,初学者慎用)。
🚀 二、初始化本地 Git 仓库
1. 创建开发目录
mkdir lesson_zp
cd lesson_zp
⚠️ 此时
lesson_zp只是一个普通文件夹,没有版本控制能力。删除文件就永久丢失,无法回退历史版本——这就是为什么我们需要 Git!
2. 初始化仓库:git init
git init
执行后,Git 会在当前目录创建一个隐藏文件夹 .git,这就是本地仓库的核心,包含:
- 对象数据库(存储文件快照)
- 引用(refs):如分支、标签
- HEAD 指针
- 配置文件
🌳 默认分支名称:
早期 Git 默认创建master分支。如今许多平台(如 GitHub、Gitee)已改为main。
你可以通过以下命令查看或修改默认分支名:
git config --global init.defaultBranch main
👤 三、配置 Git 用户信息(必须!)
每次提交都需要身份标识,否则 Git 会报错。
git config --global user.name "shunwuyu2020"
git config --global user.email "shunwu2001@163.com"
🔍 参数说明:
--global:全局配置,对所有仓库生效。若省略,则仅对当前仓库生效。- 邮箱建议使用与 Gitee/GitHub 注册一致的邮箱,便于关联贡献记录。
📝 四、Git 工作流核心:三区模型
Git 的核心在于理解 三个区域:
| 区域 | 说明 |
|---|---|
| 工作区(Working Directory) | 你日常编辑的文件所在目录 |
| 暂存区(Staging Area / Index) | 临时存放准备提交的修改 |
| 仓库(Repository / .git) | 存储所有历史版本的地方 |
🔍 查看状态:git status
这是最基础也最重要的命令!在任何操作前,先运行它:
git status
输出示例:
- "Untracked files":新文件,未被 Git 跟踪。
- "Changes not staged for commit":已跟踪但未暂存的修改。
- "Changes to be committed":已暂存,准备提交。
✅ 好习惯:每次
add、commit、checkout前都先git status!
➕ 五、添加文件到暂存区:git add
git add readme.txt # 添加单个文件
git add . # 添加当前目录所有修改(包括新文件、修改、删除)
git add *.js # 添加所有 .js 文件
💡
git add的本质是将工作区的修改“快照”保存到暂存区,为下一次提交做准备。
✅ 六、提交到仓库:git commit
git commit -m 'wrote a readme file'
关键点解析:
1. 提交的是“修改”,不是整个文件
Git 存储的是文件内容的差异(delta),而非完整副本。高效且节省空间。
2. 提交 ID 为何用 SHA-1 哈希?
- 唯一性:SHA-1 生成 40 位十六进制字符串(如
a1b2c3d...),几乎不可能重复。 - 去中心化:多人协作时,无需中央服务器分配 ID,各自生成仍能保证全局唯一。
- 防篡改:任何内容改动都会导致哈希值变化,确保历史不可伪造。
🆚 对比自增 ID(如 SVN):
- 自增 ID 依赖中央服务器,在分布式场景下无法工作。
- Git 是分布式版本控制系统(DVCS),每个开发者都有完整仓库副本。
3. 提交信息规范
- 使用现在时动词开头:
Add login feature而非Added... - 首行简明扼要(<50 字),空一行后可写详细描述
- 示例:
git commit -m "feat: add user authentication module - implement JWT token generation - add /login and /register endpoints - write unit tests"
🔍 七、查看差异:git diff
在重大提交前,务必检查修改内容:
git diff # 查看工作区 vs 暂存区
git diff --cached # 查看暂存区 vs 最近一次提交
git diff HEAD # 查看工作区 vs 最近一次提交
✅ 黄金法则:
提交前先git diff,确认无误再commit。避免误提交调试代码、敏感信息等。
🧹 八、“干净”的工作区是什么意思?
当 git status 显示:
nothing to commit, working tree clean
说明:
- 所有文件都已被跟踪
- 没有未暂存的修改
- 没有未提交的暂存内容
🌈 这就是“干净”的状态,是进行分支切换、合并、发布前的理想状态。
🔙 九、版本回退:穿越时空的魔法
1. 查看提交历史
git log --oneline
输出示例:
36803fa (HEAD -> master) append GPL
a1b2c3d initial commit
36803fa:提交的短哈希 IDHEAD -> master:当前位于master分支的最新提交
2. 回退到上一个版本
git reset --hard HEAD^
HEAD^表示“当前提交的父提交”--hard:同时重置工作区和暂存区(危险!会丢弃所有未提交修改)
⚠️ 谨慎使用
--hard!建议先git stash保存现场。
3. 回退多个版本
git reset --hard HEAD~2 # 回退两个版本
git reset --hard a1b2c3d # 回退到指定提交 ID
🔁 注意:
reset会删除后续提交。若已推送到远程,需强制推送(git push -f),可能影响他人。
🔄 十、撤销工作区修改:git checkout --
git checkout -- readme.txt
作用:丢弃工作区对 readme.txt 的修改,恢复到最近一次提交的状态。
🛑 注意:此操作不可逆!确保你真的不需要这些修改。
💡 现代 Git 推荐使用
git restore(2.23+):
git restore readme.txt # 撤销工作区修改
git restore --staged readme.txt # 从暂存区移除(相当于取消 add)
☁️ 十一、连接远程仓库(以 Gitee 为例)
1. 在 Gitee 创建空仓库
- 登录 Gitee
- 新建仓库
lesson_zp,不要初始化 README
2. 关联本地与远程
git remote add origin https://gitee.com/shunwuyu2020/lesson_zp.git
origin是远程仓库的默认别名(可自定义)- URL 支持 HTTPS 或 SSH(推荐 SSH,免密码)
3. 推送代码到远程
git push origin master
🚨 首次推送可能失败,因为远程有默认分支(如
main)。解决方法:
git push -u origin master # -u 设置上游分支,后续只需 git push
或统一使用 main:
git branch -M main
git push -u origin main
🌐 十二、Git 的核心价值:分布式协作
🌕 Git 就是程序员的“月光宝盒”!
- 版本回溯:随时回到任意历史状态
- 分支隔离:开发新功能不影响主干
- 多人协作:通过
pull/push同步代码 - 备份安全:每个开发者都是完整备份
📌 总结:Git 核心命令速查表
| 场景 | 命令 |
|---|---|
| 初始化仓库 | git init |
| 配置用户 | git config --global user.name "xxx" |
| 查看状态 | git status |
| 添加文件 | git add . |
| 提交修改 | git commit -m "message" |
| 查看差异 | git diff |
| 查看日志 | git log --oneline |
| 版本回退 | git reset --hard HEAD^ |
| 撤销修改 | git checkout -- file |
| 关联远程 | git remote add origin URL |
| 推送代码 | git push origin master |
🎯 结语
Git 不仅是工具,更是一种工程思维。掌握它,你就拥有了:
- 代码的“时间机器” ⏪
- 团队协作的“高速公路” 🛣️
- 项目演进的“清晰地图” 🗺️
💬 记住:每天
git status,提交前git diff,推送前git log—— 你将成为团队中最可靠的开发者!
✨ Happy Git-ing! ✨
🚀 你的代码,值得被好好管理!