git cherry-pick 命令就像一把精准的"手术刀",允许你将一个或多个**特定的提交(commit)**从任意分支应用到当前分支,而无需合并整个分支的历史。
🎯 核心用法
-
找到目标提交的哈希值 (Commit Hash)
首先,你需要找到想要复制的那个提交的哈希值
1git log source-branch --oneline这会列出源分支的提交历史,例如
a1b2c3d Fix login bug。 -
切换到目标分支
切换到你想要应用这个提交的分支
1git checkout target-branch -
执行 cherry-pick
使用提交的哈希值执行命令
1git cherry-pick a1b2c3d执行成功后,Git 会在当前分支创建一个新的提交,其内容与源提交相同,但拥有全新的哈希值。
📦 批量操作
-
挑选多个不连续的提交
只需将多个提交的哈希值用空格隔开
1git cherry-pick <hash1> <hash2> <hash3> -
挑选一段连续的提交
使用
起始哈希..结束哈希的语法。注意,这个范围默认不包含 起始哈希,但包含结束哈希1git cherry-pick <hash-A>..<hash-B>如果需要包含起始哈希
A,可以使用A^..B的写法。
⚙️ 常用参数
| 参数 | 命令示例 | 说明 |
|---|---|---|
-n / --no-commit |
git cherry-pick -n <hash> |
只将更改应用到工作区和暂存区,不自动创建提交。 |
-e / --edit |
git cherry-pick -e <hash> |
打开编辑器,允许你修改提交信息。 |
-x |
git cherry-pick -x <hash> |
在提交信息末尾追加来源信息,如 (cherry picked from commit <hash>),便于追溯。 |
-m |
git cherry-pick -m 1 <hash> |
当目标提交是一个合并提交时使用,用于指定采用哪个父分支的变更。 |
⚠️ 处理冲突
cherry-pick 本质上是一次合并操作,因此可能会遇到代码冲突。
-
解决冲突:当 Git 提示冲突时,手动编辑冲突文件,保留你需要的代码。
-
标记解决 :解决完所有冲突后,使用
git add <文件名>将文件标记为已解决。 -
继续操作 :
1git cherry-pick --continue -
放弃操作 :如果想中途放弃,可以执行:
1git cherry-pick --abort
🤔 典型应用场景
- 紧急 Bug 修复 :在
develop分支修复了一个严重 Bug,需要立即将这个修复同步到release或main分支,但又不想引入develop分支上其他未完成的开发内容。 - 选择性功能同步 :某个功能分支 (
feature) 中的一个提交非常有用,你只想把这个提交应用到主分支,而不是合并整个功能分支。 - 跨分支应用补丁:将某个分支上的代码改进或补丁,精准地应用到其他多个分支上。