硬廣:《SVN與TortoiseSVN實戰》系列已經寫了三篇,第一篇《SVN與TortoiseSVN實戰:從入門到精通》,第二篇《SVN與TortoiseSVN實戰:標簽與分支》和第三篇《SVN與TortoiseSVN實戰:TortoiseSVN新建及合並分支》重點介紹了標簽和分支的概念及實際操作演示。
在寫到SVN分支合並時,有評論中也提到合並后發生沖突的問題,相信關於沖突的知識也是開發人員的痛點。
關於沖突的知識,重點介紹以下幾個方面:
1、什么情況會產生沖突?
2、沖突發生時產生的三個文件是什么含義?
3、怎樣使用TortoiseSVN解決沖突?
什么情況會產生沖突?
當我第一次使用SVN這類項目管理工具時,心中就有一個疑問:多個人同時編輯一個文件會發生什么情況?
為了模擬這種情況,我通過使用另外一個賬號簽出上一篇中的項目,來模擬多個用戶同時操作的情況(在TortoiseSVN的設置對話框里通過Saved Data可以刪除保存的賬號信息以便重新登錄)。
現在test目錄中新建一個測試文本文件,輸入以下內容並簽入,然后簽出到testother目錄中:
1 2 3 4 5 6
首先編輯test目錄中的測試文本文件,把第一行的1改為11,保存后簽入到SVN:
11 2 3 4 5 6
現在編輯testother目錄中的測試文本文件,把最后一行6改為66,保存后簽入到SVN:
1 2 3 4 5 66
在簽入testother的修改時,會提示我們該文件已過期,需要首先簽出最新版本:
當我們簽出后TortoiseSVN會提示讓我們再次嘗試簽入,這次簽入會成功,在這個過程中沒有發生沖突,testother目錄中的測試文本文件的內容為:
11 2 3 4 5 66
可以看到內容自動合並了來自兩個目錄下的修改,那什么情況下會產生讓人頭疼的沖突呢?
上面的操作之所以沒有產生沖突,是因為兩個目錄中對文件內容的修改沒有在同一個位置,如果在testother目錄中對第一行進行修改(比如不修改6,而把1改為111),就會產生沖突。
可能有人看到這里就會想到以下這種情況,還是在test目錄中修改1為11:
11 2 3 4 5 6
在testother中的第一行前新建一行,修改為:
0 1 2 3 4 5 6
這種情況會產生沖突嗎?
結果是:會。
這是因為SVN並沒有那么智能,認為你是新建了一行,SVN對於沖突的判斷關鍵在於對相同位置上內容的修改,所以當你新建一行時就改動了所有后邊的位置。
了解了這些大家基本對SVN沖突產生的原理應該認識的非常透徹了。
關於沖突的其他幾個問題稍后講解,一篇沒有辦法寫的太詳細。
記錄,為更好的自己!