📖 文章概述
Git 是现代开发的必备工具,掌握其核心概念和工作流对团队协作至关重要。本文深入讲解 Git 的高级特性、团队工作流和实战技巧。
🎯 Git 核心概念
三个基本区域
┌─────────────┐ git add ┌───────────┐ git commit ┌──────────┐
│ 工作区 │──────────────→│ 暂存区 │──────────────→│ 仓库 │
│ (Working) │ │ (Index) │ │ (HEAD) │
└─────────────┘ └───────────┘ └──────────┘
↑ ↓
└────────────────── git checkout ──────────────────────────┘
四种对象类型
| 对象 | 描述 | 用途 |
|---|---|---|
| blob | 文件内容 | 存储文件 |
| tree | 目录结构 | 表示文件夹 |
| commit | 提交记录 | 版本快照 |
| tag | 标签 | 标记版本 |
🚀 基础命令速览
1. 初始化和克隆
# 初始化本地仓库
git init
# 克隆远程仓库
git clone https://github.com/user/repo.git
# 克隆特定分支
git clone -b dev https://github.com/user/repo.git
# 浅克隆(只克隆最近的提交)
git clone --depth 1 https://github.com/user/repo.git
2. 基础工作流
# 查看状态
git status
# 查看差异
git diff # 工作区 vs 暂存区
git diff --cached # 暂存区 vs HEAD
# 添加更改
git add file.js # 添加特定文件
git add . # 添加所有更改
# 提交
git commit -m "feat: add new feature"
git commit -am "fix: bug fix" # 自动暂存已跟踪文件
git commit --amend # 修改最后一次提交
# 推送和拉取
git push origin main
git pull origin main # 等同于 fetch + merge
🌳 分支管理
3. 分支基础操作
# 列出分支
git branch # 本地分支
git branch -a # 所有分支
git branch -r # 远程分支
# 创建分支
git branch feature/login # 创建分支
git checkout -b feature/login # 创建并切换
git switch -c feature/login # 新语法(推荐)
# 切换分支
git checkout main
git switch main # 新语法(推荐)
# 删除分支
git branch -d feature/login # 删除已合并的分支
git branch -D feature/login # 强制删除
# 重命名分支
git branch -m old-name new-name
4. 分支合并
# 基础合并
git checkout main
git merge feature/login
# 合并时保留分支提交历史
git merge --no-ff feature/login -m "Merge feature/login into main"
# 变基(线性历史)
git rebase main
git rebase -i HEAD~3 # 交互式变基
# 变基 vs 合并对比
# merge:保留分支历史,产生 merge commit
# rebase:线性历史,更清晰但改写历史
5. 冲突解决
# 当 git merge 遇到冲突时
# 文件会被标记为冲突状态
<<<<<< HEAD
当前分支的代码
======
要合并的分支的代码
>>>>>> feature/login
# 解决步骤
# 1. 手动编辑文件,保留需要的代码
# 2. 删除冲突标记
# 3. 暂存文件
git add conflicted-file.js
# 4. 完成合并
git commit -m "Resolve merge conflict"
# 中止合并
git merge --abort
📊 高级工作流
6. Git Flow 工作流
release/1.0
/ \
main ───┴─────────────┬──── (v1.0 标签)
| |
| hotfix/critical-bug
| / \
develop─┴────────┴──────────────┴──
|
├─ feature/login
├─ feature/payment
└─ feature/dashboard
Git Flow 规范
# 1. 从 develop 创建特性分支
git checkout develop
git pull origin develop
git checkout -b feature/new-feature
# 2. 开发并提交
git add .
git commit -m "feat: implement new feature"
git push origin feature/new-feature
# 3. 创建 Pull Request,进行代码审查
# 4. 合并到 develop
git checkout develop
git pull origin develop
git merge --no-ff feature/new-feature
git push origin develop
# 5. 发布版本:创建 release 分支
git checkout -b release/1.0 develop
# 修改版本号,修复 bug
git push origin release/1.0
# 6. 合并回 main 和 develop
git checkout main
git merge --no-ff release/1.0 -m "Release version 1.0"
git tag -a v1.0 -m "Version 1.0"
git push origin main --tags
git checkout develop
git merge --no-ff release/1.0
git push origin develop
# 7. 删除 release 分支
git branch -d release/1.0
7. GitHub Flow 工作流
# 简化的工作流,适合持续部署
# 1. 从 main 创建分支
git checkout -b feature/quick-fix
# 2. 提交代码
git add .
git commit -m "Quick fix"
git push origin feature/quick-fix
# 3. 创建 Pull Request
# 在 GitHub 上创建 PR,请求审查
# 4. 代码审查和讨论
# 如需修改,继续推送到同一分支
# 5. 合并到 main
git checkout main
git pull origin main
git merge feature/quick-fix
git push origin main
# 6. 删除分支
git branch -d feature/quick-fix
git push origin --delete feature/quick-fix
🔄 提交历史管理
8. 交互式变基
# 查看最近 5 个提交
git log --oneline -5
# 交互式变基(编辑、合并、排序提交)
git rebase -i HEAD~5
# 编辑窗口选项
# pick 1a2b3c Commit message 1
# reword 2b3c4d Commit message 2 # 修改提交信息
# squash 3c4d5e Commit message 3 # 合并到前一个提交
# fixup 4d5e6f Commit message 4 # 合并但丢弃信息
# drop 5e6f7g Commit message 5 # 删除此提交
9. Cherry-pick(选择提交)
# 将特定提交应用到当前分支
git cherry-pick abc123def456
# 选择多个提交
git cherry-pick abc123..def456
# 选择范围(不包括 start)
git cherry-pick start..end
# 处理冲突后继续
git cherry-pick --continue
# 或中止
git cherry-pick --abort
10. Revert(撤销提交)
# 创建一个新提交来撤销旧提交
git revert abc123
# 撤销多个提交
git revert --no-edit HEAD~2..HEAD
# 暂存但不自动提交
git revert -n abc123
git commit -m "Revert previous commit"
🎯 实战:完整团队工作流示例
场景:多人协作开发新功能
# ===== 开发者 A 开始新功能 =====
# 1. 拉取最新代码
git checkout develop
git pull origin develop
# 2. 创建特性分支
git checkout -b feature/user-authentication
# 3. 开发并定期提交
echo "Add login page" > login.js
git add login.js
git commit -m "feat: create login page component"
echo "Add auth service" > auth-service.js
git add auth-service.js
git commit -m "feat: implement authentication service"
# 4. 推送到远程
git push origin feature/user-authentication
# 5. 在 GitHub 创建 Pull Request
# ===== 代码审查者(开发者 B)=====
# 在 GitHub 上审查代码,提出修改意见
# ===== 开发者 A 处理反馈 =====
# 6. 修改代码
echo "Fix validation bug" >> auth-service.js
git add auth-service.js
git commit -m "fix: add email validation"
# 7. 推送更新
git push origin feature/user-authentication
# 8. PR 通过审查后,在 GitHub 合并
# 或本地合并
# ===== 项目维护者 =====
# 9. 合并到 develop
git checkout develop
git pull origin develop
git merge --no-ff feature/user-authentication -m "Merge: user authentication feature"
git push origin develop
# 10. 删除特性分支
git branch -d feature/user-authentication
git push origin --delete feature/user-authentication
🛠️ 高级技巧
11. Stash(临时保存)
# 保存未提交的更改
git stash save "WIP: feature development"
# 列出所有 stash
git stash list
# 应用 stash
git stash apply stash@{0} # 保留 stash
git stash pop stash@{0} # 应用后删除
# 删除 stash
git stash drop stash@{0}
git stash clear # 删除所有 stash
# 创建分支并应用 stash
git stash branch feature/temp stash@{0}
12. 搜索和查找
# 查看提交历史
git log --oneline # 单行格式
git log --graph --all # 图形化显示
git log -p # 显示diff
git log --author="John" # 按作者过滤
git log --since="2 weeks ago" # 按时间过滤
git log -S "search term" # 搜索代码变更
# 查找包含特定提交的分支
git branch --contains abc123
# 查找引入特定代码的提交
git blame file.js
# 二分查找bug(在哪个提交引入的)
git bisect start
git bisect bad HEAD
git bisect good abc123
# 手动测试后标记好坏
git bisect good/bad
13. 重写历史
# ⚠️ 危险操作:仅在本地或私有分支使用
# 修改最后的提交
git commit --amend --no-edit
git commit --amend -m "New message"
# 修改历史提交
git rebase -i HEAD~5
# 重置到某个提交(丢弃之后的提交)
git reset --soft abc123 # 保留更改
git reset --mixed abc123 # 保留文件但取消暂存
git reset --hard abc123 # 完全丢弃
# 强制推送(仅在确定的情况下)
git push origin feature/branch --force
📋 最佳实践与规范
14. 提交信息规范
# 好的提交信息格式:
# <type>: <subject>
#
# <body>
#
# <footer>
# 类型(type)
# feat: 新功能
# fix: bug 修复
# docs: 文档变更
# style: 代码风格变更(不影响逻辑)
# refactor: 重构(不是 feat 也不是 fix)
# perf: 性能优化
# test: 测试相关
# chore: 工具、配置、依赖等
# 示例提交
git commit -m "feat: add user profile page
- Create UserProfile component
- Implement profile data fetching
- Add edit functionality
Closes #123"
15. 分支命名规范
# 特性分支
feature/user-authentication
feature/payment-integration
# Bug 修复分支
bugfix/login-validation
hotfix/critical-security-issue
# 文档分支
docs/api-documentation
# 发布分支
release/1.0.0
# 推荐格式
<type>/<description>
🐛 常见问题解决
问题 1:误删本地分支
# 恢复:使用 reflog
git reflog
# 查找删除的分支 commit
git checkout -b recovered-branch abc123
问题 2:错误的 push
# 本地修复后强制推送
git reset --hard HEAD~1
git push origin branch-name --force
# ⚠️ 只在确定没有人基于此提交工作时使用
问题 3:忘记创建分支直接改 main
# 恢复方法
# 1. 保存当前更改
git stash
# 2. 重置 main
git reset --hard origin/main
# 3. 创建新分支
git checkout -b feature/fix
# 4. 恢复更改
git stash pop
# 5. 提交和推送
git add .
git commit -m "feat: implement fix"
git push origin feature/fix
📊 性能优化
16. 大仓库优化
# 浅克隆(不克隆完整历史)
git clone --depth 1 --single-branch https://github.com/user/repo.git
# 部分克隆(只克隆需要的文件)
git clone --filter=blob:none --sparse https://github.com/user/repo.git
git sparse-checkout add src/components
# 清理本地缓存
git gc --aggressive
git prune
🎓 团队最佳实践总结
DO ✅
# 1. 频繁拉取远程更新
git pull origin develop
# 2. 使用有意义的提交信息
git commit -m "feat: implement payment checkout"
# 3. 小粒度提交
# 每个提交应该是一个独立的逻辑单元
# 4. 在合并前进行变基
git fetch origin
git rebase origin/develop
# 5. 使用分支保护规则
# 在 GitHub 设置:require pull request reviews
DON'T ❌
# 1. 避免提交敏感信息
# git commit -m "API_KEY=secret123"
# 2. 避免在 main 分支直接修改
# 应该通过 PR 进行
# 3. 避免大提交
# 应该分割成多个小提交
# 4. 避免强制推送到共享分支
git push --force origin main # ❌ 危险
# 5. 避免忽视合并冲突
# 应该认真解决而不是随意选择
📚 扩展资源
总结
掌握 Git 的关键要点:
- 理解基础:工作区、暂存区、仓库三个概念
- 选择工作流:Git Flow 或 GitHub Flow
- 规范提交:清晰的提交信息和合理的分支划分
- 团队协作:通过 PR 进行代码审查
- 高级技巧:变基、Cherry-pick、搜索等
- 最佳实践:小粒度提交、频繁更新、保护关键分支
掌握这些技能,你将成为团队中的版本控制高手!