原文鏈接: https://lrita.github.io/2017/05/14/use-meld-as-git-tool/?hmsr=toutiao.io&utm_medium=toutiao.io&utm_source=toutiao.io
為什么使用meld
當同一個文件被多人編輯時,經常會出現沖突的問題,因此就需要解決沖突。
但是git內置的diff、merge工具比較孱弱,經常會發生一些問題,例如
刪除的代碼被人合並時又加了回來
刪除的代碼被人合並時又加了回來,我想這種場景使用git的團隊都遇見過。如果出現這種問題時, 解決沖突的人又是一個粗心的家伙,同時代碼有沒編譯出錯,則很難再發現產生了這個異常。只有 當bug再次出現時,才會發現“這個bug我明明修復了,怎么代碼又回滾了?”。
下面詳細說明一下這個問題出現的原因。
當git上原始代碼為:
conflict begin
Hello world!!!
Here is a misuse code.
conflict end
當用戶A、B同時下載該代碼同時開發時。
用戶A發現了一個bug,將bug移除,提交代碼,代碼變更為:
conflict begin
Hello world!!!
conflict end
同時用戶B添加了一個新的功能,代碼變更為:
conflict begin
Hello world!!!
Here is a misuse code.
Here is a new feature.
conflict end
然后B提交代碼時會產生一個沖突,需要解決,則git默認的merge工具則顯示沖突代碼為:
conflict begin
Hello world!!!
<<<<<<< HEAD
Here is a misuse code.
Here is a new feature.
=======
>>>>>>> e84872b222b7a9d8a3e8745ea3c9a3e85237503c
conflict end
然而用戶B可能對git的merge顯示並不熟悉、或者B是一個粗心的人。此時用戶B看到<<<<<<<
和=======
之間是自己本地提交的新功能代碼,則B將merge合並提示信息刪除后,代碼變為:
conflict begin
Hello world!!!
Here is a misuse code.
Here is a new feature.
conflict end
然后B將代碼提交,此時可見,被刪除的bug代碼又回來了,如果此時沒有人專門review代碼, 大家並沒有感覺到上面不對,只有在再次出現bug時才會發現該問題。
三路合並工具
最容易避免以上問題出現的方式就是采用三路合並工具。場景的三路合並工具有kdiff3
、meld
、Beyond Compare
等。在此推薦meld
,該工具具有良好的跨平台能力,無論你使用 Window x
/Linux
/Mac OS
都可以很容易的一鍵安裝該軟件,同時免費使用,而且啟動速度 快於Beyond Compare
等等收費軟件。
mac 安裝 meld
執行以下命令一鍵安裝
brew install caskroom/cask/meld
git 配置
修改本地的~/.gitconfig
配置文件,加入以下幾行配置
[merge]
tool = meld
conflictstyle = diff3
[mergetool "meld"]
cmd = meld $LOCAL $BASE $REMOTE --output=$MERGED --auto-merge
當用戶運行git pull
或者git pull --rebase
產生沖突時,執行git mergetool
就會彈出meld
的三路合並界面:
可見界面一共分為3欄,左邊一欄為你本地當前文件內容,右面一欄為遠端服務器上當前文件內容。 中一欄為本地當前文件原始內容。可見中間一欄meld已經幫你自動合並了,檢查無誤就可以直接保存 退出了。然后meld幫你自動保存了一份git原始沖突文件xxx.orig
,檢查無誤可以刪除此文件。
注:當不同行沖突時,meld會幫你自動合並,當同一行沖突時,meld會以git 沖突文件的格式顯示在 中間欄,此時你比較判斷<<<<<<< HEAD
/=========
/>>>>>>>>
3行直接的差異手動合並即可。