解決 Git 衝突的 14 個建議和工具

2021-07-11 02:06:26 字數 3460 閱讀 6600

git 非常善於合併**。**的合併在本地完成,快速而且靈活。正常情況下每次從不同分支合併內容時,衝突有可能會發生。通常解決衝突很簡單,就如同知道(如何)選擇(保留)重要的更改一樣,而有時解決衝突則需要額外的工作。

每個開發者對於解決衝突有不同的偏好。不久前,一位叫丹·史蒂文斯的同事用內部軟體 questions for confluence 詢問了大家是如何做的。

收集到的回答和看法比 atlassian 之牆有更大的吸引力。下面是我們用多種方式解決 git 衝突的詳盡描述,希望它能提供一些可以去嘗試的想法,並且融入到你日常程式設計習慣中。

( atlassian 之牆是指 atlassian 公司讓客戶將意見和反饋貼在牆上,可以參考這幅圖,譯者注)

為了設定 git 使其能正確合併,我們先開始做一些簡單的配置。

當遇到衝突時,可以在命令列或者其他視覺化工具中輸入「git mergetool」來初始化合併活動。在「.gitconfig」中用「merge.tool」變數來設定 git 中自己喜歡的衝突解決軟體,比如用 kdiff3 的可能會這樣填寫」.gitconfig」 的 merge 部分:

1

2

[merge]

tool="kdiff3"

上面的語句等價於在命令列輸入以下命令:

1

git config --global merge.tool kdiff3

用下面的設定來改進衝突標記使其也顯示(分支)共同祖先(感謝羅蘋·斯托克和休·吉登斯):

1

git config --global merge.conflictstylediff3

這個設定命令新新增一部分標記|||||||從而給衝突加了注釋,這樣可以看到衝突行在有問題的兩個分支的共同祖先處是什麼狀態。

如果檔案內容很長(比如乙個 xml檔案)、衝突很多或者兩個版本很不一致時,試著用下面的命令再次合併:

1

git merge --strategy-option=patience

「耐心」演算法的結果應該可以更好地協調一些函式中或者標記中沒有配對的括號,具體演算法細節可以參考 stack overflow 上的乙個回答。

1

git log --merge --decorate --source-p path/to/file/you/care/about

處理合併問題主要有兩類做法:有些開發者喜歡偏底層處理,因而手工操作處理衝突標記,而有些則偏好視覺化工具來輔助(解決衝突)。兩種方式都能極其有效地解決衝突。

有幾個同事分享了他們手動處理的過程,比如詹森·欣奇描述了他的處理流程:

1

2

git merge the/other/branch

git status

12

gitdiffhead...the/other/branch-- path/to/conflicting/file

gitdiffthe/other/branch...head -- path/to/conflicting/file

12

git log -p head..the/other/branch-- path/to/conflicting/file

git log -p the/other/branch..head -- path/to/conflicting/file

能幫助理解另一邊改動了什麼。

1

git checkout the/other/branch-- path/to/conflicting/file

(在這裡你也可以用git checkout --theirs 或者--ours )1

git add path/to/conflicting/file

1git commit

這個過程看起來有點太手工化了,但詹森發現對於他的工作流程來說會更少產生不合理的合併。

有很多不同的視覺化工具來操作複雜的合併和解決衝突。我的同事們提到了一些(並不是所有):

intellij idea 是很多 atlassian 工作人員使用的 ide 。很多人使用它內建的衝突解決工具來處理衝突,它提供了三個面板來分析:本地、遠端和合併結果:

kdiff3 是 kde 產品系列的一部分,並且在我們內部調查時提到過幾次。

meld 是用 gtk+ 和 python 開發的,也是已經存在了很久的工具,被提到了幾次。

更多喜歡終端的人使用 tig (我們之前寫過 tig 的一篇介紹),再加上 「 git diff 」。

我並不知道 diffmerge 這個工具,不過在列表裡也被提到了。

araxis merge 這個名字讓我想起了很久以前。那時,我在一台 windows 機器上一堆讓人抓狂的 xml 檔案中垂死掙扎,而這個工具證明了它可以經受住這個挑戰。它是個商業軟體。

有幾個同事用 vimdiff 來解決衝突,那是 vim 自帶的合併/差異分析 工具,你可以這樣設定:

1

2

3

git config merge.tool vimdiff

git config merge.conflictstylediff3

git config mergetool.promptfalse

或者按照上面展示的那樣直接修改 .gitconfig 檔案。

你是如何解決衝突的呢?流程是怎樣?你還使用過其他除了上文中提到以外的工具嗎?讓我們知曉你的技能吧,通過 @durdn 聯絡我或者 @atlassiandev 我那很棒的團隊。

12個git實戰建議和技巧

摘要 git無疑是現在最熱門的版本控制工具,而且正在進一步侵占svn以及cvs的市場。本文作者從國外技術問答社群stack overflow整理的12個很實用的git使用技巧和建議,希望對你有幫助。用git diff經常會出現很多內容,導致很多內容被遮住了,讓人很是苦惱,幸運的是這裡有個解決方案。如...

git衝突的解決

使用git pull更新 時,你修改的檔案已被他人修改,而自己沒有更新時,git會提示commit your changes or stash them before you can merge.此時可以用git stash將你修改的檔案暫存入棧中,然後git pull 然後git stash po...

git衝突的解決

1.產生衝突原因 產生 多個開發者同時使用或者操作git中的同乙個檔案,最後在依次提交和 push 的時候,第乙個操作的是可以正常提交的,而之後的開發者想要執行 pull 拉 和 pull push 操作的時候,就會報衝突異常 conflict。解決 保留自己修改的資料,同時保留別人的資料資訊。2....