Git Cherry-Pick 简介

CoderJia 5 2025-11-26

在 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 最适合“临时性”或“特定性”的操作,而不是常规的工作流。