Git使用之——衝突解決一(git merge conflict)
阿新 • • 發佈:2019-01-27
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已經不能執行自動合併,此時需要使用者手動合併解決問題。
可以檢視版本庫狀態:
問題解決方法:
這裡比較好的方式是藉助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