合並SVN

轉自:http://tid.tenpay.com/?p=3300

一、  背景    

平時在進行開發時,一般都會有多版本同時進行,包括項目版本、周版本、緊急版本等,當某一個版本具備上線條件后,需要在上一個已發布的版本基礎上進行發布,才能夠避免出現版本相互覆蓋,因此往往需要對版本之間代碼進行合並,這里就和大家探討下如何合並代碼,讓合並代碼質量高以及高效。

二、合並代碼的常規方法

常規的方法是用Beyond Compare 工具來進行手工合並代碼,該工具的最主要作用是對比出有哪些代碼是不相同,然后人為地判斷出哪些需要合並,哪些不需要合並。因此如果判斷失誤,則合並后的質量未必高;在合並的過程中,因為是需要人為識別如何來合並,因此效率自然不會很高.

三、利用SVN合並

Subversion的版本庫是一種文件服務器,但不是“一般”的文件服務器。Subversion版本庫的特別之處在於,它會記錄每一次改變:每個文件的改變,甚至是目錄樹本身的改變,例如文件和目錄的添加、刪除和重新組織;可見SVN可自動識別出開發者具體修改什么代碼,在合並時,只要知道SVN版本號,它會自動找出修改過的代碼,然后合並到最終目標文件中。因此使用SVN來合並代碼具有合並質量高以及高效的特點。 SVN的合並有三種類型,如下圖:

第一種類型:合並一個版本范圍
該類型是根據SVN指定的版本號來合並,也是最靈活的一種合並方式,可以是主干合並到分支,或分支合並到主干;主要應用場景是把分支或主干里面的一部分修改同步到主干或分支中去;甚至支持不同庫的兩個分支,當然這兩個分支要求是相同的目錄結構。

第二中類型:復興分支
把分支合並到主干上,這里會把所有分支的修改,都合並到主干中,如果只想合並一部分,不合適使用該類型;而且這種類型合並受限的條件比較多,如分支和主干必須是在同一個庫,本地工作目錄不能夠包含有被修改過的文件等。

第三種類型:合並兩個不同的樹
把兩個分支的差異合並到本地的工作目錄;其實它也可以把分支的代碼同步到主干中,只需要把合並的from指定為主干URL,to指定為分支URL, 而本地工作目錄是主干。

四、利用SVN合並具體步驟

在上面的三中類型中,最常用最靈活的是第一中類型:“合並一個版本范圍”,也是我用得最多的一種合並類型。下面以這個類型為例,來介紹合並的整個過程,假設是從分支合並到主干。對於另外的兩種類型合並都差不多;這里就不一一介紹了。

1.把主干check out 到本地,並確保文件更新到最新狀態

2.按照下圖示打開合並對話框:

3.選擇合並類型:

根據合並類型進行選擇,這里的例子中是選擇第一個類型,然后再點“Next”按鈕。

4.填寫SVN URL和版本號信息:

“URL to merge from”下拉框選擇需要合並分支或主干,在例子中,選擇的是分支v1.0;在“revision range to merge”文本框選擇具體需要合並的SVN版本號,可通過“show log”按鈕查看有哪些版本號。可選擇具體的版本號,也可以選擇一個區間的版本號,如4-7,表示從SVN版本號4-7的全部合並。如選擇區間版本號,需按住shift鍵。輸入各項信息后,再點“next”。

5.合並選項的選擇

在這個步驟中,主要是針對檢索深度、行的結束符、空格選項的合並做設置,這里選擇默認選項即可。

6.測試合並

在上面步驟中,直接點“test merge”按鈕來測試合並結果。如果有沖突,則會有提示有沖突:

7.開始合並

在步驟6中,直接點擊“merge”按鈕將會開始合並, 如沒有沖突時,合並后的對話框將是下面的截圖:

8.處理沖突

合並后有沖突時,彈出的對話框如下圖,注意此時“resolved”按鈕是灰色:

點“edit conflict”按鈕,將打開SVN的合並對話框,讓開發者進行手工合並:
 

通過手工合並后,合並后的代碼將在下面窗口中顯示,確認合並完畢,點工具欄上的第二個保存圖標進行保存,並關閉當前合並的對話框;回到處理沖突的對話框中,會發現之前“resolved”按鈕是灰色,現在變成可點按鈕:

點“resolved”按鈕,至此,當前的沖突已解決;SVN會繼續合並后面的版本。

9.提交代碼

合並完代碼后,最后別忘記提交代碼,同時要輸入注釋,方便日后追溯。注釋參考格式如下:從[分支或主干]合並代碼到[主干或分支],版本號是從[開始的版本號]到[結束的版本號];

五、注意事項或建議 

1.在使用SVN進行合並時,如何知道哪些版本號是合並過呢?在查看日志對話框中,已合並過版本號會變成灰色。

2.在修改代碼時,建議遵循最小化修改原則,就是在修改代時,不要隨意增加空格、空行和格式化、甚至包括文件的編碼,有助於方便合並代碼。

3.圖片無法進行自動合並,但可利用SVN自帶的圖片對比工具來對比。

4.建議合並時,使用“test merge”來查看有多少沖突,如果沖突較多,可分多次合並,減少合並的復雜性。