我总结一下在工作中遇到的冲突及避免的办法,

一、类似与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提交即可。



 

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐