1. 程式人生 > >SVN進階解決衝突,版本控制工具

SVN進階解決衝突,版本控制工具

什麼時候容易出現衝突?

多個人同時修改了同個檔案中的同一行程式碼

無法進行對比的二進位制檔案,比如圖片等

如何解決衝突?

例項分析

下面,我們根據實際應用場合,模擬出現衝突,到如何通過SVN提供的Edit Conflicts 介面,通過顏色標識和操作按鈕,快速準確地合併解決衝突。

開始,IMRoot.cs 檔案主題內容是這樣的,名稱空間為了理解方便省略掉。 


這裡寫圖片描述

 

qaz 在檔案的第14 行做了修改,其他的未作任何改動,並且將修改commit到了SVN。 


這裡寫圖片描述

 

wsx

 在在第19行做了修改,修改如下, 


這裡寫圖片描述

 

並且在提交前update了(注意因為這個檔案已經被qaz 做了修改,所以wsx 如果commit前不update,SVN是不允許提交的),然後commit,此時,SVN不會引發衝突,因為修改不是在同一行。SVN將qaz 的修改合併到了wsx 擁有的工作副本中,合併後文件如下所示, 


這裡寫圖片描述

 

為了故意引發衝突,假設qaz 和 wsx 同時都修改了第29行。前者修改第29行為如下,並且commite 到了SVN中 


這裡寫圖片描述

 

後者修改也同時修改了這一行,這意味他並沒有update 這個檔案, 


這裡寫圖片描述

 

然後他commit 到SVN時,提示先update ,緊接著出現衝突,如下所示, 


這裡寫圖片描述

 

此時,找到這個檔案,右鍵選擇Edit conflicts 按鈕,彈出編輯衝突的介面,這才到了重點! 


這裡寫圖片描述

 

從上圖可以看到,主要有3個子視窗組成,左上Theirs 為SVN版本庫中(也就是qaz 剛才修改提交到SVN的版本),右上 Mine

 為 wsx (正在提交到SVN發現衝突的他)的工作副本檔案,下方為合併他倆的檔案後的顯示視窗。

以下為這3個視窗的區域性檢視,依次為左上,右上,下方, 


這裡寫圖片描述 
左上

 

 


這裡寫圖片描述 
右上

 

 


這裡寫圖片描述
下方

 

當面對以上3個視窗時,還是容易讓人發矇,尤其是檔案比較複雜,衝突一大片,各種顏色摻雜在一起,不知如何下手,害怕把其他檔案意外破壞和檔案合併錯誤。那麼怎麼辦呢?我們不妨先從簡單的檔案衝突入手,徹底理解各種顏色的含義,衝突行是如何標記的,這樣我們才敢大膽地使用這個介面進行程式碼合併操作,不用擔心合併後,把別的檔案無辜干擾了或者出現合併錯誤的問題。

仔細觀察以上3個視窗,我們發現,28行和29行之間多出來一行,即橙色行,並且Theirs 和Mine 都含有這一行,這個是未衝突前,此行的內容,即剛開始的版本。第29行是爆紅行、衝突行,相應欄位還是黃色警示,並且在第3個視窗(下方視窗)第29行全是?????這種符號,意味著無法合併他倆對此行的同時修改,需要我們判斷,要麼採取Theirs 的,要麼採取Mine 的,要麼採取上一版本,要麼重新商量一個相同的。SVN也提供了幾個方便的右鍵按鈕,提示如何做出這些選擇, 


這裡寫圖片描述

 

use this text block : 選取選中行的內容 
use this whole file :選取選中行所在檔案的全部內容 
use text block from mine before theirs :先用Mine的內容,後面接著用theirs的

假如第29行我們想採用qaz 的修改,那麼,我們在左上視窗,選中第29行,右鍵選擇 use this text block ,然後下方的檢視變為如下, 


這裡寫圖片描述

 

第29行由一行??????變為左上視窗第29行的內容,顏色由爆紅變為了淺綠色。這時候注意觀察,在上一行橙色顯示內容代表什麼意思,注意最左側有個 “-”提示,代表此行不會納入合併檔案中。

假如第29 行,我們都想納入qaz 和wsx 的修改,此時我們在左上視窗選擇,use text block from mine before theirs ,即先用Mine的內容,後面接著用theirs的,選擇後下方視窗合併內容如下, 


這裡寫圖片描述

 

可以看到,第29行,先顯示Mine的,然後顯示Theirs的。

這些操作後,我們點選上方的Mark as Resolved 按鈕,然後儲存即可。這樣衝突就被解決掉了。然後wsx 再commit 自己的內容到SVN。

 

到這衝突就完美解決了。

這裡再解釋下其他的一些選單項:

Use this text block:使用這塊程式碼為合併後的行

Use this whole file:使用這整個檔案作為合併後的檔案

Use text block from 'mine' before 'theirs':兩邊的程式碼都保留,我的程式碼在前面

Use text block from 'theirs' before 'mine':兩邊的程式碼都保留,我的程式碼在後面

最後推薦大家一個非常好用的SVN原始碼託管站:SVNBucket