Git高级技能Skill git-advanced

这个技能提供Git版本控制系统的高级操作指导,包括rebase、bisect、cherry-pick和冲突解决,适用于软件开发中的代码管理、分支策略和错误排查,强调安全操作和线性历史记录。关键词:Git, 版本控制, rebase, bisect, cherry-pick, 冲突解决, 软件开发, DevOps, 安全操作。

DevOps 0 次安装 0 次浏览 更新于 3/15/2026

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和合并模式