1. 程式人生 > >SVN的分支與合併功能詳解

SVN的分支與合併功能詳解

分支的基本概念就正如它的名字,開發的一條線獨立於另一條線,如果回顧歷史,可以發現兩條線分享共同的歷史,一個分支總是從一個備份開始的,從那裡開始,發展自己獨有的歷史(如下圖所示)



⑴建立分支
假設目前我們版本庫中的專案的佈局如下圖:



如圖所示,我們的專案放在了trunk(主線)目錄,另外還有branch(分支)和tags(標籤)目錄,這樣的佈局是為了更清晰的區別主線、分支和標籤三者的位置。
subversion對分支和標籤是通過複製一份最新的版本庫的快照來實現的。

開始建立分支:
在我們CheckOut的主線目錄(trunk)上,右鍵點選然後選擇“Branch/tag…”



在彈出的視窗中,將To Url 指向branch目錄並輸入分支的具體目錄名,這裡是mybranch1.0,我們即將建立的分支便存放於此處,點選OK。



Update一下本地的branch目錄,你就可以看到你剛剛建立的分支“mybranch1.0”,這樣一來我們的分支就建立完成了。




建立分支的最大的目的就是跟主線進行並行開發的時候不影響主線的開發。
因為你在分支上所做的提交都只存於分支上,主線上的Update是看不到分支的修改的。如下圖所示,trunk只能看到r344的版本,並看不到r343的版本。



(什麼時候應該使用分支呢?例如你接到了一個任務,完成這個任務需要三四個人的合作,你們之間需要共享資源,那們就可以建立一個專為這次任務的分支,參與此次任務的人員則在分支上做開發,等完成之後再合併到主線上,才不會出現將實現了一半的不完成功能也提交到主線上,影響主線的正常工作。又或者自己需要一個較長的開發週期來完成任務,這麼長的時間內如果一直沒有將資源進行提交,萬一丟失了就前功盡棄了。當然分支不是隻用於此類情況,還有其它很多種情況也能使用分支來達到目的。)
使用分支需要注意,由於長期的獨立開發,可能會在合併回主線時出現較多的衝突。所以在支線上開發間期如果發現主幹有更新,而且這個更新有可能將來跟你產生衝突,那你可以先將主線的內容合併到分支上。已免等到做了大量修改再來更新。(其實此過程跟分支合併到主線上是一樣的操作,只是目的地不同。)

例如我們在主線上的版本為3,我們如何將此版本的資訊合併到分支上呢?


在分支的根目錄上右鍵點選,選擇“TortoiseSVNMerge…”。




在這裡我們必需先弄明白一個合併背後的關健概念
合併的過程中發生的所有事:首先兩個版本庫樹的比較,然後將區別應用到本地拷貝.
這個命令是包括三個引數的:
1. 初始的版本樹 2.最終的版本樹 3一個接收區別的工作拷貝。
弄明白這些概念之後我們繼續往下操作。
在彈出的視窗中,選擇主線目錄和其版本號(初始的版本樹),再選擇主線目錄和最新的版本號(最終的版本樹),這裡也可以是某一個版本號但應該比初始的版本樹的版本號要高,接收區預設為你右鍵所指的目錄,這裡是mybranch1.0。

在合併之前我們可以通過點選“Unified diff”,檢視兩版本樹之間所有檔案的內容的變化,“diff”顯示出有發生變化的檔案列表,“dry run”能顯示真正合並時的狀態資訊,但並沒有做任何的合併操作。
我們點選“Merge”。



在點選“Merge”,合併後的檔案(即對分支上的檔案補上了主線上修改的內容),如無衝突則可以在分支上像其它檔案一樣使用了,如果合併後的內容不滿意,可以通過撤銷來取消這次的合併操作,前提是未對合並後的檔案做提交操作。

分支合併到主線跟從主線上合併內容到分支上類似
不同的是
1、開始的版本庫是分支建立的版本
2、結束的版本庫是完成所以開發工作之後的版本
3、應用的目的是主線目錄

關於轉換工作拷貝、標籤(標籤在Subversion中跟分支是相同原理的,一個不去做任何的修改的分支就是版本庫某一時刻的一個快照,相當於為某一個版本做了一個標籤)