Git 完整技术栈手册
🎯 手册使用指南
这是一份 全景式 Git 知识体系,涵盖工作流、关键参数、底层原理、排错机制以及最佳实践。按使用频率和学习路径组织。
学习路径: 初学者 → 第一、二、三部分 | 进阶者 → 第四、五部分 | 专家级 → 第六、七部分
一、📦 环境构建与基础认知
这部分是地基,涉及环境配置和核心心智模型的建立。
1.1 核心配置与初始化
初始化仓库:
# 在项目根目录执行(仅一次)
git init身份配置(全局):
# 配置用户名
git config --global user.name "Your Name"
# 配置邮箱
git config --global user.email "email@example.com"
# 查看配置
git config --list💡 提示
这些信息会记录在每次提交中,建议使用真实信息以便团队协作。
编辑器配置:
# 推荐:配置 VS Code 为默认编辑器(防止卡在 Vim)
git config --global core.editor "code --wait"
# 验证配置
git config --global core.editor💡 说明: 配置后,执行
git commit不加-m时会自动打开 VS Code 编辑提交信息。
别名配置(提升效率):
# 常用别名
git config --global alias.s "status"
git config --global alias.co "checkout"
git config --global alias.br "branch"
git config --global alias.ci "commit"
# 图形化日志
git config --global alias.lg "log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"1.2 文件操作基础(Unix/Linux)
| 类别 | 命令 |
|---|---|
| 📂 导航 | ls(列出)、pwd(当前路径)、cd(切换)、cd -(返回上次目录) |
| ➕ 创建 | touch <file>(文件)、mkdir <dir>(目录)、mkdir -p a/b/c(递归) |
| ⚠️ 删除 | rm <file>、rm -rf <dir> 🚨 极度危险,永久删除! |
二、🔄 日常开发核心循环
这是发生频率最高(90% 时间)的操作区域,强调"原子化"与"精确控制"。
2.1 状态监测与差异分析 高频
状态概览:
# 查看工作区和暂存区状态(最常用)
git status
# 简洁模式
git status -s✅ 最佳实践
任何 Git 操作前先运行 git status 了解当前状态。
差异对比(Diffing):
差异对比是理解 Git 三区模型的关键:
| 对比 | 命令 | 说明 |
|---|---|---|
| 工作区 vs 暂存区 | git diff | 显示已修改但 未 add 的内容 |
| 暂存区 vs 最新提交 | git diff --staged | 显示 即将 commit 的内容 |
| 工作区 vs 最新提交 | git diff HEAD | 显示 所有变更 |
更多差异对比选项:
git diff branch1 branch2 # 对比两个分支
git diff commit1 commit2 # 对比两个提交
git diff --name-only # 只显示文件名
git diff --stat # 显示统计信息
git diff HEAD -- file.txt # 对比特定文件2.2 提交工作流(Commit) 高频
忽略文件:
在提交前配置 .gitignore 排除敏感或编译文件:
# .gitignore 示例
node_modules/
.env
*.log
dist/
.DS_Store
.vscode/⚠️ 注意
文件已被跟踪时需先移除:git rm --cached <file> 然后提交。
暂存变更:
git add <file> # 暂存单个文件
git add . # 暂存所有变更
git add -u # 暂存所有已跟踪文件的修改
git add -p # 交互式暂存(选择性暂存)提交快照:
# 基本提交
git commit -m "Present tense message"
# 多行提交信息
git commit -m "标题" -m "详细描述第一行" -m "详细描述第二行"
# 跳过暂存区直接提交(已跟踪文件)
git add -am "fix: update logic"💡 提交信息规范
使用祈使句,首行 ≤ 50 字符。常用前缀:feat:(新功能)、fix:(修复)、docs:(文档)、refactor:(重构)、test:(测试)、chore:(杂项)
后悔药(修正):
# 修正上一次提交(修改信息或添加漏掉的文件)
git commit --amend
# 修正提交信息但不修改文件
git commit --amend -m "New message"
# 添加漏掉的文件到上一次提交
git add forgotten_file.txt
git commit --amend --no-edit⚠️ 警告
--amend 会修改历史,不要修正已推送的提交!
三、🌿 分支管理与并行开发
通过隔离环境实现并行开发,保证主干(Main/Master)的稳定性。
3.1 分支操作(CRUD) 高频
查看分支:
git branch # 查看本地分支
git branch -a # 查看所有分支(包括远程)
git branch -r # 查看远程分支
git branch -v # 查看分支详细信息(包括最后提交)
git branch --merged # 查看已合并的分支
git branch --no-merged # 查看未合并的分支创建与切换分支:
| 方式 | 命令 |
|---|---|
| 推荐(Git 2.23+) | git switch -c <branch> 创建并切换git switch <branch> 仅切换git switch - 切换到上一个分支 |
| 传统方式 | git checkout -b <branch> 创建并切换git checkout <branch> 仅切换git branch <branch> 创建不切换 |
💡 分支命名
feature/user-auth— 新功能bugfix/login-error— 修复hotfix/security-patch— 紧急refactor/database-layer— 重构
重命名分支:
git branch -m <new-name> # 重命名当前分支
git branch -m <old-name> <new-name> # 重命名其他分支
# 重命名远程分支(先删除旧的,再推送新的)
git push origin --delete <old-name>
git push origin -u <new-name>删除分支:
git branch -d <branch-name> # 安全删除(需已合并)
git branch -D <branch-name> # 强制删除(丢弃未合并工作)
git push origin --delete <branch-name> # 删除远程分支
# 批量删除已合并的本地分支
git branch --merged | grep -v "\*" | grep -v "main\|master" | xargs -n 1 git branch -d🚫 危险操作
-D 会强制删除,未合并的工作将丢失!
3.2 临时任务切换(Stashing) 中频
当工作未完成但需切换分支时使用。
存储工作:
git stash # 存储当前工作
git stash save "WIP: feature impl" # 存储时添加描述
git stash -u # 存储包括未跟踪的文件
git stash -a # 存储包括忽略的文件恢复工作:
git stash pop # 恢复最新的 stash 并删除
git stash apply # 恢复但保留 stash
git stash apply stash@{2} # 恢复特定的 stash
git stash branch <branch-name> # 恢复到新分支管理 Stash:
git stash list # 查看 stash 列表
git stash show # 查看 stash 详情
git stash show -p # 显示差异
git stash drop stash@{1} # 删除特定 stash
git stash clear # 清空所有 stash四、🌐 远程协作与同步
涉及 GitHub/GitLab 交互,强调"拉取(Pull)"与"推送(Push)"的纪律。
4.1 远程连接 中频
克隆仓库:
git clone <url> # 克隆仓库(自动配置 origin)
git clone <url> <directory> # 克隆到指定目录
git clone -b <branch> <url> # 克隆特定分支
git clone --depth 1 <url> # 浅克隆(只下载最近的历史)关联远程仓库:
git remote add origin <url> # 添加远程仓库
git remote -v # 查看远程仓库
git remote rename origin upstream # 重命名远程仓库
git remote set-url origin <new-url> # 修改远程 URL
git remote remove origin # 删除远程仓库SSH 密钥配置:
# 生成 SSH 密钥
ssh-keygen -t ed25519 -C "your_email@example.com"
# 启动 ssh-agent
eval "$(ssh-agent -s)"
# 添加私钥
ssh-add ~/.ssh/id_ed25519
# 复制公钥(macOS)
pbcopy < ~/.ssh/id_ed25519.pub
# 测试连接
ssh -T git@github.com💡 说明: 将公钥添加到 GitHub/GitLab Settings → SSH Keys,即可免密操作。
4.2 同步数据 高频
获取(Fetch):
git fetch origin # 获取所有远程分支更新(不合并)
git fetch origin main # 获取特定分支
git fetch --all # 获取所有远程仓库
git fetch -p # 获取并清理远程已删除的分支✅ 安全操作
fetch 只下载数据更新 origin/main,不修改本地代码。
拉取(Pull):
git pull origin main # 拉取并合并(fetch + merge)
git pull --rebase origin main # 拉取并变基(fetch + rebase)
git config --global pull.rebase true # 设置默认拉取策略⚠️ 注意
pull 可能产生冲突。建议先 fetch 查看差异,再决定是否 pull。
推送(Push):
git push origin <branch> # 推送到远程分支
git push -u origin <branch> # 首次推送并建立追踪关系
git push --all # 推送所有分支
git push --tags # 推送标签
git push -f origin <branch> # 强制推送(危险!)
git push --force-with-lease origin <branch> # 更安全的强制推送🚫 危险操作
-f 强制推送会覆盖远程历史,团队协作禁用!用 --force-with-lease 更安全。
4.3 两种主流工作流
| 工作流 | 适用场景 | 流程 |
|---|---|---|
| 特性分支工作流 | 团队共享仓库权限 | 创建分支 → 开发 → 推送 → PR → 审查 → 合并 |
| Fork & Clone 工作流 | 开源项目贡献 | Fork → Clone → 添加上游 → 同步 → 推送 → PR |
特性分支工作流示例:
git switch -c feature/new-feature # 创建功能分支
git add .
git commit -m "feat: implement feature"
git push -u origin feature/new-feature # 推送到远程
# 在 GitHub 上创建 PR,审查通过后合并Fork & Clone 工作流示例:
git clone <your-fork-url> # Clone 自己的 Fork
git remote add upstream <original-url> # 添加上游仓库
git fetch upstream # 同步上游更新
git merge upstream/main
git push origin main # 推送到自己的 Fork
# 在 GitHub 上向上游发起 PR五、📜 历史管理与发布
不仅是记录历史,更是"编排"清晰的项目演进史。
5.1 整理历史(Rebase) 中频
常规变基:
# 将当前分支移植到 main 顶端(保持线性历史)
git rebase main
# 如果有冲突
git add <resolved-files>
git rebase --continue # 继续
git rebase --skip # 跳过当前提交
git rebase --abort # 中止变基💡 Rebase vs Merge
- Rebase — 线性历史(干净)
- Merge — 保留分支(完整)
交互式变基:
整理最近 n 次提交,打造完美提交历史:
git rebase -i HEAD~3 # 交互式变基最近 3 次提交可用操作:
| 操作 | 说明 |
|---|---|
pick | 保留该提交 |
reword | 修改提交信息 |
squash | 合并到前一个提交,保留注释 |
fixup | 合并到前一个提交,丢弃注释 |
edit | 暂停以修改提交 |
drop | 删除该提交 |
🚫 Rebase 黄金法则
永远不要 Rebase 已共享的公共分支!
- ✅ 安全场景: 本地分支、未推送的提交、功能分支整理
- ❌ 禁用场景: main/master、已推送的共享分支、团队使用中的分支
5.2 版本发布(Tagging) 低频
创建标签:
git tag v1.0.0 # 轻量标签(不推荐)
git tag -a v1.0.0 -m "Release v1.0.0" # 附注标签(推荐)
git tag -a v0.9.0 <commit-hash> -m "Retroactive tag" # 为历史提交打标签
git tag # 查看标签
git tag -l "v1.*" # 模式匹配
git show v1.0.0 # 查看标签详情语义化版本(Semantic Versioning):
格式:MAJOR.MINOR.PATCH = 主版本.次版本.修订版
- MAJOR — 不兼容变更
- MINOR — 新增功能
- PATCH — Bug 修复
推送和删除标签:
git push origin v1.0.0 # 推送单个标签
git push origin --tags # 推送所有标签
git tag -d v1.0.0 # 删除本地标签
git push origin --delete v1.0.0 # 删除远程标签六、🔧 撤销与灾难救援
针对不同阶段的错误,提供相应的撤销手段。
6.1 撤销决策树
场景 1:文件改乱了(未提交)
git restore <file> # 恢复工作区文件到最新提交状态
git restore . # 恢复所有文件场景 2:误添加进暂存区
git restore --staged <file> # 从暂存区移除(保留工作区修改)
git restore --staged . # 移除所有场景 3:提交错了(私有分支)
git reset HEAD~1 # 撤销提交,保留代码(文件回到工作区)
git reset --soft HEAD~1 # 撤销提交,保留代码在暂存区
git reset HEAD~3 # 撤销多次提交场景 4:毁灭性重置
git reset --hard HEAD~1 # 丢弃代码,完全回到之前状态🚫 极度危险
所有未提交的修改将永久丢失!
场景 5:提交错了(公共分支)
git revert <commit> # 创建新的反向提交(推荐)
git revert HEAD~2..HEAD # 反向最近 3 次提交✅ 推荐
revert 不修改历史,适合公共分支。
6.2 终极救援(Reflog) 救急
reflog 记录所有 HEAD 移动,是 Git 的"后悔药"。
适用场景:
- 🔸 误删分支
- 🔸 Rebase 失败
- 🔸 Reset --hard 后后悔
- 🔸 任何想回到过去的时刻
操作步骤:
# 1. 查看所有 HEAD 移动记录
git reflog
# 输出示例:
# a1b2c3d HEAD@{0}: reset: moving to HEAD~1
# e4f5g6h HEAD@{1}: commit: add feature
# i7j8k9l HEAD@{2}: commit: fix bug
# 2. 找到误操作前的哈希值(如 e4f5g6h)
# 3. 恢复到该状态
git reset --hard e4f5g6h
# 或者使用相对引用
git reset --hard HEAD@{1}实战案例:
# 误删分支后找回
git reflog # 找到分支删除前的提交
git checkout -b recovered-branch <commit-hash>
# Reset --hard 后后悔
git reflog # 找到 reset 前的状态
git reset --hard HEAD@{1}💡 说明: reflog 默认保留 90 天后被垃圾回收。
七、⚙️ 底层原理
理解 Git 的本质有助于排错和理解高级操作。
7.1 Git 的本质
Git 本质上是一个 内容寻址的文件系统(Content-Addressable File System)。
- 每个对象都通过 SHA-1 哈希值 唯一标识
- 相同内容生成相同哈希
- 所有数据存储在
.git/objects/目录
git cat-file -t <hash> # 查看对象类型
git cat-file -p <hash> # 查看对象内容
git cat-file -s <hash> # 查看对象大小7.2 三大对象类型
| 对象类型 | 存储内容 | 特点 |
|---|---|---|
| Blob | 文件内容 | 只存储内容(不含文件名)、内容相同则哈希相同、不可变 |
| Tree | 目录结构 | 包含文件名、权限、指向 Blob 的指针、子目录 |
| Commit | 提交元数据 | 包含指向 Tree 的指针、父提交、作者信息、时间、提交信息 |
7.3 引用系统
cat .git/HEAD # HEAD:当前分支指针
cat .git/refs/heads/main # 分支:指向提交的可移动指针
cat .git/refs/tags/v1.0.0 # 标签:指向提交的固定指针
cat .git/refs/remotes/origin/main # 远程分支:远程仓库的分支镜像7.4 分离头指针(Detached HEAD)
发生情况: 检出具体 Commit 而非分支时
git checkout <commit-hash>
# 提示:You are in 'detached HEAD' state问题: 此时的提交不属于任何分支,容易丢失。
解决方案:
git switch -c new-branch-name # 方案 1:创建新分支保存工作
git switch main # 方案 2:回到分支⚠️ 警告
分离头指针状态下的提交若不创建分支,切换后会被垃圾回收。
7.5 Git 三区模型
工作区 (Working Directory)
↓ git add
暂存区 (Staging Area / Index)
↓ git commit
本地仓库 (Repository / .git directory)
↓ git push
远程仓库 (Remote Repository)流程说明:
- 工作区 — 实际编辑的文件
- 暂存区 — 准备提交的快照
- 本地仓库 — 已提交的历史
- 远程仓库 — 共享的历史
git status # 查看各区域状态
git diff # 工作区 vs 暂存区
git diff --staged # 暂存区 vs 本地仓库
git diff HEAD # 工作区 vs 本地仓库八、🎓 进阶学习资源
📖 文档:
🛠️ VS Code 插件:
🎮 交互学习:
九、📋 速查表
最常用命令
| 命令 | 功能 | 使用频率 |
|---|---|---|
git status | 查看状态 | 极高 |
git add . | 暂存所有 | 极高 |
git commit -m "" | 提交 | 极高 |
git push | 推送 | 高 |
git pull | 拉取 | 高 |
git switch -c | 创建分支 | 中 |
git merge | 合并分支 | 中 |
git stash | 暂存工作 | 中 |
git rebase | 变基 | 低 |
git reflog | 历史记录 | 救急 |
💡 学习建议
实践为王:多用、多错、多查,经验是最好的老师。Git 是工具,服务于开发,理解核心概念比记住所有命令更重要。
最后更新:2025-11-23 | 作者:Hugo