Skip to content

Git 完整技术栈手册

🎯 手册使用指南

这是一份 全景式 Git 知识体系,涵盖工作流、关键参数、底层原理、排错机制以及最佳实践。按使用频率和学习路径组织。

学习路径: 初学者 → 第一、二、三部分 | 进阶者 → 第四、五部分 | 专家级 → 第六、七部分


一、📦 环境构建与基础认知

这部分是地基,涉及环境配置和核心心智模型的建立。

1.1 核心配置与初始化

初始化仓库:

bash
# 在项目根目录执行(仅一次)
git init

身份配置(全局):

bash
# 配置用户名
git config --global user.name "Your Name"

# 配置邮箱
git config --global user.email "email@example.com"

# 查看配置
git config --list

💡 提示

这些信息会记录在每次提交中,建议使用真实信息以便团队协作。

编辑器配置:

bash
# 推荐:配置 VS Code 为默认编辑器(防止卡在 Vim)
git config --global core.editor "code --wait"

# 验证配置
git config --global core.editor

💡 说明: 配置后,执行 git commit 不加 -m 时会自动打开 VS Code 编辑提交信息。

别名配置(提升效率):

bash
# 常用别名
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 状态监测与差异分析 高频

状态概览:

bash
# 查看工作区和暂存区状态(最常用)
git status

# 简洁模式
git status -s

✅ 最佳实践

任何 Git 操作前先运行 git status 了解当前状态。

差异对比(Diffing):

差异对比是理解 Git 三区模型的关键:

对比命令说明
工作区 vs 暂存区git diff显示已修改但 add 的内容
暂存区 vs 最新提交git diff --staged显示 即将 commit 的内容
工作区 vs 最新提交git diff HEAD显示 所有变更

更多差异对比选项:

bash
git diff branch1 branch2    # 对比两个分支
git diff commit1 commit2    # 对比两个提交
git diff --name-only        # 只显示文件名
git diff --stat             # 显示统计信息
git diff HEAD -- file.txt   # 对比特定文件

2.2 提交工作流(Commit) 高频

忽略文件:

在提交前配置 .gitignore 排除敏感或编译文件:

bash
# .gitignore 示例
node_modules/
.env
*.log
dist/
.DS_Store
.vscode/

⚠️ 注意

文件已被跟踪时需先移除:git rm --cached <file> 然后提交。

暂存变更:

bash
git add <file>    # 暂存单个文件
git add .         # 暂存所有变更
git add -u        # 暂存所有已跟踪文件的修改
git add -p        # 交互式暂存(选择性暂存)

提交快照:

bash
# 基本提交
git commit -m "Present tense message"

# 多行提交信息
git commit -m "标题" -m "详细描述第一行" -m "详细描述第二行"

# 跳过暂存区直接提交(已跟踪文件)
git add -am "fix: update logic"

💡 提交信息规范

使用祈使句,首行 ≤ 50 字符。常用前缀:feat:(新功能)、fix:(修复)、docs:(文档)、refactor:(重构)、test:(测试)、chore:(杂项)

后悔药(修正):

bash
# 修正上一次提交(修改信息或添加漏掉的文件)
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) 高频

查看分支:

bash
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 — 重构

重命名分支:

bash
git branch -m <new-name>                    # 重命名当前分支
git branch -m <old-name> <new-name>         # 重命名其他分支

# 重命名远程分支(先删除旧的,再推送新的)
git push origin --delete <old-name>
git push origin -u <new-name>

删除分支:

bash
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) 中频

当工作未完成但需切换分支时使用。

存储工作:

bash
git stash                              # 存储当前工作
git stash save "WIP: feature impl"     # 存储时添加描述
git stash -u                           # 存储包括未跟踪的文件
git stash -a                           # 存储包括忽略的文件

恢复工作:

bash
git stash pop                    # 恢复最新的 stash 并删除
git stash apply                  # 恢复但保留 stash
git stash apply stash@{2}        # 恢复特定的 stash
git stash branch <branch-name>   # 恢复到新分支

管理 Stash:

bash
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 远程连接 中频

克隆仓库:

bash
git clone <url>                  # 克隆仓库(自动配置 origin)
git clone <url> <directory>      # 克隆到指定目录
git clone -b <branch> <url>      # 克隆特定分支
git clone --depth 1 <url>        # 浅克隆(只下载最近的历史)

关联远程仓库:

bash
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 密钥配置:

bash
# 生成 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):

bash
git fetch origin           # 获取所有远程分支更新(不合并)
git fetch origin main      # 获取特定分支
git fetch --all            # 获取所有远程仓库
git fetch -p               # 获取并清理远程已删除的分支

✅ 安全操作

fetch 只下载数据更新 origin/main,不修改本地代码。

拉取(Pull):

bash
git pull origin main             # 拉取并合并(fetch + merge)
git pull --rebase origin main    # 拉取并变基(fetch + rebase)
git config --global pull.rebase true  # 设置默认拉取策略

⚠️ 注意

pull 可能产生冲突。建议先 fetch 查看差异,再决定是否 pull

推送(Push):

bash
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

特性分支工作流示例:

bash
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 工作流示例:

bash
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) 中频

常规变基:

bash
# 将当前分支移植到 main 顶端(保持线性历史)
git rebase main

# 如果有冲突
git add <resolved-files>
git rebase --continue   # 继续
git rebase --skip       # 跳过当前提交
git rebase --abort      # 中止变基

💡 Rebase vs Merge

  • Rebase — 线性历史(干净)
  • Merge — 保留分支(完整)

交互式变基:

整理最近 n 次提交,打造完美提交历史:

bash
git rebase -i HEAD~3  # 交互式变基最近 3 次提交

可用操作:

操作说明
pick保留该提交
reword修改提交信息
squash合并到前一个提交,保留注释
fixup合并到前一个提交,丢弃注释
edit暂停以修改提交
drop删除该提交

🚫 Rebase 黄金法则

永远不要 Rebase 已共享的公共分支!

  • 安全场景: 本地分支、未推送的提交、功能分支整理
  • 禁用场景: main/master、已推送的共享分支、团队使用中的分支

5.2 版本发布(Tagging) 低频

创建标签:

bash
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 修复

推送和删除标签:

bash
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:文件改乱了(未提交)

bash
git restore <file>   # 恢复工作区文件到最新提交状态
git restore .        # 恢复所有文件

场景 2:误添加进暂存区

bash
git restore --staged <file>  # 从暂存区移除(保留工作区修改)
git restore --staged .       # 移除所有

场景 3:提交错了(私有分支)

bash
git reset HEAD~1           # 撤销提交,保留代码(文件回到工作区)
git reset --soft HEAD~1    # 撤销提交,保留代码在暂存区
git reset HEAD~3           # 撤销多次提交

场景 4:毁灭性重置

bash
git reset --hard HEAD~1    # 丢弃代码,完全回到之前状态

🚫 极度危险

所有未提交的修改将永久丢失!

场景 5:提交错了(公共分支)

bash
git revert <commit>        # 创建新的反向提交(推荐)
git revert HEAD~2..HEAD    # 反向最近 3 次提交

✅ 推荐

revert 不修改历史,适合公共分支。

6.2 终极救援(Reflog) 救急

reflog 记录所有 HEAD 移动,是 Git 的"后悔药"。

适用场景:

  • 🔸 误删分支
  • 🔸 Rebase 失败
  • 🔸 Reset --hard 后后悔
  • 🔸 任何想回到过去的时刻

操作步骤:

bash
# 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}

实战案例:

bash
# 误删分支后找回
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/ 目录
bash
git cat-file -t <hash>   # 查看对象类型
git cat-file -p <hash>   # 查看对象内容
git cat-file -s <hash>   # 查看对象大小

7.2 三大对象类型

对象类型存储内容特点
Blob文件内容只存储内容(不含文件名)、内容相同则哈希相同、不可变
Tree目录结构包含文件名、权限、指向 Blob 的指针、子目录
Commit提交元数据包含指向 Tree 的指针、父提交、作者信息、时间、提交信息

7.3 引用系统

bash
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 而非分支时

bash
git checkout <commit-hash>
# 提示:You are in 'detached HEAD' state

问题: 此时的提交不属于任何分支,容易丢失。

解决方案:

bash
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)

流程说明:

  1. 工作区 — 实际编辑的文件
  2. 暂存区 — 准备提交的快照
  3. 本地仓库 — 已提交的历史
  4. 远程仓库 — 共享的历史
bash
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