Git 深度学习指南
从入门到精通的 Git 完全手册
Git 是现代软件开发中最重要的版本控制工具。本文档将带你从核心概念出发,逐步掌握日常操作、团队协作,直至高级技巧和底层原理。
核心概念 (Core Concepts)
三大区域:Git 的数据流
理解 Git 的三大工作区域是掌握所有操作的基础。
| 区域 | 英文名 | 说明 | 类比 |
|---|---|---|---|
| 工作区 | Working Directory | 你在编辑器里看到和修改的文件 | 你的书桌 |
| 暂存区 | Staging Area / Index | 准备下次提交的文件快照 | 购物车 / 候车室 |
| 本地仓库 | Local Repository | 永久存储的版本历史 | 照片相册 |
TIP
暂存区的妙用:暂存区允许你精确控制哪些修改进入下一次提交。你可以修改了 10 个文件,但只提交其中 3 个相关的修改。
文件状态:生命周期
一个文件在 Git 中会经历以下状态:
| 状态 | 含义 | 查看方式 |
|---|---|---|
| Untracked (未追踪) | Git 不知道这个文件的存在 | 红色,标记为 ?? |
| Modified (已修改) | 文件被修改但未暂存 | 红色,标记为 M |
| Staged (已暂存) | 修改已加入暂存区,等待提交 | 绿色,标记为 A 或 M |
| Committed (已提交) | 安全存储在本地仓库中 | 不显示 (干净状态) |
基础指令 (The Basics)
仓库初始化
# 在当前目录创建新的 Git 仓库
git init
# 克隆远程仓库到本地
git clone <url>
git clone git@github.com:user/repo.git查看状态 - 你的雷达
# 查看工作区和暂存区的状态
git status
# 简洁模式
git status -s
# 输出示例:
# M file.txt -> 已暂存的修改
# M file2.txt -> 未暂存的修改
# ?? newfile.txt -> 未追踪的文件NOTE
养成习惯:在执行任何 Git 操作前,先 git status 了解当前状态。
暂存修改
# 添加单个文件到暂存区
git add <file>
# 添加所有修改过的文件
git add .
# 交互式添加(可以选择部分修改)
git add -p提交存档 - 按下快门
# 提交并附带消息
git commit -m "描述这次修改做了什么"
# 添加并提交(跳过 git add,仅对已追踪文件有效)
git commit -am "快速提交"
# 修改上一次提交的消息
git commit --amend -m "新的提交消息"IMPORTANT
提交信息规范:好的提交信息应该简洁明了地描述"做了什么"和"为什么"。
- 正确:
feat: 添加用户登录功能 - 正确:
fix: 修复购物车数量计算错误 - 错误:
update/fix bug/修改
查看历史记录
# 查看提交历史
git log
# 简洁单行显示
git log --oneline
# 图形化显示分支合并历史
git log --oneline --graph --all
# 查看某个文件的修改历史
git log -p <file>平行宇宙 (Branches)
分支是 Git 最强大的特性之一。它允许你在不影响主线的情况下进行实验性开发。
分支基本操作
# 查看所有分支
git branch # 本地分支
git branch -a # 包含远程分支
# 创建新分支
git branch <name>
# 切换分支
git switch <name>
git checkout <name> # 旧语法
# 创建并切换到新分支
git switch -c <name>
git checkout -b <name> # 旧语法
# 删除分支
git branch -d <name> # 安全删除(已合并)
git branch -D <name> # 强制删除合并分支 (Merge)
# 将 feature 分支合并到当前分支
git merge featureGit 会根据情况选择合并策略:
Fast-forward (快进):如果目标分支没有新提交,Git 直接把指针向前移动。
Three-way (三方合并):如果两个分支都有新提交,Git 会创建一个新的合并提交。
解决冲突 (Conflict)
当两个分支修改了同一文件的同一区域时,Git 无法自动合并,会产生冲突。
冲突标记示例:
<<<<<<< HEAD
你在当前分支的修改
=======
对方分支的修改
>>>>>>> feature解决步骤:
- 打开有冲突的文件
- 手动编辑,保留需要的内容,删除冲突标记
git add <file>标记已解决git commit完成合并
WARNING
解决冲突时要仔细检查,确保两边的逻辑都正确保留或合理取舍。
后悔药与时光机 (Undo & Fix)
Git 提供了多种撤销操作的方法,但它们的作用范围和安全性各不相同。
撤销工作区和暂存区的修改
# 撤销暂存(从暂存区移回工作区,保留修改)
git restore --staged <file>
# 丢弃工作区的修改(危险!无法恢复)
git restore <file>历史修正
| 命令 | 作用 | 适用场景 | 安全性 |
|---|---|---|---|
git reset | 移动 HEAD 指针,重写历史 | 本地未推送的代码 | 会改变历史 |
git revert | 创建新提交来撤销旧提交 | 已推送的公共代码 | 安全 |
# Reset 三种模式
git reset --soft HEAD~1 # 保留修改在暂存区
git reset --mixed HEAD~1 # 保留修改在工作区(默认)
git reset --hard HEAD~1 # 彻底丢弃修改(危险)
# Revert 安全撤销
git revert <commit-hash> # 创建一个反向提交临时救火 - Stash
当你正在开发一个功能,突然需要切换分支去修复 bug:
# 藏匿当前修改
git stash
git stash save "正在开发用户模块"
# 查看 stash 列表
git stash list
# 恢复并删除最近的 stash
git stash pop
# 恢复但保留 stash
git stash apply
# 删除指定 stash
git stash drop stash@{0}远程协作 (Remote)
同步指令
# 克隆远程仓库
git clone <url>
# 查看远程仓库
git remote -v
# 添加远程仓库
git remote add origin <url>
# 获取远程更新(只下载,不合并)
git fetch
# 拉取远程更新(下载 + 合并)
git pull # 等价于 fetch + merge
git pull --rebase # 等价于 fetch + rebase
# 推送到远程
git push
git push -u origin main # 首次推送并设置上游
git push --force # 强制推送(覆盖远程,危险)协作工作流
标准的开源协作流程:
TIP
在提交 PR 之前,先 git fetch upstream 并 git rebase upstream/main,保持你的分支与上游同步。
高级进阶 (Advanced)
变基 (Rebase)
Rebase 可以让提交历史变成一条直线,更加清晰。
# 将当前分支变基到 main
git rebase main
# 交互式变基(可以编辑、合并、删除提交)
git rebase -i HEAD~3交互式变基操作:
| 命令 | 作用 |
|---|---|
pick | 保留这个提交 |
reword | 修改提交消息 |
squash | 合并到上一个提交 |
drop | 删除这个提交 |
CAUTION
黄金法则:永远不要对已经推送到公共仓库的提交进行 rebase!这会改变提交历史,导致其他人的代码出问题。
Merge vs Rebase
强制推送
# 强制推送(覆盖远程历史)
git push --force
# 更安全的强制推送(如果远程有新提交则拒绝)
git push --force-with-lease底层原理 (Internals)
理解 Git 的内部工作原理,能帮助你更好地使用它。
内容寻址存储
Git 使用 SHA-1 哈希 来标识所有对象。每个文件、目录结构、提交都有一个唯一的 40 位十六进制哈希值。
# 查看对象内容
git cat-file -p <hash>
# 查看对象类型
git cat-file -t <hash>三大核心对象
| 对象类型 | 存储内容 | 说明 |
|---|---|---|
| Blob | 文件内容 | 不包含文件名,纯内容 |
| Tree | 目录结构 | 包含文件名和指向 Blob/Tree 的指针 |
| Commit | 提交元数据 | 作者、时间、消息、指向 Tree 和父 Commit |
NOTE
这种设计使得 Git 非常高效:相同内容只存储一次,无论它出现在多少个文件或版本中。
.git 目录结构
.git/
├── HEAD # 当前所在分支的指针
├── config # 仓库配置
├── objects/ # 所有对象(blob, tree, commit)
├── refs/ # 分支和标签的引用
│ ├── heads/ # 本地分支
│ └── remotes/ # 远程分支
└── index # 暂存区延伸阅读
- Pro Git 中文版 - 官方免费电子书
- Git Flight Rules - 常见问题解决方案
- Learn Git Branching - 交互式学习分支
下一步:查看 Git 命令速查表 快速查找常用命令!