在日常开发中,我们经常会遇到这样的场景:某个功能分支上有多个提交,但只有其中几个关键的提交需要合并到主分支。这时候如果直接合并整个分支,就会把不需要的代码变更也带进来,可能引入不必要的风险。
我最近在团队协作中就遇到了这种情况:同事在feature/login分支上开发登录功能时,前三个提交是核心逻辑实现,第四个提交是临时调试代码,第五个提交才是最终优化。我们只需要把第一、三、五这三个提交合并到develop分支。
每个Git提交都有一个唯一的40位SHA-1哈希值,比如a1b2c3d4...。我们可以用前7位来简写:
bash复制git show a1b2c3d
除了哈希值,还可以使用相对引用:
HEAD~1:当前提交的上一个提交branch-name~3:指定分支的最新提交往前数第3个bash复制git checkout develop
bash复制git cherry-pick a1b2c3d
bash复制git cherry-pick oldest-commit^..newest-commit
当遇到冲突时,cherry-pick会暂停并提示:
code复制CONFLICT (content): Merge conflict in file.txt
解决方法:
bash复制git add file.txt
bash复制git cherry-pick --continue
bash复制git checkout -b temp-branch develop
bash复制git rebase -i source-branch
bash复制git branch backup-branch source-branch
bash复制git format-patch -1 a1b2c3d
bash复制git am 0001-commit-message.patch
| 方法 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| cherry-pick | 少量不连续提交 | 精确控制 | 可能重复生成提交哈希 |
| rebase -i | 大量连续提交 | 保持提交线性 | 改变历史需谨慎 |
| patch | 跨仓库迁移 | 可存档传输 | 步骤较繁琐 |
代码审查辅助:在code review时发现某个提交特别好,可以直接cherry-pick到主分支
紧急修复:从开发分支提取关键修复提交到生产分支
避免的坑:
-x参数保留bash复制git cherry-pick -x a1b2c3d
团队协作建议:
git log --graph查看提交历史关系使用git log筛选符合条件的提交:
bash复制git log --author="John" --since="2023-01-01" --pretty=format:"%h"
然后通过脚本批量cherry-pick:
bash复制for commit in $(git log --format="%h" --reverse); do
git cherry-pick $commit
done
启用rerere功能可以自动记住冲突解决方案:
bash复制git config --global rerere.enabled true
code复制The previous cherry-pick is now empty
解决方案:跳过该提交
bash复制git cherry-pick --skip
code复制fatal: bad object a1b2c3d
检查是否:
bash复制git show a1b2c3d --stat
bash复制gitk --all
bash复制tig
然后按C键选择提交进行cherry-pick