用途
本技能用于掌握 Git 高级工作流,帮助开发者维护干净的提交历史、高效协作,并在出现误操作或提交丢失时进行恢复。适用于清理合并前的提交历史、跨分支应用特定提交、查找引入缺陷的提交、同时开发多个功能、从 Git 错误或丢失提交中恢复、管理复杂分支工作流、准备干净的 PR 以及同步已分叉的分支。若任务与 Git 高级工作流无关,或需要本范围之外的领域与工具,则不应使用本技能。
主要能力(核心概念)
1. 交互式变基(Interactive Rebase)
Git 历史编辑的“瑞士军刀”。常见操作:pick(保持提交不变)、reword(修改提交信息)、edit(修订提交内容)、squash(与前一个提交合并)、fixup(类似 squash 但丢弃信息)、drop(完全移除提交)。基本用法:git rebase -i HEAD~5(变基最近 5 个提交)、git rebase -i $(git merge-base HEAD main)(变基当前分支上的全部提交)、git rebase -i abc123(变基到指定提交)。
2. 拣选提交(Cherry-Picking)
将某个分支的特定提交应用到另一分支,而无需合并整个分支。示例:git cherry-pick abc123(拣选单个提交)、git cherry-pick abc123..def456(拣选提交范围,起始不包含)、git cherry-pick -n abc123(不提交,仅暂存更改)、git cherry-pick -e abc123(拣选并编辑提交信息)。
3. Git Bisect
通过提交历史进行二分查找,定位引入缺陷的提交。示例流程:git bisect start、git bisect bad、git bisect good v1.0.0,Git 会检出中间提交供测试,随后继续标记 good 或 bad,直到找到缺陷,最后 git bisect reset。自动化方式:git bisect start HEAD v1.0.0 后执行 git bisect run ./test.sh,脚本应对 good 返回退出码 0,对 bad 返回 1-127(125 除外)。
4. 工作树(Worktrees)
无需暂存或切换即可同时处理多个分支。示例:git worktree list(列出已有工作树)、git worktree add ../project-feature feature/new-feature(为特性分支添加工作树)、git worktree add -b bugfix/urgent ../project-hotfix main(添加工作树并创建新分支)、git worktree remove ../project-feature(移除工作树)、git worktree prune(清理失效工作树)。
5. Reflog
安全网,跟踪所有引用移动,包括已删除的提交。示例:git reflog(查看 reflog)、git reflog show feature/branch(查看特定分支的 reflog);恢复已删除提交可先查看 reflog 找到提交哈希,再 git checkout abc123 与 git branch recovered-branch;恢复已删除分支可 git branch deleted-branch abc123。
使用方式(实用工作流)
- 工作流 1:PR 前清理特性分支。在特性分支上执行
git rebase -i main,通过交互式变基合并“fix typo”类提交、重写提交信息、按逻辑重排提交、丢弃不必要的提交,最后git push --force-with-lease origin feature/user-auth(若无人使用该分支则安全)。 - 工作流 2:将热修复应用到多个发布版本。在 main 上创建修复提交后,分别检出新发布分支并
git cherry-pick abc123;如遇冲突可git cherry-pick --continue或git cherry-pick --abort。 - 工作流 3:查找缺陷引入点。使用 bisect 标记 bad/good,反复运行测试(如
npm test)并标记结果,直到定位缺陷;也可用git bisect run npm test自动化。 - 工作流 4:多分支开发。在主项目目录创建紧急修复工作树,在独立目录中修改、提交并推送,返回主工作区后
git fetch origin并git cherry-pick hotfix/critical-bug,完成后移除工作树。 - 工作流 5:从错误中恢复。误用
git reset --hard HEAD~5后,通过git reflog找到丢失提交的哈希,再git reset --hard def456或用git branch recovery def456从丢失提交创建分支。
高级技巧与最佳实践
- 变基与合并策略:变基适合推送前清理本地提交、保持特性分支与 main 同步、创建便于评审的线性历史;合并适合将已完成特性集成到 main、保留协作的精确历史、以及他人使用的公共分支。变基更新特性分支示例:
git checkout feature/my-feature、git fetch origin、git rebase origin/main,冲突时修复后git add .并git rebase --continue,或改用git merge origin/main。 - Autosquash 工作流:提交后用
git commit --fixup HEAD或git commit --fixup abc123标记修正,再执行git rebase -i --autosquash main,Git 会自动标记 fixup 提交。 - 拆分提交:用
git rebase -i HEAD~3将目标提交标记为 edit,git reset HEAD^后按逻辑分块git add与git commit,再git rebase --continue。 - 部分拣选:
git show --name-only abc123查看提交中的文件,git checkout abc123 -- path/to/file1.py path/to/file2.py检出特定文件,再提交。 - 最佳实践:始终使用
--force-with-lease(比--force更安全,避免覆盖他人工作);只变基本地提交,不变基已推送共享的提交;使用描述性提交信息;保持原子提交;强制推送前先测试;记住 reflog 是 90 天的安全网;高风险操作前创建备份分支(如git branch backup-branch)。
适用场景与限制
适用场景包括:合并前清理提交历史、跨分支应用特定提交、查找引入缺陷的提交、同时处理多个功能、从 Git 错误或丢失提交中恢复、管理复杂分支工作流、准备干净的 PR、同步已分叉分支。限制与常见陷阱:变基公共分支会给协作者带来历史冲突;不带 lease 的强制推送可能覆盖队友工作;变基中解决冲突需谨慎并在变基后测试;忘记清理工作树会占用磁盘空间;实验前未备份分支有风险;在脏工作目录上执行 bisect 需先提交或暂存。恢复命令包括 git rebase --abort、git merge --abort、git cherry-pick --abort、git bisect reset、git restore --source=abc123 path/to/file、git reset --soft HEAD^、git reset --hard HEAD^ 以及通过 reflog 在 90 天内恢复已删除分支。
配套资源
技能内含参考与资源文件:references/git-rebase-guide.md(交互式变基深入指南)、references/git-conflict-resolution.md(高级冲突解决策略)、references/git-history-rewriting.md(安全重写 Git 历史)、assets/git-workflow-checklist.md(PR 前清理清单)、assets/git-aliases.md(高级工作流实用 Git 别名)、scripts/git-clean-branches.sh(清理已合并与废弃分支)。