我总结一下在工作中遇到的冲突及避免的办法,
一、类似与import 引起的冲突
我们的git 流程管理分为master,release,dev,feature,staging五大类分支,
staging分支,主要用于测试。但是在feature合并staging分支的时候会出现冲突。
比如staging环境的版本
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.ArrayList;
import java.util.List;
feature_A的版本
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
feature_B的版本
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
下面展示是如何造成冲突的:
这个时候feature_B 加了2个import
feature_B的版本变为:
import java.text.SimpleDateFormat;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.ArrayList;
import java.util.List;
显然这个时候和staging的版本造成冲突:
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.ArrayList;
import java.util.List;
git合并的时候会进行three-way merge,
这个时候有歧义性:
1、第一种合并方案
认为你的版本删除了feature_A的
import java.util.Date;
又增加了两行
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
最终结果为:
import java.text.SimpleDateFormat;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.ArrayList;
import java.util.List;
2、第二种合并方案,
即不删除feature_A的
import java.util.Date;
最终合并方案为:
import java.text.SimpleDateFormat;
import java.util.Date;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.ArrayList;
import java.util.List;
避免这种情况的最好方法是import总是放在自己的代码中间,import不要交错放。禁止使用代码格式化工具,尽量手动格式化。
二,改动他人代码引起冲突:
另外一种冲突的原因是因为改动了他人的代码,这个是很危险的,非常容易引起冲突和bug。
对于idea,有个annotation功能可以查看每行代码是谁提交的。
image.png
右键行号,选择annotate就能打开如上图所示效果。
3、文件引起的冲突
因为共同创建了一个同名文件,对方删除了我们正在使用的文件。也会引起冲突,叫做树冲突。
比如,a用户把文件改名为a.c,b用户把同一个文件改名为b.c,那么b将这两个commit合并时,会产生冲突。
$ git status
added by us: b.c
both deleted: origin-name.c
added by them: a.c
如果最终确定用b.c,那么解决办法如下:
git rm a.c
git rm origin-name.c
git add b.c
git commit
执行前面两个git rm时,会告警“file-name : needs merge”,可以不必理会。
树冲突也可以用git mergetool来解决,但整个解决过程是在交互式问答中完成的,用d 删除不要的文件,用c保留需要的文件。
最后执行git commit提交即可。