🔥 Git 是每个开发者的必备工具,但大多数人只会 add/commit/push。本文深入讲解 Git 高级用法:rebase、cherry-pick、worktree、分支策略、团队协作规范,让你从"会用"到"用好"!


一、Git 工作流与分支策略

1.1 Git Flow(经典,适合有版本发布的项目)

main ──────────────────────────────────── v1.0 ── v2.0
   \                                    /        /
    develop ──────────────────────────          /
         \      /        \      /              /
          feat/A    feat/B  hotfix ───────────

分支说明:

  • main:生产环境,只接受 merge,打 tag
  • develop:开发主干,feature 分支从此创建
  • feature/*:功能开发,完成后 merge 回 develop
  • release/*:预发布,只修 bug,merge 到 main 和 develop
  • hotfix/*:线上紧急修复,merge 到 main 和 develop

1.2 Trunk Based Development(简洁,适合 CI/CD 高频发布)

main ───────────────────────────────────── (持续部署)
  |──── feat/A (短命,≤2天)
  |──── feat/B
  |──── hotfix/xxx

适用场景: 团队规模小、发布频率高(一天多次)、有完善的 CI/CD

推荐选择:

团队规模 发布频率 推荐策略
2-5人 随时发布 Trunk Based
5-20人 每周/双周 Git Flow
20+人 固定版本 Git Flow + 严格审查

二、高频但少有人会用的命令

2.1 交互式 rebase(整理提交历史)

# 整理最近5个提交
git rebase -i HEAD~5

# 进入编辑器,可以对每个提交进行操作:
# pick   保留提交(默认)
# reword 修改提交信息
# edit   修改提交内容
# squash 合并到上一个提交(保留信息)
# fixup  合并到上一个提交(丢弃信息)
# drop   删除提交

# 示例:把5个小提交合并成1个大提交
pick a1b2c3d 初始化功能
squash b2c3d4e 修复小bug
squash c3d4e5f 再修复
squash d4e5f6g 调整样式
squash e5f6g7h 完善注释

# 保存后 Git 会让你输入合并后的提交信息

2.2 cherry-pick(摘取特定提交)

# 把 feature 分支上某个提交移到当前分支
git cherry-pick a1b2c3d

# 摘取多个连续提交(左开右闭)
git cherry-pick a1b2c3d..e5f6g7h

# 摘取后不自动提交(先检查再提交)
git cherry-pick -n a1b2c3d
git cherry-pick -n b2c3d4e
git commit -m "合并两个功能修复"

使用场景:

develop ── A ── B ── C(C是hotfix)── D
main    ── X ── Y (需要把C合入main)

git checkout main
git cherry-pick C

2.3 stash 进阶用法

# 保存当前工作(附带描述)
git stash save "WIP: 用户列表功能,待完成搜索"

# 查看所有 stash
git stash list
# stash@{0}: WIP: 用户列表功能,待完成搜索
# stash@{1}: On main: 临时修复

# 应用指定 stash(保留 stash 记录)
git stash apply stash@{1}

# 应用并删除(常用)
git stash pop stash@{0}

# 只 stash 特定文件
git stash push -m "只保存样式修改" src/styles/

# 创建分支并应用 stash(需要在新分支继续工作时)
git stash branch feature/new-branch stash@{0}

2.4 bisect(二分查找 bug 引入的提交)

# 开始 bisect
git bisect start

# 标记当前版本有 bug
git bisect bad

# 标记某个已知正常的版本
git bisect good v1.0.0

# Git 会自动切到中间提交,你测试后告诉它结果
# 测试有 bug:
git bisect bad
# 测试正常:
git bisect good

# Git 会不断二分,最终找到引入 bug 的提交
# 找到后结束 bisect
git bisect reset

2.5 worktree(同时工作在多个分支)

# 在新目录检出另一个分支(不影响当前工作目录)
git worktree add ../hotfix-branch hotfix/urgent-fix

# 查看所有 worktree
git worktree list

# 工作完成后删除
git worktree remove ../hotfix-branch

# 使用场景:在 feature 分支开发时,需要紧急修复 hotfix
# 不需要 stash/切换/stash pop,直接在另一个目录修复

三、提交规范(Conventional Commits)

3.1 格式规范

<type>(<scope>): <description>

[optional body]

[optional footer]

type 说明:

type 说明 示例
feat 新功能 feat(user): 添加用户头像上传功能
fix Bug 修复 fix(auth): 修复 token 过期不跳转登录页
docs 文档更新 docs(README): 更新安装说明
style 代码格式(不影响逻辑) style: 统一缩进为2空格
refactor 重构(不加功能,不修复bug) refactor(api): 提取公共请求处理
perf 性能优化 perf(list): 虚拟滚动优化长列表
test 测试相关 test(user): 补充用户模块单元测试
chore 构建/工具/配置 chore: 升级 vite 到 5.0
revert 回滚 revert: feat(user): 撤销头像功能

3.2 commitlint 配置

# 安装
npm install -D @commitlint/cli @commitlint/config-conventional husky

# 配置 commitlint
echo "module.exports = { extends: ['@commitlint/config-conventional'] };" > commitlint.config.js

# 配置 husky hook(提交前检查)
npx husky install
npx husky add .husky/commit-msg 'npx --no -- commitlint --edit "$1"'
// commitlint.config.js(自定义规则)
module.exports = {
  extends: ['@commitlint/config-conventional'],
  rules: {
    'type-enum': [2, 'always', [
      'feat', 'fix', 'docs', 'style', 'refactor', 
      'perf', 'test', 'chore', 'revert', 'build', 'ci'
    ]],
    'subject-max-length': [2, 'always', 100],
    'subject-case': [0],  // 不限制大小写
  }
};

四、撤销与修复操作

4.1 撤销场景速查

# ===== 未 add(工作区修改)=====
git checkout -- <file>     # 撤销单个文件
git checkout -- .           # 撤销所有修改(危险!)
git restore <file>          # 新语法(推荐)

# ===== 已 add 但未 commit(暂存区)=====
git reset HEAD <file>      # 取消 add(保留修改)
git restore --staged <file> # 新语法

# ===== 已 commit 但未 push =====
git reset --soft HEAD~1    # 撤销提交,修改保留在暂存区
git reset --mixed HEAD~1   # 撤销提交,修改保留在工作区(默认)
git reset --hard HEAD~1    # 撤销提交,修改彻底删除(危险!)

# 修改最近一次提交信息
git commit --amend -m "新的提交信息"

# ===== 已 push(公共分支,用 revert 而非 reset)=====
git revert HEAD             # 创建一个新提交来撤销
git revert a1b2c3d          # 撤销指定提交

4.2 找回"丢失"的提交

# reflog 记录所有 HEAD 变更(包括 reset 删除的提交)
git reflog
# a1b2c3d HEAD@{0}: commit: 最新提交
# b2c3d4e HEAD@{1}: reset: moving to HEAD~1
# c3d4e5f HEAD@{2}: commit: 被 reset 删除的提交  ← 可以找回!

# 找回被 reset 删除的提交
git checkout c3d4e5f
# 或创建新分支
git branch recovery-branch c3d4e5f

五、团队协作最佳实践

5.1 Code Review 流程

# 1. 创建功能分支
git checkout -b feature/user-login main

# 2. 开发并提交
git add .
git commit -m "feat(auth): 实现用户登录功能"
git commit -m "test(auth): 添加登录单元测试"

# 3. 推送前先同步 main
git fetch origin main
git rebase origin/main  # 而非 merge,保持线性历史

# 4. 推送并创建 PR/MR
git push origin feature/user-login

# 5. Code Review 后 squash merge(保持 main 分支历史整洁)

5.2 .gitignore 模板

# Node.js
node_modules/
npm-debug.log*
yarn-error.log

# 构建产物
dist/
build/
.output/

# 环境变量(重要!不要提交密钥)
.env
.env.local
.env.*.local

# IDE
.vscode/
.idea/
*.iml
.DS_Store

# 日志
logs/
*.log

# 运行时文件
*.pid
*.seed
pids/

# 测试覆盖率
coverage/
.nyc_output/

5.3 Git Hooks 自动化

# .husky/pre-commit:提交前自动检查
#!/bin/sh
# 运行 lint 检查
npx lint-staged

# 运行单元测试(可选,会慢一点)
# npm run test:unit
// package.json:lint-staged 只检查本次修改的文件
{
  "lint-staged": {
    "*.{js,ts,vue}": [
      "eslint --fix",
      "prettier --write"
    ],
    "*.{css,scss}": [
      "prettier --write"
    ]
  }
}

六、常用命令速查表

# 查看提交图
git log --oneline --graph --all

# 比较两个分支差异
git diff main feature/xxx

# 查看某个文件的修改历史
git log -p src/components/UserList.vue

# 查看谁改了某行(甩锅神器)
git blame src/utils/auth.js

# 清理已合并的本地分支
git branch --merged | grep -v "\*\|main\|develop" | xargs git branch -d

# 删除远程已合并的分支(谨慎)
git remote prune origin

# 统计代码贡献
git shortlog -sn --all

# 查找包含关键词的提交
git log --all -S "TODO" --oneline

七、总结

Git 进阶必学命令优先级:

优先级 命令 解决的问题
⭐⭐⭐ git rebase -i 整理混乱的提交历史
⭐⭐⭐ git cherry-pick 跨分支摘取修复
⭐⭐⭐ git stash 进阶 灵活保存/恢复工作
⭐⭐ git bisect 快速定位引入 bug 的提交
⭐⭐ git reflog 找回"丢失"的提交
⭐⭐ git worktree 同时工作在多个分支
commitlint + husky 规范团队提交信息

💬 你还用过哪些 Git 骚操作?评论区分享!点赞+收藏,持续更新开发工具实战系列!

标签:Git | 团队协作 | 版本控制 | DevOps | 开发工具

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐