Cherry-Pick后Merge导致冲突的原因及解决方式

前言

这个教程基于我的个人理解和实践,所以请大家多多指教。错误之处,欢迎评论指出,方便大家也能参考.有时间的话我也很乐意及时的进行改进。如果教程中有表述不清楚的地方,也请指出,或提供建议。

背景重现

项目开发过程中,有两个分支,一个是提供给大家日常功能开发的sit分支,一个是进行生产部署的release分支,有时候有些功能暂时不上线,所以不能把sit的全部内容合并到release,那么就选择使用cherry-pick(以下简称cp)功能来摘取sit的代码到release中.场景命令如下:(假设修改的都是同一个文件)

git 复制代码
假设当前sit代码是最新的,且目前处于sit分支下
git log // 获取到想要cp的commitID,假设一个是0000,一个是0002
git checkout release
git cherry-pick 0000,0002
git checkout sit

通过以上命令完成了release的处理,线上正常发版,一切安好~ 中间大家在sit分支有一些代码的提交:

git 复制代码
git checkout sit
git add .
git commit -m '二次提交'

过了一周,又要发版了,这次是全量的内容都需要发版,所以release分支需要全量合并sit的内容,此时我按着以下的步骤基于上次的结果进行处理,然后就报冲突了,命令如下:

git 复制代码
git checkout release
git merge sit

这个时候是会报冲突的,但是在我的理解中,除了我,没有别人提交信息到release啊,怎么会冲突呢?

解决

所以我怀疑是cp的问题,经过测试验证排查,最终发现了解决方案,命令如下:

git 复制代码
此时仍然在release分支上
git merge --abort  先把刚才的合并进行撤回操作,也就是返回merge之前到状态
git cherry-pick 0001
git merge sit

此时代码就不会再报冲突了.

总结原因

在sit分支,针对一个文件有多个commit,在release分支进行过一部分的cp,那么release的commit相对sit就不是全的,比如:sit的commit分别是1 2 3 4,release进行了1 2 4的cp,此时如果直接merge分支sit的内容到release,就会报冲突了,所以需要把3也cp到release中,这样就可以了.

扩展

以上说的是同一个文件,那么不同的文件呢?比如sit针对a文件进行了1 2的commit修改,针对b文件进行了3 4的commit修改,那么git cherry-pick 1到release,再执行git merge sit到release会导致冲突,但是如果继续git cherry-pick 2到release,后面git merge sit到release,就会正常了.因为针对a文件,所有的commit是全的,所以不冲突.完整示例如下:

git 复制代码
git checkout sit
git add test.java
git commit -m '1' aaaaaaaaaaaaaaaaaaa.java  commitId:12345
git add test.java
git commit -m '2' aaaaaaaaaaaaaaaaaaa.java  commitId:67890
git add dev.java
git commit -m '3' bbbbbb.java               commitId:54321
git add test.java
git commit -m '4' bbbbbb.java               commitId:09876

git checkout release
git cherry-pick 12345
git cherry-pick 67890
git merge sit
git push

以上就是所有过程及分析,欢迎大家多指正!

相关推荐
lsc_blog18 小时前
年底还在招的岗位,先确认缺口和到岗要求
git·缓存·ci/cd·职场和发展·github
全栈陈序员1 天前
【Git】从入门到精通(十一)—— git reset 三种模式详解
git·elasticsearch
全栈陈序员1 天前
【Git】从入门到精通(十)—— 撤销与恢复:git checkout与git restore
运维·网络·数据库·git
全栈陈序员1 天前
【Git】从入门到精通(五)—— git add:将文件加入暂存区
大数据·git·elasticsearch
全栈陈序员1 天前
【Git】从入门到精通(七)—— git status:查看仓库状态
大数据·git·elasticsearch
莫晓燚2 天前
Ansible 13 个常用模块---企业实战
git·github
无言听风雨丶2 天前
Kubernetes GitOps 持续交付实战:用 Argo CD 让 Git 成为集群事实源
git·elasticsearch·kubernetes
全栈陈序员2 天前
【Git】从入门到精通(六)—— git commit:提交到版本库
大数据·git·elasticsearch
全栈陈序员3 天前
【Git】从入门到精通(一)—— Git简介:什么是版本控制系统
大数据·git·elasticsearch
大猫会长3 天前
git笔记
git