1. 程式人生 > >Git使用之——衝突解決一(git merge conflict)

Git使用之——衝突解決一(git merge conflict)

Git衝突是在多使用者協同工作下出現,在一些情況下Git可以智慧自動合併,但有時需要使用者手動合併。

一. Git智慧自動合併

1. 多成員修改不同檔案

這和之前所述的“非快進式推送”一致,按照其方式解決(http://blog.csdn.net/u012150179/article/details/36044515)。

2. 多成員修改相同檔案不同區域

3. 同時修改檔名和檔案內容

解決:

上述三種方式都可以用同一中方式解決,也就是在執行push之前先進行pull操作,即
git pull

這裡

git pull = git fetch + git merge refs/remotes/origin/master

二. 使用者手動合併

1. 檔案合併(修改同一檔案的同一區域)

現在模擬這種情況的發生。(注:我這裡是首先搭建了一個Git 伺服器,搭建方法可見http://blog.csdn.net/u012150179/article/details/17029731)這裡新建了從share版本庫clone內容的兩個使用者user1和user2。並同時修改檔案conflict_test檔案的第二行,在user1執行push後,user2執行push會發生如下情形:
圖1
在log資訊中提示使用git pull,那嘗試git pull,出現一下結果:
圖2
得到的資訊是:“自動merge失敗,需要修復conflict後才能commit。”也就是此時已經出現了在上面“Git智慧自動合併”的情形之外的情況,現在Git已經不能執行自動合併,此時需要使用者手動合併解決問題。
可以檢視版本庫狀態:
圖3

問題解決方法:

這裡比較好的方式是藉助mergetool,輸入
git mergetool
得到
圖4,回車
出現kdiff3圖形介面,其中A區為修改前,B區為本地(local)版本庫修改,C區為遠端版本庫(remote)資訊,在最下方點選右鍵選擇需要使用的版本庫,修改後儲存退出即可。
這裡就完成了conflict的手動合併。
之後:
git commit –m “”
git push origin master
即可。檢視提交日誌:
圖5

可以發現最新提交是前兩次提交的合併。

2. 樹合併(不同成員對同一檔案重新命名)

關於樹衝突,出現的原因是因為同時對一個檔案進行了重新命名。也可以使用mergetool修復衝突,但是更直接的方法是直接使用git rm刪除想刪除的檔案,使用git add將需要的檔案加到暫存區進而commit。

在檔案合併和樹合併中還有一個很有用的命令是:
git ls-files –s
可檢視暫存區檔案。

其它具有參考性文章:

http://yodalee.blogspot.com/2013/03/vimdiffgit-merge-conflict_28.html

http://www.cnblogs.com/sinojelly/archive/2011/08/07/2130172.html