名称: git-advanced 描述: 高级Git操作包括rebase、bisect、cherry-pick和冲突解决。当rebase分支、使用bisect调试、cherry-pick提交或解决复杂合并冲突时使用。
Git高级技能
目的
为高级Git操作提供指导,包括安全考虑。本项目使用rebase-first工作流和线性历史—理解这些模式以避免破坏代码库。
当此技能适用
在以下情况调用此技能:
- 将特性分支rebase到dev
- 使用git bisect查找错误
- 在分支之间cherry-pick提交
- 解决复杂合并冲突
- 从Git错误中恢复
停止线条件
禁止操作
# 禁止:强制推送到受保护分支
git push --force origin dev # ❌ 从不
git push --force origin master # ❌ 从不
# 禁止:在dev分支上合并提交
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/dev # ✅ 压缩/清理本地提交
# 安全:冲突解决后的强制推送
git rebase origin/dev && git push --force-with-lease origin {{TICKET_PREFIX}}-XXX-feature
Rebase工作流(标准)
创建PR前
# 1. 获取最新更改
git fetch origin dev
# 2. Rebase到最新dev
git rebase origin/dev
# 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 dev
git rebase origin/dev
# 3. 推送更新
git push --force-with-lease origin {{TICKET_PREFIX}}-XXX-feature
Git Bisect(查找错误)
何时使用
当您知道错误在某个点引入但不知道是哪个提交时使用bisect。
Bisect工作流
# 1. 开始bisect
git bisect start
# 2. 标记当前状态(有错误)
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
冲突解决
常见冲突场景
| 场景 | 解决策略 |
|---|---|
| 同一行编辑 | 选择一个版本或组合 |
| 文件删除与修改 | 决定:保留修改或删除 |
| 重命名冲突 | 决定使用哪个名称 |
| 二进制文件冲突 | 明确选择一个版本 |
冲突解决步骤
# 1. 查看冲突内容
git status
# 2. 打开冲突文件,查找标记
<<<<<<< HEAD
您的更改
=======
他们的更改
>>>>>>> branch-name
# 3. 编辑文件以解决(移除标记,保留正确代码)
# 4. 标记为已解决
git add <resolved-file>
# 5. 继续rebase/合并
git rebase --continue
# 或
git merge --continue
冲突预防
# 频繁rebase以避免大冲突
git fetch origin dev
git rebase origin/dev # 在长特性期间每天进行
# 在rebase前检查潜在冲突
git diff origin/dev...HEAD --stat
恢复命令
中止操作
# 中止rebase
git rebase --abort
# 中止合并
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通过 - [ ] 在正确分支上(不是dev或master)
- [ ] 提交有适当的消息格式
- [ ] 提交中没有敏感数据
相关资源
- CONTRIBUTING.md: 分支命名和提交格式
- safe-workflow skill: 完整工作流模式
- release-patterns skill: PR和合并模式