在 Git 的日常使用中,merge 和 rebase 是我们最熟悉的两个分支合并指令。但有时候,我们并不想合并整个分支,而只是想把某个特定的提交(Commit)“复制”到当前分支。
这时,git cherry-pick 就登场了。
它是 Git 工具箱里一把精确的手术刀,能够让你跨分支“挑拣”代码,是处理紧急 Bug 修复和代码重组的神器。
1. 什么是 Cherry-Pick?
简单来说,它的作用是 “挑拣”。它允许我们选择任意分支中的一个或多个特定的提交(Commit),并将它们“复制”应用到当前分支上,而不需要合并(Merge)整个分支。
核心概念图解
为了直观地理解,准备了一个流程示意图:

2. 什么时候使用它?(常见场景)
- 紧急修复(Hotfix): 我们在开发分支(dev)修复了一个严重的 Bug,产生了一个提交。需要立刻把这个修复同步到生产分支(master/main),但又不想把 dev 分支上其他还没写完的代码合并过去。
- 提交错分支: 本该在 feature 分支提交代码,结果不小心在 master 分支提交了。可以切回 feature 分支,把那个提交 cherry-pick 过来,然后删掉 master 上的那个提交。
- 提取特定功能: 同事写了一个通用的工具函数在另一个分支,现在就需要在当前分支用,但不想合并他的整个分支。
3. 基本用法
假设现在的分支是 main,我们想把 feature 分支上的某个提交 C3 (对应commit id为 a1b2c3d) 拿过来。
步骤:
1、获取 Commit Hash(哈希值):
先去 feature 分支或者通过 log 找到想复制的那个提交的 ID(Hash)。
git log
# 假设找到的 hash 是 a1b2c3d
2、切换到目标分支:
git checkout main
3、执行 Cherry-pick:
git cherry-pick a1b2c3d
结果: Git 会自动把 a1b2c3d 里的修改内容应用到 main 分支,并生成一个新的 Commit ID。
4. 进阶用法
A. 挑选多个提交
如果想一次性挑选几个不连续的提交:
git cherry-pick commit_id_1 commit_id_2
B. 挑选连续的一段提交
如果想把从 A 到 B 之间的所有提交都拿过来:
git cherry-pick A..B
注意:这不包含 A,包含 B。如果想要包含 A,使用 A^..B。
C. 只把改动拿过来,不生成提交
如果只想把别人的代码改动应用到自己的的工作区(未commit状态),以此作为基础继续开发,而不是直接生成一个 Commit:
git cherry-pick -n <commit_id>
# 或者
git cherry-pick --no-commit <commit_id>
执行后,改动会进入自己的暂存区(Staged),可以继续修改代码,最后自己手动 git commit。
5. 遇到冲突怎么办?
就像合并(Merge)一样,Cherry-pick 也经常遇到代码冲突。当冲突发生时,Git 会暂停操作。
解决步骤:
1、打开冲突文件,手动解决代码冲突(保留需要的代码,删除冲突标记)。
2、添加修改后的文件:
git add <path_to_file>
3、继续 Cherry-pick:
git cherry-pick --continue
如果发现冲突太复杂,不想搞了,可以随时放弃:
git cherry-pick --abort
这会回到操作前的状态。
6. 注意事项
- Commit ID 变了: Cherry-pick 之后的提交,虽然内容和原来的提交一样,但它是一个全新的提交对象,拥有不同的 Hash 值。
- 避免重复合并: 如果后续还要把
feature分支整个 Merge 到main,Git 通常能识别出相同的内容,但如果改动较大,可能会产生混乱。因此,Cherry-pick 最适合“临时性”或“特定性”的操作,而不是常规的工作流。