新版IDEA中Git的使用(四)——解决冲突

说明:之前介绍过新版IDEA中Git的基础操作分支操作回滚代码,本文介绍基于新版IDEA,如何解决代码冲突。

避免冲突

解决冲突的最好方法就是不要发生冲突,这里我介绍下面几点,可以避免代码冲突;

  • 时常做pull、fatch操作,不要让自己本地仓库落后太多版本;

  • 在分支操作,如切换分支、合并分支、拉取分支前,及时清理Change,保持自己分支洁净;

  • 在合并分支时,先拉取后合并,最好是切换到要合并的分支,拉取代码,再切回自己的分支拉取合并分支的代码;

  • 对于不确定的分支,在操作前,先比较分支的差异,做到心里有数;

  • 合并代码,慎重使用Cherry-Pick,可能会出现冲突;


逐条说明,第一点,时常做pull、fatch操作,如果你的分支是从dev主干分支或master分支分出来的,应该时常拉取dev主干分支或master分支的代码,以免后面合并的时候出现冲突,即便有冲突也能在拉取的时候解决,而不是到要合并的时候再解决,就像电影《教父》中说的,坏消息要早点汇报。

fatch操作,能更新远程仓库的分支。就是说,当有其他伙伴重命名了分支、新增、删除Git分支,要用fatch操作更新到自己本地仓库。


第二点,分支操作,及时清理Change,也是为了避免冲突,这是一个好习惯。如果本分支做了修改,没有commit或者Shelve Changes,在切分支的时候,就会弹出这个选择框,很不爽。

另外在回滚代码的时候,如果你分支的代码都清理掉了,没有未Commit的代码,回滚出现下面的弹框,选择Hard还是Keep效果都是一样的,这两个选项的区别在于对未commit代码的操作。


第三点,合并分支前,最好先拉取,这是常识,就像用SVN要先更新再提交一样。因为你不拉取远程仓库的最新代码,在push的时候,就会提示要Merge还是Rebase,这不是给自己找麻烦吗?


第四点,对于不确定分支,在操作前,先比较一下分支差异,可以用下面的这个选项(Compare with),可以比较Commit的差异。如果甲分支的所有提交在乙分支都有,或者差异的部分正式乙分支本次开发,新提交的。这说明乙分支是从甲分支里拉出来的,放心合并吧。

比较分析


最后一点,合并代码有几种方式,Merge、Cherry-Pick,还有一种Get,就是比较分支差异,直接获取文件到当前分支。Merge是合并代码的主流选择,Cherry-Pick,可以将另一分支的指定Commit合并到当前分支,非常方便,但是有出现冲突的可能。

设想一个场景,有两位开发同事,张三、李四,两位同事都是基于main-dev分支,拉出自己的开发分支,如下:

张三在自己分支合并完代码,都是用Cherry-Pick的方式,将代码合并到main-dev分支的,而李四则是用Merge的方式合并的。假设有个文件Other.txt是在main-dev分支上的,张三和李四的分支都有这个文件,李四修改了这个文件的内容,并且Merge到了main-dev分支,张三一直都没有修改这个文件,然后在后来的一天,想要把代码Merge到main-dev分支,就会出现冲突。

这是因为张三一直用的是Cherry-Pick,只是把自己的提交合到了main-dev分支,少了让自己分支与main-dev分支同步这一步,虽然方便了,但是后续合并代码就非常坑了,以往文件有冲突的都要解决,可能时间都过去了很久。

通过Git分支图,也可以看到张三这条分支(紫色的),单开后,一直是孤立的,没有合到主干分支。

但话说回来,Cherry-Pick也有使用场景,如果你们项目的分支管理是一个任务对应一个分支,像main-dev-zhangsan-手机短息登录开发,任务完成,代码合到稳定分支,就把此分支删除掉,这种情况使用Cherry-Pick就很方便,不存在冲突的。

解决冲突

如果冲突无法避免,如下,只能手动解决了,

Accept Yours:使用你版本的代码;

Accept Theirs:使用他们版本的代码;

Merge:手动合并;

这里的你的,他们的,是当前分支的角度。如把main-dev-zhangsan分支 into main-dev分支,这里的your就是main-dev分支,Theirs就是main-dev-zhangsan分支。


Merge界面如下,可选择对应的箭头(>>)或者叉号(X),采取对应的代码,所有的冲突解决完,点右下角的Apply这个文件的冲突就解决完了

如果不想解决,点Cancel,后面可以在分支上选择Resolve Conflicts...(继续解决),或者点Abort Merge(放弃合并)

Abort Merge:放弃合并,Abort,夭折的意思;

Resolve Conflicts...:解决冲突;

如果是Cherry-Pick出现的冲突,在下拉列表最下面,会有Abort Cherry-Pick的选项

解决冲突大概如此,需要注意,当你无法把握发生冲突的代码时,最好找来发生代码冲突的同事一起看,并问下合并代码的方式(Merge还是Cherry-Pick),不要自顾自地合并。

总结

本文介绍了在新版IDEA中Git使用的解决冲突,其他文章参考下面:

相关推荐
面试官E先生2 分钟前
【极兔快递Java社招】一面复盘|数据库+线程池+AQS+中间件面面俱到
java·面试
琢磨先生David7 分钟前
构建优雅对象的艺术:Java 建造者模式的架构解析与工程实践
java·设计模式·建造者模式
小雅痞22 分钟前
[Java][Leetcode simple]26. 删除有序数组中的重复项
java·leetcode
青云交29 分钟前
Java 大视界 -- 基于 Java 的大数据分布式存储在工业互联网海量设备数据长期存储中的应用优化(248)
java·大数据·工业互联网·分布式存储·冷热数据管理·hbase 优化·kudu 应用
纸包鱼最好吃39 分钟前
java基础-package关键字、MVC、import关键字
java·开发语言·mvc
唐山柳林42 分钟前
城市生命线综合管控系统解决方案-守护城市生命线安全
java·安全·servlet
PgSheep1 小时前
Spring Cloud Gateway 聚合 Swagger 文档:一站式API管理解决方案
java·开发语言
蒂法就是我2 小时前
详细说说Spring的IOC机制
java·后端·spring
程序员拂雨2 小时前
Java知识框架
java·开发语言
秋野酱2 小时前
基于javaweb的SpringBoot高校图书馆座位预约系统设计与实现(源码+文档+部署讲解)
java·spring boot·后端