首页/开发/Git 与协作速查/cherry-pick 拣选一段提交
合并变基与冲突71 条

cherry-pick 拣选一段提交

支持单个提交列表、A..B 区间与 A^..B 写法;按顺序逐个应用,任何一步冲突都会暂停等待处理。

Git 与协作速查开发更新于 2026-10-13

拣选区间的本质

cherry-pick 是把某个提交(或一段区间内的提交)的改动复制到当前分支,生成内容相同、哈希不同的新提交。它不改动源分支、也不移动分支指针,属于「按提交搬运改动」,而不是「合并分支」。区间写法只是省去逐个抄哈希的麻烦,本质仍是逐个提交顺序应用。

基本信息

适用平台Git 2.x(Linux / macOS / Windows 行为一致)
基本语法git cherry-pick <提交或范围>
执行前提当前工作区干净,处于目标分支
中断处理冲突时 --continue / --skip / --abort
源分支影响不修改源分支历史

典型使用场景

  • 把主干上的紧急修复搬到发布分支,避免整分支合并带入未验证的改动
  • 从同事的特性分支只挑一个已完成的提交,复用工作成果
  • 给维护分支(如 1.x)批量拣选散落在多处的零散修复
  • 配合 -n 只把改动落到工作区不自动提交,便于人工拆分或调整
  • 把区间内的历史提交搬到新分叉点,做本地验证或重新编排顺序

常用示例

常用示例
git cherry-pick 3f6a2b1         # 拣选单个提交
git cherry-pick 3f6a2b1 9d8c7b6  # 按列出的顺序逐个应用多个提交
git cherry-pick v1.2.0..v1.2.3  # 区间:不含起点 v1.2.0,含终点 v1.2.3
git cherry-pick v1.2.0^..v1.2.3 # 用 A^ 让起点提交也进入
git cherry-pick -n 3f6a2b1      # 只应用改动到工作区,不自动生成提交
git cherry-pick --continue      # 解决冲突后继续应用剩余提交
git cherry-pick --abort         # 放弃整段拣选,回到开始前状态

范围写法读法

写法含义注意事项
<sha>单个提交最常用,一次只搬一个
A..BA 之后直到 B(不含 A)按提交时间顺序逐个应用
A^..B包含起点 A 直到 B等价 A~1..B,漏掉 ^ 会少搬一个
A...B两侧的差异集合拣选场景少用,容易一次带入过多提交
--no-commit只落改动,不自动提交多个提交会叠加成同一批改动
区间拣选严格按提交时间顺序应用,任何一步冲突都会暂停:此时仓库处于拣选进行中状态,git status 会列出剩余提交,用 --continue 继续、--skip 跳过当前提交、--abort 整体放弃。
拣选完成后发现选错分支:改动尚未推送时用 git reset --hard 回到原有提交;已经推送的公共分支不要改写历史,改用 git revert 生成反向提交。拣选合并提交时语法不同,需用 -m 指定以哪个父提交为主线,直接拣选会报错。

易错点

  • A..B 不包含起点提交,想让起点也进来必须写 A^..B;漏写会静默少搬一个提交,往往到合并时才发现
  • 拣选依赖链上的多个提交时跳过中间提交会导致连续冲突,按原顺序拣选更稳
  • cherry-pick 生成新哈希,同一改动在两个分支各留一份提交,后续交叉合并会在历史里出现重复记录
  • 工作区存在未提交改动时开始拣选会被拒绝,先提交或 git stash 再操作
  • 直接拣选合并提交会报错,需加 -m 指定主线父提交,否则报错或得到空提交

数据来源与参考

  • Git 官方文档:git-cherry-pick(<subtree>、A..B)
  • Git 官方文档:gitrevisions(范围语法)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌