如何 cherry-pick 多个提交
cherry-pick 多个提交:连续的用范围 git cherry-pick A^..B(含 A)或 A..B(不含 A);不连续的逐个列出 git cherry-pick A B C。冲突时解决后 git cherry-pick --continue。
连续一段提交用范围:git cherry-pick <起点>^..<终点>(含起点;写 起点..终点 则不含起点)。不连续的提交直接列哈希:git cherry-pick A B C,按列出顺序逐个应用。
连续范围
# 把 feature 分支上最近 3 个提交搬到当前分支
git cherry-pick feature-x~3..feature-x
# 明确范围(包含起点提交本身要用 ^)
git cherry-pick a1b2c3d^..e4f5g6h
不连续提交
git cherry-pick a1b2c3d f7g8h9i
按顺序应用,中间任何一个冲突都会暂停。
冲突处理
# 解决冲突文件后
git add <冲突文件>
git cherry-pick --continue
# 放弃整个序列
git cherry-pick --abort
# 跳过当前这个
git cherry-pick --skip
实用选项
-n(--no-commit):只应用改动不提交,多个提交攒成一个;-x:提交信息里追加来源提交哈希,便于追溯((cherry picked from ...));-e:应用时编辑提交信息。
常见问题(FAQ)
Q:cherry-pick 和 merge 怎么选?
merge 带走整个分支的全部历史;cherry-pick 只摘指定提交(会产生新哈希)。热修复回合到旧版本分支、只要某几个提交时用 cherry-pick;完整合并特性用 merge。
Q:同一个提交 cherry-pick 两次会怎样?
会产生内容重复的两个提交;之后两分支合并时可能报"重复改动"冲突。尽量避免,或在提交信息里注明来源(-x)方便排查。
Q:merge 提交能 cherry-pick 吗?
可以但要指定主线:-m 1(以第一个父提交为基准)。一般不建议摘 merge 提交,改摘其内部的具体提交更清晰。