我總結(jié)一下在工作中遇到的沖突及避免的辦法妒蛇,
一恩脂、類似與import 引起的沖突
我們的git 流程管理分為master帽氓,release,dev俩块,feature黎休,staging五大類分支,
staging分支典阵,主要用于測試奋渔。但是在feature合并staging分支的時候會出現(xiàn)沖突。
比如staging環(huán)境的版本
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的版本變?yōu)椋?/p>
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合并的時候會進(jìn)行three-way merge壮啊,
這個時候有歧義性:
1嫉鲸、第一種合并方案
認(rèn)為你的版本刪除了feature_A的
import java.util.Date;
又增加了兩行
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
最終結(jié)果為:
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功能可以查看每行代碼是誰提交的屡限。
右鍵行號,選擇annotate就能打開如上圖所示效果炕倘。
3耍休、文件引起的沖突
因為共同創(chuàng)建了一個同名文件吵聪,對方刪除了我們正在使用的文件。也會引起沖突,叫做樹沖突束亏。
比如聂宾,a用戶把文件改名為a.c友题,b用戶把同一個文件改名為b.c郁季,那么b將這兩個commit合并時,會產(chǎn)生沖突浴骂。
$ 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
執(zhí)行前面兩個git rm時,會告警“file-name : needs merge”靠闭,可以不必理會帐我。
樹沖突也可以用git mergetool來解決坎炼,但整個解決過程是在交互式問答中完成的,用d 刪除不要的文件拦键,用c保留需要的文件谣光。
最后執(zhí)行g(shù)it commit提交即可。