Git高级操作技能Skill git-advanced

这个技能提供Git版本控制系统的高级操作指导,包括rebase、bisect、cherry-pick和冲突解决等,适用于软件开发团队确保代码库线性历史和安全协作。关键词:Git, 高级操作, 版本控制, 冲突解决, 代码管理, DevOps。

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

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