如何只合并某个特定提交
合并单个提交用 cherry-pick:git cherry-pick <提交哈希>,把该提交的改动以新提交应用到当前分支。多个连续提交用 A^..B 范围,加 -n 只应用不提交。
用 git cherry-pick <提交哈希>:把那个提交的改动精确应用到当前分支,生成一个新提交。merge 是"整个分支全要",cherry-pick 是"只要这一个"。
操作
git checkout main # 切到目标分支
git log feature-x --oneline # 找到要的提交哈希
git cherry-pick a1b2c3d
常用选项
git cherry-pick -n a1b2c3d # 只应用改动不提交(再手动整合提交)
git cherry-pick -x a1b2c3d # 提交信息追加来源哈希,便于追溯
git cherry-pick A^..B # 连续一段提交
冲突处理
# 解决冲突文件后
git add <文件>
git cherry-pick --continue
# 不想搞了
git cherry-pick --abort
注意
- cherry-pick 的是该提交的改动,不是整个文件状态——目标分支上下文不同可能产生冲突;
- 原提交和新提交哈希不同,之后两分支整体合并时同一份改动会再次"相遇",可能报重复冲突;
- 依赖链长的提交(它依赖前面提交的改动)单独摘过来可能编译不过,摘之前评估依赖。
常见问题(FAQ)
Q:和 rebase 有什么区别?
rebase 移动"一串"提交到另一个基点;cherry-pick 复制指定提交。要整个分支搬家用 rebase,挑个别提交用 cherry-pick。
Q:merge 提交能 cherry-pick 吗?
需要 -m 1 指定以哪个父提交为主线。一般不摘 merge 提交,摘它内部真正的功能提交。
Q:跨仓库能 cherry-pick 吗?
可以:把对方仓库加为 remote(git remote add fork <url>),fetch 后直接 cherry-pick 其提交哈希。