name: git-advanced-workflows description: 掌握高级Git工作流包括重置、拣选、二分查找、工作树和引用日志,以维护干净的历史记录并从任何情况中恢复。当管理复杂的Git历史、在功能分支上协作或解决仓库问题时使用。
Git 高级工作流
掌握高级Git技术以维护干净的历史记录、有效协作并自信地从任何情况中恢复。
何时使用此技能
- 在合并前清理提交历史
- 在分支之间应用特定提交
- 查找引入错误的提交
- 同时处理多个功能
- 从Git错误或丢失提交中恢复
- 管理复杂的分支工作流
- 为审查准备干净的PR
- 同步分叉的分支
核心概念
1. 交互式重置
交互式重置是Git历史编辑的瑞士军刀。
常见操作:
pick: 保持提交原样reword: 更改提交消息edit: 修改提交内容squash: 与前一提交合并fixup: 类似squash但丢弃消息drop: 完全移除提交
基本用法:
# 重置最后5个提交
git rebase -i HEAD~5
# 重置当前分支上的所有提交
git rebase -i $(git merge-base HEAD main)
# 重置到特定提交
git rebase -i abc123
2. 拣选
从一个分支应用特定提交到另一个分支,无需合并整个分支。
# 拣选单个提交
git cherry-pick abc123
# 拣选一系列提交(起始点排除)
git cherry-pick abc123..def456
# 拣选但不提交(仅暂存更改)
git cherry-pick -n abc123
# 拣选并编辑提交消息
git cherry-pick -e abc123
3. Git 二分查找
通过提交历史进行二分查找,找到引入错误的提交。
# 开始二分查找
git bisect start
# 标记当前提交为坏
git bisect bad
# 标记已知好提交
git bisect good v1.0.0
# Git将检出中间提交 - 测试它
# 然后标记为好或坏
git bisect good # 或: git bisect bad
# 继续直到找到错误
# 完成后
git bisect reset
自动二分查找:
# 使用脚本自动测试
git bisect start HEAD v1.0.0
git bisect run ./test.sh
# test.sh应退出0为好,1-127(除125外)为坏
4. 工作树
同时处理多个分支,无需存储或切换。
# 列出现有工作树
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. 引用日志
您的安全网 - 跟踪所有引用移动,包括删除的提交。
# 查看引用日志
git reflog
# 查看特定分支的引用日志
git reflog show feature/branch
# 恢复删除的提交
git reflog
# 查找提交哈希
git checkout abc123
git branch recovered-branch
# 恢复删除的分支
git reflog
git branch deleted-branch abc123
实际工作流
工作流1: PR前清理功能分支
# 从功能分支开始
git checkout feature/user-auth
# 交互式重置以清理历史
git rebase -i main
# 示例重置操作:
# - 压缩“修复拼写错误”提交
# - 重新措辞提交消息以提高清晰度
# - 逻辑上重新排序提交
# - 丢弃不必要的提交
# 强制推送清理后的分支(如果其他人未使用则安全)
git push --force-with-lease origin feature/user-auth
工作流2: 将热修复应用于多个发布分支
# 在主分支上创建修复
git checkout main
git commit -m “修复: 关键安全补丁”
# 应用到发布分支
git checkout release/2.0
git cherry-pick abc123
git checkout release/1.9
git cherry-pick abc123
# 如果出现冲突则处理
git cherry-pick --continue
# 或
git cherry-pick --abort
工作流3: 查找错误引入点
# 开始二分查找
git bisect start
git bisect bad HEAD
git bisect good v2.1.0
# Git检出中间提交 - 运行测试
npm test
# 如果测试失败
git bisect bad
# 如果测试通过
git bisect good
# Git将自动检出下一个要测试的提交
# 重复直到找到错误
# 自动版本
git bisect start HEAD v2.1.0
git bisect run npm test
工作流4: 多分支开发
# 主项目目录
cd ~/projects/myapp
# 为紧急错误修复创建工作树
git worktree add ../myapp-hotfix hotfix/critical-bug
# 在单独目录中处理热修复
cd ../myapp-hotfix
# 进行更改,提交
git commit -m “修复: 解决关键错误”
git push origin hotfix/critical-bug
# 返回到主工作而不中断
cd ~/projects/myapp
git fetch origin
git cherry-pick hotfix/critical-bug
# 完成后清理
git worktree remove ../myapp-hotfix
工作流5: 从错误中恢复
# 意外重置到错误提交
git reset --hard HEAD~5 # 哦不!
# 使用引用日志查找丢失的提交
git reflog
# 输出显示:
# abc123 HEAD@{0}: reset: moving to HEAD~5
# def456 HEAD@{1}: commit: 我的重要更改
# 恢复丢失的提交
git reset --hard def456
# 或从丢失提交创建分支
git branch recovery def456
高级技巧
重置 vs 合并策略
何时重置:
- 推送前清理本地提交
- 保持功能分支与主分支同步
- 为更容易审查创建线性历史
何时合并:
- 将完成功能集成到主分支
- 保留协作的精确历史
- 其他人使用的公共分支
# 更新功能分支与主分支更改(重置)
git checkout feature/my-feature
git fetch origin
git rebase origin/main
# 处理冲突
git status
# 修复文件中的冲突
git add .
git rebase --continue
# 或改为合并
git merge origin/main
自动压缩工作流
在重置期间自动压缩修正提交。
# 进行初始提交
git commit -m “功能: 添加用户认证”
# 之后,在该提交中修复某些内容
# 暂存更改
git commit --fixup HEAD # 或指定提交哈希
# 进行更多更改
git commit --fixup abc123
# 用自动压缩重置
git rebase -i --autosquash main
# Git自动标记修正提交
拆分提交
将一个提交拆分为多个逻辑提交。
# 开始交互式重置
git rebase -i HEAD~3
# 用'edit'标记要拆分的提交
# Git将在该提交处停止
# 重置提交但保留更改
git reset HEAD^
# 按逻辑块暂存和提交
git add file1.py
git commit -m “功能: 添加验证”
git add file2.py
git commit -m “功能: 添加错误处理”
# 继续重置
git rebase --continue
部分拣选
仅从提交中拣选特定文件。
# 显示提交中的文件
git show --name-only abc123
# 从提交检出特定文件
git checkout abc123 -- path/to/file1.py path/to/file2.py
# 暂存和提交
git commit -m “拣选: 从abc123应用特定更改”
最佳实践
- 始终使用 --force-with-lease: 比 --force 更安全,防止覆盖他人工作
- 仅重置本地提交: 不要重置已推送和共享的提交
- 描述性提交消息: 未来的您会感谢现在的您
- 原子提交: 每个提交应为单个逻辑更改
- 强制推送前测试: 确保历史重写未破坏任何内容
- 保持引用日志意识: 记住引用日志是您90天的安全网
- 在风险操作前分支: 在复杂重置前创建备份分支
# 安全强制推送
git push --force-with-lease origin feature/branch
# 在风险操作前创建备份
git branch backup-branch
git rebase -i main
# 如果出现问题
git reset --hard backup-branch
常见陷阱
- 重置公共分支: 导致协作者历史冲突
- 无租约强制推送: 可能覆盖队友工作
- 在重置中丢失工作: 仔细解决冲突,重置后测试
- 忘记工作树清理: 孤立工作树消耗磁盘空间
- 实验前不备份: 始终创建安全分支
- 在脏工作目录上二分查找: 二分查找前提交或存储
恢复命令
# 中止进行中的操作
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^
# 恢复删除的分支(90天内)
git reflog
git branch recovered-branch abc123
资源
- 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: 清理已合并和过时分支