Git Cherry-pick 移植提交
主线修了个 bug,需要同步到维护分支;或者某个功能分支上只有一条提交值得要。这类"只搬一部分提交"的需求,cherry-pick 就是标准答案。
一、基本用法
git switch release-1.x
git cherry-pick 9c8d7e6
它会取出那个提交的 diff,在当前分支重放一次,生成一个新的 commit(新 hash)。
二、批量挑
git cherry-pick A..B # 从 A 之后到 B(不含 A)
git cherry-pick A^..B # 含 A
git cherry-pick A B C # 任意几条
顺序按你写的顺序来,不是按时间。
三、冲突处理
冲突后 Git 会停下来:
# 手工解决冲突标记后
git add .
git cherry-pick --continue
git cherry-pick --abort # 整个放弃,回到操作前
git cherry-pick --skip # 跳过这条,继续下一条
批量 cherry-pick 中途冲突,--abort 会把已完成的也一起回滚。
四、保留原作者
默认 pick 出来的提交,作者还是原提交的作者,committer 变成你。想显式带上:
git cherry-pick -x 9c8d7e6 # 在 message 里追加 "(cherry picked from commit ...)"
-x 在长期维护分支上很有用——以后查某行代码是从哪来的,一眼能追到主线提交。
五、只搬不提交
git cherry-pick -n 9c8d7e6 # 改动进暂存区,不生成 commit
适合把几条提交拼成一个再提交。
六、和 merge / rebase 怎么选
| 需求 | 用什么 |
|---|---|
| 整条分支的工作都要 | merge 或 rebase |
| 只要其中几条提交 | cherry-pick |
| 提交之间互相依赖 | 别用 cherry-pick,改 merge / rebase |
| 主线 → 维护分支的热修复 | cherry-pick -x |
七、坑点清单
- 新 hash 不同,同步一次之后两边历史就不一样了,下次别再整分支 merge 过来,否则重复提交
- 依赖链条断裂:单独 pick 中间一条,很可能因为缺少前一条的改动而冲突
- merge commit 不能直接 pick,要加
-m 1指定主线父提交 - 空提交:改动已经在当前分支存在,pick 会因无内容而失败(加
--allow-empty可放行)
八、典型工作流
git log --oneline main | head -20 # 在主线找要搬的提交
git switch release-1.x
git cherry-pick -x a1b2c3 d4e5f6 # 搬两条修复
git push
搬完回头在主线提交上留个评论或标签(git notes add 之类),说明已同步到维护分支,是很省事的好习惯。