开发工具

Git 高级技巧:你未必知道的实用操作

掌握 Git 的高级操作:交互式 rebase、cherry-pick、bisect 调试、worktree 等实用技巧。

站长 11 分钟阅读

Git 高级技巧:你未必知道的实用操作

Git 是程序员的日常工具,但很多人只用到了它的基本功能。本文分享一些实用的高级技巧。

1. 交互式 Rebase:整理提交历史

交互式 rebase 是整理 commit 历史的利器:

# 修改最近 5 个提交
git rebase -i HEAD~5

打开编辑器后,你可以:

pick   a1b2c3d 添加用户登录功能
squash e4f5g6h 修复登录 bug        # 合并到上一个提交
reword i7j8k9l 更新文档             # 修改提交信息
edit   m0n1o2p 添加测试             # 暂停以修改文件
drop   q3r4s5t 临时调试代码         # 丢弃此提交
pick   u6v7w8x 优化性能

常用场景

  • 合并零碎提交 — 把 "fix typo" 合并到主提交
  • 修改历史提交信息 — reword
  • 拆分提交 — edit 后分多次提交
  • 删除不需要的提交 — drop

2. Cherry-pick:精准移植提交

当你只需要某个分支上的特定提交时:

# 将 commit abc123 移植到当前分支
git cherry-pick abc123

# 移植多个提交
git cherry-pick abc123 def456

# 移植一段提交范围(不含起点)
git cherry-pick abc123..ghi789

实际场景

# 在 feature 分支修了一个 bug,需要立即应用到 main
git checkout main
git cherry-pick <bugfix-commit-hash>

3. Git Bisect:二分查找 Bug

当引入了一个难以定位的 bug 时,用二分法快速找到罪魁祸首:

# 开始 bisect
git bisect start

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

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

# Git 会自动检出中间版本,你测试后告知结果
git bisect good   # 这个版本正常
# 或
git bisect bad    # 这个版本有 bug

# 重复直到找到引入 bug 的提交

# 结束
git bisect reset

自动化 bisect

# 用脚本自动判断
git bisect start HEAD v1.0.0
git bisect run npm test   # 测试脚本返回 0 = good,非 0 = bad

4. Git Worktree:多工作区并行开发

不需要 stash 或 clone 多份代码,直接创建工作树:

# 在 ../project-feature 目录创建一个工作树,切换到 feature 分支
git worktree add ../project-feature feature-branch

# 在 ../project-hotfix 创建一个工作树,基于 main 创建新分支
git worktree add -b hotfix-branch ../project-hotfix main

# 查看所有工作树
git worktree list

# 删除工作树
git worktree remove ../project-feature

适合场景:正在开发功能时突然要修一个紧急 bug,不用 stash,直接开一个 worktree 修 bug。

5. Stash 的高级用法

# 带消息 stash
git stash push -m "WIP: 用户列表分页"

# stash 指定文件
git stash push -m "暂存配置文件" config.json

# stash 包括未跟踪文件
git stash -u

# 查看所有 stash
git stash list

# 应用但不删除 stash
git stash apply stash@{0}

# 交互式 stash(选择要暂存的代码块)
git stash -p

6. Reflog:救命稻草

当你误删了分支或 reset 了提交:

# 查看所有操作记录
git reflog

# 输出示例:
# a1b2c3d HEAD@{0}: reset: moving to HEAD~3
# e4f5g6h HEAD@{1}: commit: 重要提交
# i7j8k9l HEAD@{2}: checkout: moving from main to feature

# 恢复到误删的提交
git reset --hard e4f5g6h

reflog 是本地的,只要你的提交曾被 Git 记录过,几乎都能找回来。

7. 其他实用技巧

搜索提交历史

# 搜索提交信息
git log --grep="登录"

# 搜索代码变更(谁添加/删除了这行代码)
git log -S "function handleClick" --oneline

# 查看某文件的完整修改历史
git log -p --follow src/App.js

修改上一个提交

# 添加文件到上一个提交
git add forgotten-file.js
git commit --amend --no-edit

# 修改上一个提交的信息
git commit --amend -m "新的提交信息"

清理未跟踪文件

# 预览将要删除的文件
git clean -n

# 删除未跟踪文件
git clean -f

# 删除未跟踪文件和目录
git clean -fd

# 删除被 .gitignore 忽略的文件
git clean -x

Blame 查看每行最后修改

# 查看文件每行的修改者和时间
git blame src/App.js

# 只看第 10-20 行
git blame -L 10,20 src/App.js

总结

技巧场景
交互式 rebase整理提交历史
cherry-pick移植特定提交
bisect二分查找 bug
worktree多分支并行开发
stash -p部分暂存
reflog恢复误操作
log -S搜索代码变更历史

Git 是一个功能极其强大的工具。掌握这些高级技巧,你的版本控制能力将大幅提升!