Git Cherry-pick 指定提交同步指南
适用场景
当某些提交已经合入 dev,但暂时不能整体合并 dev 到 test 时,可以使用 cherry-pick 将指定提交同步到基于 test 创建的新业务分支。
本指南以将 dev 上两个提交同步到 test 新分支为例:
d9b91c6c6bc77bcbe44291b9e158568f1503f0c71b39242ede61a822d89e0ece4a9b26f45eeecce4
处理原则
- 不改动
dev原提交。 - 不直接在
test上提交。 - 基于
test新建业务分支。 - 使用
cherry-pick精准同步指定提交。 - 操作前后检查分支、提交链、工作区状态。
- 最后运行现有测试,或说明无法通过的原因。
Cherry-pick 流程图
查看图表代码
操作步骤
1. 确认当前状态
bash
git status --short --branch确认工作区干净,避免切分支或 cherry-pick 时带入未提交改动。
2. 确认提交存在
bash
git show --stat --oneline d9b91c6c6bc77bcbe44291b9e158568f1503f0c7
git show --stat --oneline 1b39242ede61a822d89e0ece4a9b26f45eeecce4如果提交不存在,需要先确认本地仓库是否已经拉取最新远端分支。
3. 确认目标分支不存在
bash
git branch --list fix_player_conf如果没有输出,说明本地还没有这个分支,可以继续创建。
如果分支已经存在,不要直接覆盖,应先确认这个分支是否已有其他用途。
4. 确认 test 是否已经包含提交
bash
git branch --all --contains d9b91c6c6bc77bcbe44291b9e158568f1503f0c7
git branch --all --contains 1b39242ede61a822d89e0ece4a9b26f45eeecce4如果 test 不在结果中,说明仍需要同步这些提交。
5. 基于 test 创建新分支
bash
git checkout test
git checkout -b fix_player_conf这样可以保证后续提交都落在业务分支上,不污染 test。
6. 按顺序 cherry-pick 指定提交
bash
git cherry-pick d9b91c6c6bc77bcbe44291b9e158568f1503f0c7
git cherry-pick 1b39242ede61a822d89e0ece4a9b26f45eeecce4如果两个提交存在依赖关系,必须按原提交顺序执行,否则可能出现冲突或行为不一致。
7. 校验同步结果
bash
git status --short --branch
git log --oneline --decorate -4
git diff --stat test..fix_player_conf预期结果:
- 当前分支是
fix_player_conf。 - 工作区干净。
fix_player_conf比test多出两个提交。- 变更文件符合本次同步范围。
8. 运行测试
bash
go test ./...如果测试失败,需要区分失败原因:
- 是否由本次
cherry-pick引入。 - 是否是仓库原有测试问题。
- 是否缺少本地配置、Redis、测试文件等环境依赖。
本次实际结果
本次基于 test 创建了新分支:
bash
fix_player_conf同步后生成的新提交为:
bash
156f7917 低余额改配置
e244705d 兼容锦标赛原 dev 上的提交未被修改。
本次验证结果
执行测试命令:
bash
go test ./...测试未通过,失败点主要来自仓库已有测试或本地环境问题,例如:
- 测试依赖的配置文件不存在。
- Redis 未初始化。
- 测试文件缺少 import。
- 测试引用了不存在的方法。
- 部分测试存在空指针 panic。
这类失败需要单独处理,不能直接认定是本次 cherry-pick 引入。
冲突处理
如果 cherry-pick 出现冲突,先查看冲突文件:
bash
git status解决冲突后继续:
bash
git add <冲突文件>
git cherry-pick --continue如果确认不继续本次同步:
bash
git cherry-pick --abort常见风险
| 风险 | 说明 | 建议 |
|---|---|---|
| 顺序错误 | 第二个提交依赖第一个提交时,顺序反了可能冲突或行为异常 | 按原提交顺序执行 |
| 目标分支已存在 | 已有 fix_player_conf 可能包含其他人的工作 | 先确认分支用途 |
| 工作区不干净 | 未提交改动可能影响切分支或同步结果 | 操作前检查 git status |
| 测试失败误判 | 测试失败不一定由本次同步导致 | 结合失败文件和变更文件判断 |
推荐最终检查命令
bash
git status --short --branch
git log --oneline --decorate -5
git diff --stat test..fix_player_conf继续阅读
- Git上手与对象
- Git上手与对象
- Git任务与配置