分支的基本概念就正如它的名字,開發的一條線獨立於另一條線,如果回顧歷史,可以發現兩條線分享共同的歷史,一個分支總是從一個備份開始的,從那里開始,發展自己獨有的歷史(如下圖所示)
⑴創建分支
假設目前我們版本庫中的項目的布局如下圖:
如圖所示,我們的項目放在了trunk(主線)目錄,另外還有branch(分支)和tags(標簽)目錄,這樣的布局是為了更清晰的區別主線、分支和標簽三者的位置。
subversion對分支和標簽是通過復制一份最新的版本庫的快照來實現的。
開始創建分支:
在我們CheckOut的主線目錄(trunk)上,右鍵點擊然后選擇“Branch/tag…”
在彈出的窗口中,將To Url 指向branch目錄並輸入分支的具體目錄名,這里是mybranch1.0,我們即將創建的分支便存放於此處,點擊OK。
Update一下本地的branch目錄,你就可以看到你剛剛創建的分支“mybranch1.0”,這樣一來我們的分支就創建完成了。
創建分支的最大的目的就是跟主線進行並行開發的時候不影響主線的開發。
因為你在分支上所做的提交都只存於分支上,主線上的Update是看不到分支的修改的。如下圖所示,trunk只能看到r344的版本,並看不到r343的版本。
(什么時候應該使用分支呢?例如你接到了一個任務,完成這個任務需要三四個人的合作,你們之間需要共享資源,那們就可以創建一個專為這次任務的分支,參與此次任務的人員則在分支上做開發,等完成之后再合並到主線上,才不會出現將實現了一半的不完成功能也提交到主線上,影響主線的正常工作。又或者自己需要一個較長的開發周期來完成任務,這么長的時間內如果一直沒有將資源進行提交,萬一丟失了就前功盡棄了。當然分支不是只用於此類情況,還有其它很多種情況也能使用分支來達到目的。)
使用分支需要注意,由於長期的獨立開發,可能會在合並回主線時出現較多的沖突。所以在支線上開發間期如果發現主干有更新,而且這個更新有可能將來跟你產生沖突,那你可以先將主線的內容合並到分支上。已免等到做了大量修改再來更新。(其實此過程跟分支合並到主線上是一樣的操作,只是目的地不同。)
例如我們在主線上的版本為3,我們如何將此版本的信息合並到分支上呢?
在分支的根目錄上右鍵點擊,選擇“TortoiseSVNMerge…”。
在這里我們必需先弄明白一個合並背后的關健概念
合並的過程中發生的所有事:首先兩個版本庫樹的比較,然后將區別應用到本地拷貝.
這個命令是包括三個參數的:
1. 初始的版本樹 2.最終的版本樹 3一個接收區別的工作拷貝。
弄明白這些概念之后我們繼續往下操作。
在彈出的窗口中,選擇主線目錄和其版本號(初始的版本樹),再選擇主線目錄和最新的版本號(最終的版本樹),這里也可以是某一個版本號但應該比初始的版本樹的版本號要高,接收區默認為你右鍵所指的目錄,這里是mybranch1.0。
在合並之前我們可以通過點擊“Unified diff”,查看兩版本樹之間所有文件的內容的變化,“diff”顯示出有發生變化的文件列表,“dry run”能顯示真正合並時的狀態信息,但並沒有做任何的合並操作。
我們點擊“Merge”。
在點擊“Merge”,合並后的文件(即對分支上的文件補上了主線上修改的內容),如無沖突則可以在分支上像其它文件一樣使用了,如果合並后的內容不滿意,可以通過撤銷來取消這次的合並操作,前提是未對合並后的文件做提交操作。
分支合並到主線跟從主線上合並內容到分支上類似
不同的是
1、開始的版本庫是分支創建的版本
2、結束的版本庫是完成所以開發工作之后的版本
3、應用的目的是主線目錄
關於轉換工作拷貝、標簽(標簽在Subversion中跟分支是相同原理的,一個不去做任何的修改的分支就是版本庫某一時刻的一個快照,相當於為某一個版本做了一個標簽)
----------------------
Svn管理項目是很普遍的。很多公司都用這個。
這次有一個需求比較復雜,做的時間可能很長,在這段時間內又要正常發布版本。為了這個新的功能不影響這些發布的版本,我們會進行分支開發。
分支開發遇到的問題很多啊。下面說一下步驟:
創建分支
在項目的trunk分支下右擊項目出現下拉—>Team—>分支/標記
出現以上界面
上面的到“URL:”輸入框里面填寫要將項目copy到的分支URL,一般我們在trunk目錄的項目路徑獲取之后,比如
http://xxx.com/repos/android/trunk
我們只需要將路徑中從trunk開始到最后改為branches/分支的項目名稱.(名字隨便起,不過一般要起有意義的)。
注意:如果你可以直接管理svn服務器,那么在branches下不要存在新的分支項目名稱,不然創建分支不成功。意思就是比如我創建分支到branches下的ProjectOne目錄,我的地址就是:http://xxx.com/repos/android/branches/ProjectOne,這時候在svn服務器不能已經存在這個ProjectOne目錄。
然后一路next到下面界面:
這里面有一個“切換工作復本為新的分支/標記”,就是是否在分支創建完成后自動切換到新分支。
我選擇的是不自動。我們手動切換。
右擊項目—>Team-->切換
進入:
至URL里面寫分支的URL
點擊OK就可以了。
分支合並到主干
分支開發結束要將代碼合並到主干中。
分支合並到主干步驟:
1、 將分支中改動的代碼全部提交。
2、 切換到trunk
3、 右擊項目—>Team-->合並
選擇merge two different trees
然后不要選中左下角的Perform pre-merge best practices checks(這個一定不要選中,不然后面不可操作),點擊next
進入
上面的from 要寫分支的URL,點擊Revision輸入框右邊的Select按鈕,選擇一個分支的版本,這個一般都選最新的。
To 選擇HEADRevision 點擊next。
進入:
點擊finish,就ok了。
這個時候由於分支上面改動了一些代碼,而trunk里面也有代碼的修改。我們可能要做一下手動的解決沖突。
這樣分支合並到主干就OK了。