使用 IDEA 处理合并(merge)
使用IDEA处理git合并如果遇到冲突,对冲突文件的不冲突部分需要处理吗?会自动将双方不冲突的部分合并吗?
比如如下,使用 IDEA 合并 branch1 到 branch2 分支,出现了冲突,如下图:
如果处理好冲突,得到如下图:
我的问题是,绿色的部分如果不更新到中间的Result里头,在点击 Apply 之后会不会丢失掉?答案是会丢失,没有冲突的部分也得你操作点一下!中间的Result就是合并后的样子!
我为什么会有这个疑问,因为我以前是习惯直接使用命令行 git merge 来合并的,合并之后搜索 <<< 来确定有冲突的位置(当然也可以查看执行 git merge 命令后会列出冲突的文件列表),以前用git merge命令都是会自动合并没有冲突的部分,所以我改成用 IDEA 的图形化工具之后有这样的疑问
下面是上述结论的实践证明
假设我们现在不将绿色无冲突的部分手工弄到中间的Result,继续点击Apply,则 IDEA 还是比较人性化给你弹出提示,告知你还有未处理完的合并
此时如果点击 Continue Merge 就相当于继续处理剩余的,如果点击 Apply Changes and Mark Resolved 就是继续(老子就要这么干)
点击 Apply Changes and Mark Resolved 后就可以看到最终的合并结果丢失了两边绿色的内容,如下图:
细节
细节1:diff算法局限性
注意到diff算法的一些局限性。本该是显示新增的,结果显示为修改。
受限于差异算法,红框里的部分其实应该识别为新增内容,但是算法无法这么智能地识别这是新方法,它以为只是第一个方法即 getProfiles() 的延伸!!你可以看到红框里最后一个 } 被认为和原getProfiles() 方法的 } 相同,如下图:
细节2:从哪里可以看到什么分支合并到什么分支
在处理冲突的页面可以看到
另外还可以从下图看出(如果有冲突,最左边的就是 “合并到” 的分支)
有时候也非常奇葩,不显示分支名,显示的revision,不知道为什么。比如如下图是合并branch2到branch1,结果branch2被现实成revision,可读性变差了!!
细节3:“a合并到b” 和 “b合并到a” 就是显示的结果反过来而已
细节4:保留左边还是右边?
合并的时候自然可以选择保留两边任意一边的,也可以两边都保留,也可以两边都不采纳。中间的Result栏你要怎么改就怎么改,反正你在Result看到的就是最终的合并后的结果
如下图,可以不采纳左右两边的,最终结果使用一个新的变量名
细节5:处理完冲突之后,有没有一键左右两边的都合并到中间?
处理完某个文件中的冲突部分后,有时候左右两边的 >> 和 << 太多了,一个个点完了左边的>>还要一个点右边的<< 太费劲了,有没有快速的一次性将左边的>>全部采纳,和一次性右边的<<全部采纳,又或者一次性将左右两边的全采纳?
其实是有的
- 点击 “>> Left” 这个则把左边无冲突的、所有的change应用过去(这样就不需要逐个点击,同时有冲突的不会一起过去)
- 点击 “>> Right” 这个同理把右边无冲突的、所有的change应用过去
- 点击 “>><< All” 则相当于点击了上面的两个按钮,同样的,会把无冲突的、全部的左右的change应用
注意:
1、建议还是一个个点击会比较放心,除非你真的很自信你的操作没有问题。
2、上面的操作可以通过ctrl+z或cmd+z撤销
细节6:IDEA 右下角的分支终于会自动刷新了
实测Mac版本的 IDEA Ultimate Edtion 2023.1.3,在Terminal中切换分支,右下角显示的分支终于会实时刷新了(之前在Terminal中使用git checkout myBranch 之后并不会实时变化,要等鼠标点击到别的地方的时候才会刷新)