首页 / Git 入门教程 / 遴选(Cherry-pick)

Git 入门教程

遴选(Cherry-pick)

本教程共 26 篇 · 第 18 篇 · 更新于 2026-07-29 · 约 6 分钟阅读

GitGit 入门教程遴选cherry-pick挑选提交hotfix

18. 遴选(Cherry-pick)

本节目标:理解 cherry-pick 是”复制”提交而非”移动”提交,能把某个分支的改动原样搬到当前分支,处理冲突并批量操作。

merge 把整个分支合进来,rebase"挪"整条线。cherry-pick 更精细:只挑一个或几个提交,像从树上摘樱桃一样。

cherry-pick 一句话定义

把指定提交的改动”复制”到当前分支,生成一个内容相同但 SHA-1 不同的新提交。

原提交不受影响,它还在原来的地方。

基本用法

git cherry-pick a1b2c3d

Git 会:

  1. 找到 a1b2c3d 这个提交的改动内容。
  2. 在当前分支应用这些改动。
  3. 生成一个新的提交(提交信息沿用原来的)。
[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 冲突一样:

  1. 打开冲突文件,解决冲突。
  2. 标记为已解决。
git add app.py
  1. 继续。
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-pickmerge
范围选指定提交合并整个分支
结果生成新提交可能生成合并提交
历史不保留原分支关系保留分支拓扑
适用挑一两个 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 流程

  1. 从 main 创建 hotfix 分支。
git switch main
git switch -b hotfix-payment
  1. 修复 bug,提交。
git add .
git commit -m "修复支付金额计算错误"

记录这次提交的 hash:a1b2c3d

  1. 把 hotfix 合回 main。
git switch main
git merge hotfix-payment
git push origin main
  1. 同步到 develop。
git switch develop
git cherry-pick a1b2c3d
git push origin develop
  1. 删除 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
Note

cherry-pick 是”复制”,不是”移动”。原提交还在原分支上。如果你其实想”挪”整条分支,用 rebase 更合适。