Git用法之Cherry-Pick

本文介绍了如何在Git中使用cherry-pick命令从一个分支选择性地将提交应用到另一个分支的方法。包括基本用法、解决冲突的过程及批量应用多个提交的操作技巧。

1. 将DEV分支中的提交进行cherry-pick 到Master 分支        

    切换到 Master 分支上,然后cherry-pick

 
$ git cherry-pick <commitHash>
 
# 切换到 master 分支
$ git switch master
 

$ git cherry-pick K


$ git push origin master

2. cherry-pick 遇到冲突文件

  • 解决冲突

    • 修改冲突的地方,并通过命令git add .把文件重新加入暂存区。
    • 继续合并,git cherry-pick --continue

           加入暂存区之后,然后执行git cherry-pick --continue 

     就相当于推送到本地版本库

  • 回退所有修改:git cherry-pick --abort,此时会回到操作前的样子
  • 单纯退出cherry-pickgit cherry-pick --quit,此时不会回到操作前的状态

3. cherry-pick 多个

git cherry-pick comA comB comC



包含comA 提交的change 

git cherry-pick ComA^..ComB

你遇到了这个错误: ```bash git cherry-pick --abort error: no cherry-pick or revert in progress fatal: cherry-pick failed ``` 这说明:**Git 认为当前没有正在进行的 `cherry-pick` 操作**,所以无法执行 `--abort`。 但这和你之前的上下文矛盾(你明明是从 `cherry-pick --continue` 的编辑界面退出来的),那为什么会出现这种情况?我们来一步步分析并解决。 --- ## 🔍 问题原因分析 出现 `no cherry-pick or revert in progress` 的常见情况有: ### ✅ 情况 1:你已经**成功完成了 cherry-pick 提交** - 你在 `git cherry-pick --continue` 时保存了提交信息; - Git 成功创建了一个新提交; - 此时 cherry-pick 流程**已经结束**,不再处于“进行中”状态; - 所以再运行 `--abort` 就提示“不在进行中”。 👉 这是最可能的情况! 你可以通过以下命令确认是否已经有新提交生成: ```bash git log --oneline -2 ``` 你会看到类似这样的输出: ```text abc1234 [all] cloud_iot: support videoCallEvent ← 这个就是你刚完成的 cherry-pick 提交 def5678 c865v1_develop_250115: last commit before cherry-pick ``` 如果是这样,说明 **cherry-pick 已经完成提交了**,你现在要做的不是 `abort`,而是 **撤销最后一次提交(undo)**。 --- ## ✅ 正确解决方案:根据当前状态选择操作 ### ✅ 方案一:如果 cherry-pick 已完成(已有提交) 使用 `reset` 回退到上一个提交,但保留工作区更改: ```bash git reset --soft HEAD~1 ``` > ✅ 保留所有文件改动,只是把提交取消。适合你想重新编辑或放弃提交内容。 或者,如果你想彻底删除这次提交及其所有修改(慎用): ```bash git reset --hard HEAD~1 ``` > ⚠️ 警告:这会**永久删除**该提交以及它引入的所有代码变更,请确保你不想要这些改动。 📌 推荐流程: ```bash # 先查看刚刚的提交长什么样 git show # 确认是你要撤销的那个 cherry-pick 提交 git reset --hard HEAD~1 ``` 执行后你就回到了 cherry-pick 前的状态。 --- ### ✅ 方案二:如果 cherry-pick 中途被打断但未完成(比如你删了提交信息导致失败) 有时你运行 `git cherry-pick --continue` 但清空了提交信息,导致: ```bash Aborting commit due to empty commit message. ``` 此时 Git 可能处于一种“中间失败状态”,`.git/CHERRY_PICK_HEAD` 文件还存在。 你可以手动检查是否存在该文件: ```bash ls .git/CHERRY_PICK_HEAD ``` - 如果存在 → 手动删除它即可清理状态: ```bash rm .git/CHERRY_PICK_HEAD ``` 然后再运行: ```bash git status ``` 应该就能恢复正常。 --- ### ✅ 方案三:不确定状态?一键恢复干净状态 如果你不知道现在到底是什么状态,可以用下面的方法重置一切: ```bash # 1. 清理未跟踪文件和目录(可选) git clean -fd # 2. 丢弃所有工作区修改,回到最新提交状态 git reset --hard HEAD # 3. 确保分支头一致 git checkout c865v1_develop_250115 ``` ⚠️ 注意:这会**清除所有未提交的更改**,请确保你不需要保留任何本地修改。 --- ## 🧪 如何判断 cherry-pick 是否已完成? 运行: ```bash git log --oneline -3 ``` 看看最新的提交是不是你正在处理的那个功能(例如 `[all] cloud_iot: support videoCallEvent`)。 如果是 → 说明已经提交成功 → 你应该用 `reset` 而不是 `abort`。 运行: ```bash ls .git/CHERRY_PICK_HEAD ``` - 存在 → 表示 Git 仍认为 cherry-pick 在进行中(可以尝试 `git cherry-pick --quit`) - 不存在 → cherry-pick 已结束或被中断 --- ## ✅ 总结:你现在该怎么办? | 判断依据 | 解决方案 | |--------|---------| | `git log` 显示已有新提交 | 使用 `git reset --hard HEAD~1` 撤销提交 | | `.git/CHERRY_PICK_HEAD` 文件存在 | 删除它:`rm .git/CHERRY_PICK_HEAD` | | 不确定状态,想彻底重来 | `git reset --hard HEAD && git clean -fd` | 🎯 最大概率是你已经完成了 cherry-pick 提交,所以不能用 `--abort`,应该用: ```bash git reset --hard HEAD~1 ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值