SVN解決版本衝突
SVN衝突出現場景
如今是一個團結協作的時代,開發一個系統,往往會多人協作共同完成。版本管理是必不可少的,常用的軟體有Git,SVN等。今天說一下,SVN管理版本時,如果出現衝突後,如何快速解決衝突。
首先說明一個問題,有一種情況無論如何都不會出現衝突。假如有一個叫qaz
的程式設計師,他checkout
了版本庫,這樣他擁有了一個工作副本。然後,他修改了某個檔案IMRoot.cs
,commit
到SVN,並且這個檔案保證不會有其他人在他們的工作副本修改並提交到SVN。這種情況下,無論qaz
如何修改IMRoot.cs
,在commit
時都不會發生衝突。
以上說了一種不會出現衝突的情況,那麼什麼應用場合可能會出現衝突呢?假如程式設計師wsx
IMRoot.cs
並commit 到SVN,此時可能會引發衝突。
例項分析
下面,我們根據實際應用場合,模擬出現衝突,到如何通過SVN提供的Edit Conflicts
介面,通過顏色標識和操作按鈕,快速準確地合併解決衝突。
開始,IMRoot.cs
檔案主題內容是這樣的,名稱空間為了理解方便省略掉。
qaz
在檔案的第14
行做了修改,其他的未作任何改動,並且將修改commit
到了SVN。
wsx
在在第19行做了修改,修改如下,
並且在提交前update了(注意因為這個檔案已經被qaz
做了修改,所以wsx
如果commit
前不update,SVN是不允許提交的),然後commit
qaz
的修改合併到了wsx
擁有的工作副本中,合併後文件如下所示,
為了故意引發衝突,假設qaz
和 wsx
同時都修改了第29行。前者修改第29行為如下,並且commite
到了SVN中
後者修改也同時修改了這一行,這意味他並沒有update
這個檔案,
然後他commit
到SVN時,提示先update
,緊接著出現衝突,如下所示,
此時,找到這個檔案,右鍵選擇Edit conflicts
按鈕,彈出編輯衝突的介面,這才到了重點!
從上圖可以看到,主要有3個子視窗組成,左上Theirs
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。