git多人合作开发项目中,经常会遇到需要合并分支。因为可能会对同一个文件进行了修改,git merge --no-ff -m "merge with no-ff" dev,之后解冲突,下面介绍我遇到的iOS合并分支中遇见的解冲突情况,记录下。
通常合并分支后,会造成xcodeproject工程文件打不开。解决方案分为如下六步。
- 选中工程文件->右键显示包内容
- 双击这个文件,用Xcode打开
- 打开之后显示这个样纸
- 使用快捷键 cmd + F(搜索),在弹出的搜索框中输<<< 或者 >>> 或者 ====,其中的任何一个都行,然后敲一下回车(enter键)说明
<<<<<<< HEAD代表是工程文件冲突的开始
=====分割线d0d695000a8e250672dad0b7954d7d18a6cc17a0结束
- 删掉>>>HEAD和===和>>>>>>>d0d695000a8e250672dad0b7954d7d18a6cc17a0,E16D957A1CD616610095F921 /* Resource /和E1F1D2271CD602F5002AC55F / MainViewController.swift */保留一个
- 重复查找,如果还有冲突的地方,同上,保存 cmd + s。工程文件能顺利打开
如果使用了cocoapods,除了对同一个.h或.m文件修改有冲突之外,还会有podfile文件和podfile.lock文件冲突了。可以利用sourceTree进行解冲突。
- 现在点击 “Working Copy” 分区。你会看到受合并冲突影响的文件都在左侧有个感叹号。
- 使用 SourceTree 解决 git 中的合并冲突,使用 “mine” 或 “theirs” 来解决,这是修复 git 中的合并冲突最简单的方式。如果你右击任意有冲突的文件,它会在 “Resolve Conflicts” 下面显示两个选项。
- “Mine” 表示冲突文件在你当前分支上的内容。“Theirs” 表示冲突文件在传入分支上的内容——尝试合并到当前分支的那个分支。
注意:如果是回滚操作,“Theirs” 表示冲突文件在回滚区块上的内容。
所以,通过选择 “Mine” 或 “Theirs”,你只是指示 git 丢弃其中一个版本,并使用另外那个版本。
如何决定选择哪个版本?下个问题你可能要问,我怎么知道该选择哪个版本——“Mine” 还是 “Theirs”?
大部分情况下,你应该已经知道怎么做,因为你知道每个分支中提交的内容。那就可以跳过这个部分。但如果不是,也不要担心。选择冲突的文件,然后可以在右侧看到文件的内容。仔细注意这里的模式,你会在每个有合并冲突的文件中看到它。
<<<<<<< HEAD
...content on current branch...
=======
...content on incoming branch...
>>>>>>> change (or the name of whatever your incoming branch is)
你可以把 HEAD 看作当前分支。在上面的例子里,就是 “master” 分支。
从 <<<<<<< HEAD 到 ======= 那行之间的就是当前分支上的内容。从 ======= 到 >>>>>>> 你的传入分支名之间的就是传入分支上的内容(在上面的例子中就是 “change”)
- 还要记住在用 SourceTree 读取文件的时候,可以跳过红色标注的行,因为它们已经被删了。绿色标注的那些是新添加的。
你可能正在处理一个巨大的文件,在多个部分有多个冲突,那么 SourceTree 里面的视图可能不够用。对于这些情况,我推荐下面的两种方法。
- 还有可能遇到xib和storyboard无法打开的情况,因为可能xcode版本存在差异。弹窗报错:Interface builder was unable to determine the type of xxx.xib
- 可以想到,应该是合并造成xib文件版本冲突,一种简单的方式可以拿最新的版本直接覆盖出问题的xib文件。但是这种办法简单粗暴,没有深入探究该xib文件问题到底出在哪里。联想到代码发生版本冲突时,头文件或实现文件中,会标记出冲突的代码,那么出问题的xib文件对应的源码中同样也应该存在冲突的代码。带着这样的想法,我打开了该xib文件的源码。选中xib文件->右键->Open As->Source Code,打开xib文件对应的xml文档:可以清楚地看到,冲突的地方已经被标记出来。原因是toolsVersion和systemVersion版本冲突,是最近升级系统和Xcode引起的。去掉working的部分~
- 重新pod install或pod update,程序能重新运行。