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