現在是一個團結協做的時代,開發一個系統,每每會多人協做共同完成。版本管理是必不可少的,經常使用的軟件有Git,SVN等。今天說一下,SVN管理版本時,若是出現衝突後,如何快速解決衝突。git
首先說明一個問題,有一種狀況不管如何都不會出現衝突。假若有一個叫qaz
的程序員,他checkout
了版本庫,這樣他擁有了一個工做副本。而後,他修改了某個文件IMRoot.cs
,commit
到SVN,而且這個文件保證不會有其餘人在他們的工做副本修改並提交到SVN。這種狀況下,不管qaz
如何修改IMRoot.cs
,在commit
時都不會發生衝突。程序員
以上說了一種不會出現衝突的狀況,那麼什麼應用場合可能會出現衝突呢?假如程序員wsx
他會修改文件 IMRoot.cs
並commit 到SVN,此時可能會引起衝突。svn
下面,咱們根據實際應用場合,模擬出現衝突,到如何經過SVN提供的Edit Conflicts
界面,經過顏色標識和操做按鈕,快速準確地合併解決衝突。this
開始,IMRoot.cs
文件主題內容是這樣的,命名空間爲了理解方便省略掉。 .net
qaz
在文件的第14
行作了修改,其餘的未做任何改動,而且將修改commit
到了SVN。 code
wsx
在在第19行作了修改,修改以下, 圖片
而且在提交前update了(注意由於這個文件已經被qaz
作了修改,因此wsx
若是commit
前不update,SVN是不容許提交的),而後commit
,此時,SVN不會引起衝突,由於修改不是在同一行。SVN將qaz
的修改合併到了wsx
擁有的工做副本中,合併後文件以下所示, 開發
爲了故意引起衝突,假設qaz
和 wsx
同時都修改了第29行。前者修改第29行爲以下,而且commite
到了SVN中 get
後者修改也同時修改了這一行,這意味他並無update
這個文件, it
而後他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。