name: git-advanced description: 高级Git操作,包括rebase、bisect、cherry-pick和冲突解决。用于在rebase分支、使用bisect调试、cherry-pick提交或解决复杂合并冲突时。
Git 高级技能
目的
提供高级Git操作的指导,并考虑安全性。本项目使用rebase优先工作流,具有线性历史记录——理解这些模式以避免破坏代码库。
此技能适用场景
- 将功能分支rebase到主分支
- 使用git bisect查找bug
- 在分支之间cherry-pick提交
- 解决复杂合并冲突
- 从Git错误中恢复
停止条件
禁止的操作
# 禁止:强制推送到受保护分支
git push --force origin main # 绝不
git push --force origin master # 绝不
# 禁止:在主分支上合并提交
git merge feature-branch # 使用rebase-and-merge PR策略
# 禁止:跳过预提交钩子
git commit --no-verify # 钩子存在是有原因的
# 禁止:重写共享历史
git rebase -i HEAD~5 && git push --force # 如果已经推送
安全操作
# 安全:在你的功能分支上使用force-with-lease
git push --force-with-lease origin {{TICKET_PREFIX}}-XXX-feature # 安全
# 安全:首次推送前的交互式rebase
git rebase -i origin/main # 压缩/清理本地提交
# 安全:冲突解决后的强制推送
git rebase origin/main && git push --force-with-lease origin {{TICKET_PREFIX}}-XXX-feature
Rebase 工作流(标准)
创建PR前
# 1. 获取最新更改
git fetch origin main
# 2. 重基于最新主分支
git rebase origin/main
# 3. 如有冲突,解决它们
git status # 查看冲突文件
# ... 编辑文件以解决 ...
git add <resolved-files>
git rebase --continue
# 4. 使用force-with-lease推送
git push --force-with-lease origin {{TICKET_PREFIX}}-XXX-feature
PR审查期间(反馈后)
# 1. 进行请求的更改
git add . && git commit -m "fix: 处理PR反馈 [{{TICKET_PREFIX}}-XXX]"
# 2. 再次获取并rebase
git fetch origin main
git rebase origin/main
# 3. 推送更新
git push --force-with-lease origin {{TICKET_PREFIX}}-XXX-feature
Git Bisect(查找Bug)
何时使用
当你知道bug在某个点被引入但不知道是哪个提交时,使用bisect。
Bisect 工作流
# 1. 开始bisect
git bisect start
# 2. 标记当前状态(有bug)
git bisect bad
# 3. 标记一个已知的好提交
git bisect good <commit-sha>
# 例如,git bisect good abc1234
# 4. Git检出中间提交 - 测试它
yarn test:unit # 或手动测试
# 5. 告诉Git这个提交是好还是坏
git bisect good # 或
git bisect bad
# 6. 重复直到找到
# Git会告诉你第一个坏提交
# 7. 结束bisect
git bisect reset
自动化 Bisect
# 自动运行测试脚本
git bisect start HEAD abc1234
git bisect run yarn test:specific-test
Cherry-Pick(选择性提交)
何时使用
- 将修复向后移植到旧分支
- 从一个分支拉取特定提交到另一个分支
- 选择性特征提取
Cherry-Pick 工作流
# 1. 找到提交SHA
git log --oneline branch-name | head -20
# 2. 将cherry-pick到当前分支
git cherry-pick <commit-sha>
# 3. 如有冲突,解决它们
git status
# ... 解决冲突 ...
git add <resolved-files>
git cherry-pick --continue
# 4. 推送结果
git push origin current-branch
Cherry-Pick 多个提交
# 提交范围(最旧..最新,不包括最旧)
git cherry-pick abc123^..def456
# 特定提交
git cherry-pick abc123 def456 ghi789
冲突解决
常见冲突场景
| 场景 | 解决策略 |
|---|---|
| 同一行被编辑 | 选择一个版本或合并 |
| 文件被删除 vs 修改 | 决定:保留修改或删除 |
| 重命名冲突 | 决定使用哪个名称 |
| 二进制文件冲突 | 明确选择一个版本 |
冲突解决步骤
# 1. 查看冲突内容
git status
# 2. 打开冲突文件,查找标记
<<<<<<< HEAD
你的更改
=======
他们的更改
>>>>>>> branch-name
# 3. 编辑文件以解决(移除标记,保留正确代码)
# 4. 标记为已解决
git add <resolved-file>
# 5. 继续rebase/merge
git rebase --continue
# 或
git merge --continue
冲突预防
# 频繁rebase以避免大冲突
git fetch origin main
git rebase origin/main # 在长特性开发期间每天执行
# 在rebase前检查潜在冲突
git diff origin/main...HEAD --stat
恢复命令
中止操作
# 中止rebase
git rebase --abort
# 中止merge
git merge --abort
# 中止cherry-pick
git cherry-pick --abort
撤销最后提交
# 保留更改暂存
git reset --soft HEAD~1
# 保留更改未暂存
git reset HEAD~1
# 丢弃更改(危险)
git reset --hard HEAD~1
恢复丢失的提交
# 在reflog中查找丢失的提交
git reflog
# 恢复到特定状态
git reset --hard HEAD@{n}
# Cherry-pick一个丢失的提交
git cherry-pick <sha-from-reflog>
安全指南
何时在强制推送前询问
总是先询问如果:
- 你已经推送了其他人可能已经拉取的提交
- 你正在处理共享分支
- 你不100%确定会发生什么
- 分支已开放超过1周
安全强制推送模式
# 1. 验证你在正确的分支上
git branch
# 2. 验证将要推送的内容
git log origin/{{TICKET_PREFIX}}-XXX-feature..HEAD --oneline
# 3. 使用force-with-lease(防止覆盖他人的工作)
git push --force-with-lease origin {{TICKET_PREFIX}}-XXX-feature
推送前检查清单
- [ ] 运行
yarn ci:validate通过 - [ ] 在正确的分支上(非主分支)
- [ ] 提交有正确的消息格式
- [ ] 提交中无敏感数据
参考
- CONTRIBUTING.md:分支命名和提交格式
- safe-workflow skill:完整的工作流模式
- release-patterns skill:PR和合并模式