git cherry-pick 挑取其他分支的某个提交
只想把某个分支的某一个提交"摘"到当前分支,而不想合并整个分支?git cherry-pick 精准复制单个提交。本文讲清用法、多提交、冲突处理与场景。
场景:有个 bug 修复提交在 develop 分支上,但你正在 release 分支,只想把这个修复"搬"过来,却不想把整个 develop 合过来。这正是 git cherry-pick 的用途。
核心:精准复制单个提交
git cherry-pick 提交哈希
它会把该提交的改动应用到当前分支,并生成一个新的提交。原分支的提交不受影响。
基本用法
# 切换到要接收提交的分支
git switch release
# 摘取 develop 上的某个提交(哈希)
git cherry-pick abc1234
执行后 release 分支多了一个内容相同、但哈希不同的提交。
摘取多个提交
# 指定多个
git cherry-pick abc1234 def5678
# 摘取一个连续区间(从旧到新)
git cherry-pick 旧哈希^..新哈希 # 注意含两端
git cherry-pick 旧哈希..新哈希 # 不含旧哈希
典型应用场景
- 把 hotfix 修复从 develop 快速搬到 release/main
- 把某个功能的部分提交挑到另一个分支
- 从别的分支找回某个被遗漏的提交
遇冲突怎么处理
# 提示冲突
git status # 看冲突文件
# 手动解决后:
git add 冲突文件
git cherry-pick --continue # 继续完成
# 想放弃整次 cherry-pick
git cherry-pick --abort
完整实战
# 场景:把 develop 上的一个紧急修复搬到 release
git switch release # 切到 release
git log develop --oneline -5 # 在 develop 找到那个修复的哈希
# 例如 9f8e7d6 fix: 修复支付回调空指针
git cherry-pick 9f8e7d6 # 摘取它
git push # 推送
注意事项
- 新提交哈希与源不同,但内容一致,不会重复冲突。
- 若源提交也曾在当前分支应用过,可能提示"empty"(改动已存在),用
--skip跳过。 - cherry-pick 是复制非移动,别担心源分支丢失。
一句话速记
git cherry-pick 哈希 把指定提交的改动复制到当前分支,精准选择、不合并整个分支。
?
常见问题 FAQ
cherry-pick 和 merge 有什么区别?
merge 合并的是"整个分支"的差异;cherry-pick 只把"某一个(或几个)提交"的改动复制到当前分支,精准选择、不影响其他提交。
cherry-pick 会复制提交历史还是新建?
会新建一个提交。虽然是复制的改动内容,但新提交有新的哈希和新的父提交,等于"在当前分支重放了这个改动"。
把一个 commit 从分支 A 挑到分支 B,A 里的还在吗?
还在。cherry-pick 是"复制"不是"移动",原分支的提交不受影响,两个分支各自保留该改动。
挑了多个提交遇到冲突怎么办?
cherry-pick 默认是"一个提交挑完生成一个提交"。若中途冲突,解决后 git cherry-pick --continue 继续;想放弃用 git cherry-pick --abort。