git 下的冲突解决

冲突的产生:

很多命令都可能出现冲突,但从根本上来讲,都是merge和patch(应用补丁)时产生冲突。

而rebase就是重新设置基准,然后应用补丁的过程,所以也会冲突。

git pull会自动merge,repo sync会自动rebase,所以git pull和repo sync也会产生冲突。当然git rebase就更不用说了。

冲突的类型:

逻辑冲突:git自动处理(合并/应用补丁)成功,但逻辑上是有问题的。
   比如另一个人修改了文件名,但我还使用老的文件名,这种情况下自动处理是能成功的,但实际上是又问题的。
 又比如函数返回值含义变化,但我还使用老的含义,这种情况下自动处理成功,但可能隐藏这重大BUG。这种问题,
 主要通过 自动化检测来保障。所以最好是能写出比较完善的自动化检测试用例。这种冲突的解决就是做一次BUG的
  修复,不是真正解决git报告的冲突。
内容冲突:两个用户修改了同一个文件的同一块区域,git会报告内容冲突,我们常见的都是这种,研究的解决办法也主要针对
  这种。
树冲突 :文件名修改造成的冲突称为树冲突。
  比如a用户把文件名修改为a.c,b用户把文件名修改为b.c,那么b将这两个commit合并时会产生冲突。

内容冲突的解决办法:

发现冲突:一般来讲,出现冲突时都会有“CONFLICT”字样:
$ git pull => Auto merging test.txt => CONFLICT(content):Merge conflict in text.txt => Automatic merge failed;
fix conflicts and then commit the result.
但也有例外,repo sync的报错,可能并不是直接提示冲突,而是这样:
error:project mini / sample
注:无论是否存在冲突,只要本地修改不是基于服务器最新的,他都可能报告这个错误,解决方法都是一样。
 
这个时候需要进入报错的项目,然后执行git rebase解决
git rebase remote-beanch-name

冲突解决的一般过程:
 merge / patch的冲突解决:先编辑冲突,后commit提交。对于git来说编辑冲突跟平时修改代码没什么差异,都是要把修改
添加到缓冲,然后commit。

解决冲突的方法:
 冲突产生后,文件系统冲突了文件里面的内容会显示为类似下面的这样:

a123
 <<<<<<< HEAD
 b789
 =======
 b45678910
 >>>>>>> 6853e5ff961e684d3a6c02d4d06183b5ff330dcc
 c

此时标记<<<<<<<与=======之间的内容是我的修改,=======与>>>>>>>之间的内容是别人的修改。此时,还没有任何其他垃圾文件产生。
最简单的编辑冲突方法 ,就是直接编辑冲突了的文件,把冲突标记删掉,把冲突解决正确。

利用图形界面工具解决冲突:
如果想要解决的冲突很多,且比较复杂,图形界面的冲突解决工具就显得很重要了。
执行git mergetool用预先配置的Beyond Compare解决冲突:

$ git mergetool
 Merging:
 test.txt

 Normal merge conflict for 'test.txt':
   {local}: modified
   {remote}: modified

 
 上面三个窗口依次是:“LOCAL”、"BASE"、"REMOTE",它们只是提供解决冲突需要的信息,是无法编辑的。
下面一个窗口是合并后的结果,可以手动修改,也可以点击相应颜色的箭头选择"LOCAL"或者"REMOTE"。
在Beyond Compare中修改冲突保存后,冲突文件中的冲突标记就没有了,成了修改后的内容,一个文件的冲突编辑就完成了。
注意:启动beyond Compare之后,会自动生成几个包含大小写字母、数字的辅助文件,关闭beyond Compare之后
这几个辅助文件会自动删除,但同时会生成一个.orig的文件,内容是解决冲突前的冲突现场,默认.orig文件不会自动删除,
需要手动删除。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值