作为一个刚接触 Git 不久的开发者,我常常被版本控制的复杂性搞得晕头转向。合并分支(merge)、变基(rebase)、撤销更改(revert)……这些操作虽然强大,但有时候显得“过于粗暴”。比如,当我需要在生产环境紧急修复一个 bug,而修复的代码只存在于开发分支的某个特定提交中时,直接合并整个开发分支显然不合适——毕竟开发分支可能还包含未完成的功能或实验性代码。
直到最近,我学会了 Git Cherry Pick,这个“精准打击”的工具彻底改变了我的工作流程!现在,我可以自信地说:“我终于掌握 Git Cherry Pick 啦!”
什么是 Git Cherry Pick?
简单来说,Git Cherry Pick 允许你从任意分支中挑选一个或多个提交(commit),并将它们直接应用到当前分支。它就像从一堆代码中精准地“摘下”一颗樱桃(cherry),而不需要搬走整个果盘。
适用场景
- 紧急修复:生产环境(
main/master)发现 bug,但修复代码在开发分支(dev)的某个提交中。 - 部分合并:只想合并某个分支的特定功能,而不是整个分支。
- 历史回溯:需要将旧的提交应用到当前分支(例如重新应用一个被丢弃的修复)。
- 团队协作:共享不同分支中的特定更改,避免复杂的合并冲突。
我的第一次 Cherry Pick 实战
上周,我在 main 分支中部署了一个新功能,但用户反馈了一个严重的 bug。经过排查,我发现修复代码已经在 dev 分支的某个提交中完成了(提交哈希为 abc1234)。
步骤 1:找到目标提交
首先,我切换到 dev 分支,查看提交历史:
bash
git checkout dev
git log --oneline
输出类似这样:
abc1234 Fix: 修复登录页面的表单验证错误
def5678 Feat: 添加用户个人资料页面
ghi9012 Chore: 更新依赖库版本
我找到了修复 bug 的提交 abc1234。
步骤 2:切换到生产分支
接下来,我切换到 main 分支:
bash
git checkout main
步骤 3:执行 Cherry Pick
然后,我使用 git cherry-pick 将 abc1234 提交应用到 main 分支:
bash
git cherry-pick abc1234
Git 提示:
[main abc1234] Fix: 修复登录页面的表单验证错误
Date: Mon Oct 30 12:00:00 2023 +0800
1 file changed, 5 insertions(+)
成功!提交已被精准应用到 main 分支。
步骤 4:处理冲突(如果有)
如果提交依赖其他未合并的更改,可能会遇到冲突。Git 会暂停并提示冲突文件。例如:
CONFLICT (content): Merge conflict in src/LoginForm.js
我打开 src/LoginForm.js,手动解决冲突后,标记为已解决:
bash
git add src/LoginForm.js
然后继续 Cherry Pick:
bash
git cherry-pick --continue
如果不想继续,可以取消:
bash
git cherry-pick --abort
步骤 5:推送更改
最后,我将更改推送到远程仓库:
bash
git push origin main
Cherry Pick 的注意事项
- 提交独立性:确保被 Cherry Pick 的提交不依赖其他未合并的提交,否则可能导致功能不完整。
- 测试验证:在生产分支应用后,务必测试确认 bug 已修复且未引入新问题。
- 提交历史:Cherry Pick 会生成一个新的提交(哈希值不同),但内容与原始提交一致。
- 谨慎使用:频繁 Cherry Pick 可能导致代码碎片化,建议仅在必要时使用。