遴选(Cherry-pick)
本教程共 26 篇 · 第 18 篇 · 更新于 2026-07-29 · 约 6 分钟阅读
18. 遴选(Cherry-pick)
本节目标:理解 cherry-pick 是”复制”提交而非”移动”提交,能把某个分支的改动原样搬到当前分支,处理冲突并批量操作。
merge 把整个分支合进来,rebase"挪"整条线。cherry-pick 更精细:只挑一个或几个提交,像从树上摘樱桃一样。
cherry-pick 一句话定义
把指定提交的改动”复制”到当前分支,生成一个内容相同但 SHA-1 不同的新提交。
原提交不受影响,它还在原来的地方。
基本用法
git cherry-pick a1b2c3d
Git 会:
- 找到
a1b2c3d这个提交的改动内容。 - 在当前分支应用这些改动。
- 生成一个新的提交(提交信息沿用原来的)。
[main d4e5f6g] 修复登录失败提示
1 file changed, 2 insertions(+), 1 deletion(-)
为什么需要 cherry-pick
典型场景:你在 main 分支修了个 bug,发现 develop 分支也有同样的 bug。
不想把整个 main 合进 develop(可能还有其它不需要的改动),只想要那个 bug 修复。
git switch develop
git cherry-pick a1b2c3d
搞定。
批量 cherry-pick
一次挑多个提交:
cherry-pick a1b2c3d d4e5f6g h7i8j9k
按顺序逐个应用。
挑一个范围(不包含起点):
cherry-pick a1b2c3d..h7i8j9k
包含起点:
cherry-pick a1b2c3d^..h7i8j9k
cherry-pick 遇到冲突
如果目标分支已经改了同一个文件的同一行,就会冲突。
git cherry-pick a1b2c3d
error: could not apply a1b2c3d... 修复登录失败提示
hint: after resolving the conflicts, mark the correct paths
hint: with 'git add <paths>' or 'git rm <paths>'
hint: and run 'git cherry-pick --continue'
处理方式和 rebase 冲突一样:
- 打开冲突文件,解决冲突。
- 标记为已解决。
git add app.py
- 继续。
git cherry-pick --continue
其它选项:
git cherry-pick --skip # 跳过这个提交
git cherry-pick --abort # 放弃整个 cherry-pick
不自动提交
默认 cherry-pick 会自动提交。加 -n(或 --no-commit)只把改动放进暂存区,不提交:
git cherry-pick -n a1b2c3d
适用场景:想把几个 cherry-pick 合并成一个提交,或者想再改改再提交。
cherry-pick 和 merge 的区别
| 维度 | cherry-pick | merge |
|---|---|---|
| 范围 | 选指定提交 | 合并整个分支 |
| 结果 | 生成新提交 | 可能生成合并提交 |
| 历史 | 不保留原分支关系 | 保留分支拓扑 |
| 适用 | 挑一两个 hotfix | 合并完整功能 |
cherry-pick 后的提交和原提交没有关联。原分支上再 merge 回来,Git 会认为它们是两个不同的提交。
cherry-pick 的典型场景
1. 把 hotfix 同步到多个分支
# 在 main 修了 bug
git switch main
git commit -m "修复支付金额计算错误"
# 同步到 develop
git switch develop
git cherry-pick a1b2c3d
# 同步到 release
git switch release
git cherry-pick a1b2c3d
2. 从废弃分支抢救代码
某个功能分支不打算合了,但其中一两个提交还有价值。
git cherry-pick a1b2c3d
3. 反向移植旧版本修复
新版修了 bug,旧版也得修。cherry-pick 到旧版维护分支。
一个完整的 hotfix 流程
- 从 main 创建 hotfix 分支。
git switch main
git switch -b hotfix-payment
- 修复 bug,提交。
git add .
git commit -m "修复支付金额计算错误"
记录这次提交的 hash:a1b2c3d。
- 把 hotfix 合回 main。
git switch main
git merge hotfix-payment
git push origin main
- 同步到 develop。
git switch develop
git cherry-pick a1b2c3d
git push origin develop
- 删除 hotfix 分支。
git branch -d hotfix-payment
cherry-pick 的注意事项
- cherry-pick 后的提交 SHA-1 和原来不同。Git 认为这是两个提交。
- 同一提交被 cherry-pick 两次不会重复(Git 会提示已经存在)。
- cherry-pick 不会复制原提交的签名(GPG)。
- 大量 cherry-pick 会让历史变得零散。能用 merge 的场景优先考虑 merge。
本章小卡片
| 命令 | 作用 |
|---|---|
git cherry-pick <commit> | 把指定提交复制到当前分支 |
git cherry-pick <c1> <c2> | 批量遴选多个提交 |
git cherry-pick <c1>..<c2> | 遴选一个范围(不含 c1) |
git cherry-pick -n <commit> | 不自动提交,只暂存改动 |
git cherry-pick --continue | 解决冲突后继续 |
git cherry-pick --skip | 跳过当前提交 |
git cherry-pick --abort | 放弃整个 cherry-pick |
Notecherry-pick 是”复制”,不是”移动”。原提交还在原分支上。如果你其实想”挪”整条分支,用 rebase 更合适。