git cherry-pick 命令
核心:
git cherry-pick可以挑选指定的某一条或几条提交,把它们的改动复制到当前分支,不会把整个分支合并过来。
和 merge / rebase 不一样:merge 是把一整个分支所有提交合进来;cherry-pick 只挑你想要的个别 commit。

适用场景:
- 别的分支上有一个修复bug的提交,不想合并整个分支,只想把这个补丁拿过来
- 误提交到别的分支,单独摘出来放到目标分支
- 版本之间少量补丁移植
基础语法
# 挑选单个提交,复制到当前分支
git cherry-pick <commit-id>
示例流程:
# 先创建两个分支
git checkout main
echo "main v1" > app.txt
git add app.txt
git commit -m "main: v1"
git checkout -b feature
echo "feature add log" >> app.txt
git add app.txt
git commit -m "feature: add log" # commit A
echo "feature fix bug" >> app.txt
git add app.txt
git commit -m "feature: fix login bug" # commit B(我们想要这个)
git checkout main
# 只把 commit B 这个修复拿到 main 分支
git cherry-pick B的commit哈希
执行后:
- main 分支会新增一条 commit,内容和 commit B 的改动一样,但哈希值不一样(是新提交)
- commit A 不会被带过来
挑选多个提交
# 挑选连续一段:commitA ~ commitB (包含两端)
git cherry-pick commitA..commitB
# 挑选多个不连续提交
git cherry-pick commit1 commit3 commit5
–no-commit 模式(只应用改动,不自动提交)
适合:拿到改动后,自己修改、再合并提交
git cherry-pick --no-commit <commit-id>
# 此时改动已经在暂存区,不会自动commit
# 可以修改文件、继续调整,然后手动提交
git commit -m "cherry-pick: 移植登录bug修复"
冲突处理
cherry-pick 遇到冲突时会暂停,和 merge/revert 流程类似:
# 1. 手动修改冲突文件,解决冲突
# 2. add 解决完的文件
git add xxx.txt
# 3. 继续完成 cherry-pick
git cherry-pick --continue
# 如果不想继续,放弃这次挑选
git cherry-pick --abort
常用参数
# -x 推荐!自动在commit备注里标记来源commit,方便追溯
git cherry-pick -x <commit-id>
# -m 1:挑选合并提交(merge commit),必须指定父分支,和revert的-m类似
git cherry-pick -m 1 <merge-commit-id>
-x效果示例:commit message 末尾自动追加(cherry picked from commit xxxxx),多人协作强烈建议带上。
常见坑
- cherry-pick 是复制提交,不是移动提交
原来分支上的 commit 还在,会产生两条内容相同、hash不同的提交。后续合并容易出现重复改动冲突。 - 不要大量 cherry-pick 连续提交代替 merge
批量挑大量提交,历史很乱,优先用 merge / rebase。cherry-pick 适合少量补丁移植。 - 被 revert 过的提交,cherry-pick 回来一样生效
只要改动本身存在,不受之前 revert 影响。 - 跨分支 cherry-pick 时,依赖其他提交的改动会直接冲突
比如 commit B 依赖 commit A 的代码,只 pick B,大概率冲突
reset / revert / cherry-pick 三者汇总对比
| 命令 | 作用 | 是否改写历史 | 适合场景 |
|---|---|---|---|
| git reset | 移动HEAD指针,丢弃后面提交 | ✅ 改写历史 | 本地未推送分支撤销提交 |
| git revert | 新建反向提交,抵消改动 | ❌ 历史保留 | 已经推远程、公共分支撤销 |
| git cherry-pick | 复制指定commit改动到当前分支 | ❌ 新增提交 | 跨分支挑选少量补丁移植 |
一句话速记
- reset:回头擦掉后面的提交(本地私用)
- revert:新增一条反向提交抵消代码(公共分支安全回退)
- cherry-pick:摘一个提交,复制粘贴到当前分支(补丁移植)
0 条笔记