一、基本概念
trunk: 主幹(可以理解爲開發環境的代碼,平常做開發的工作目錄)
branches:從主幹拷貝了一份代碼重新在svn服務器上的建了個分支目錄(通常叫branch,一般與生產上的代碼保持同步)
tag:主幹版本標記(標識每次大的升級版本號)
二、管理原則
1、系統在沒有上線之前,只有一個主幹(trunk),所有開發人員在主幹上進行協同開發。
2、系統上線之後,在主幹的基礎上創建一個分支,該分支上主要用於修復生產環境的BUG,或者緊急新功能上線。主幹仍然進行新功能模塊的開發。
3、每次生產環境的升級,都從分支上進行打包部署。升級完之後需將分支上改動的代碼及時合併到主幹上(開發人員常常忘記,切記)。
4、新功能在主幹上開發好了,需要進行一次大的升級,可以先將主幹打上一個TAG做爲大版本號,並且同時在此基礎上創建一個對應的分支,然後切換到分支上進行打包部署,這個版本的生產代碼維護也在分支上。
原則:分支用於生產代碼維護,主幹用於平時開發,TAG用於主幹大版本的標記。
三、合併
合併根據目標不同分爲2種:
1、分支合併到主幹:主要用在修復完生產BUG,並上線之後。需把改動的代碼合併到主幹上。
2、主幹合併到分支:公用的邏輯改動,需反映到所有並行的分支上。
注意:合併是要在目標目錄上進行操作的,如:分支合併到主幹(主幹爲目標),需切換到主幹上操作合併功能,主幹合併到分支(分支爲目標),需切換到分支上進行操作。
第一個選項:合併指定的版本,可以是從分支合併到主幹,也可以是主幹合併的版本,主要作用把分支的部分修改合併到主幹上。
第二個選項:將主幹上的修改合併到分支。
第三個選項:兩個不同的分支合併,但其實也可以是分支和主幹的合併,只要from選擇爲主幹就行。
通常選擇第一項或第三項進行操作,這裏需要注意的是:
這裏其實就是比對TO版本和FROM版本的差異,並把差異合併到TO的當前版本(head版本)中去。
注:如果要把分支所有的修改合併到主幹上,FROM需要選擇主幹創建見分支時的版本號,TO選擇分支最新版本(head版本)就行了。
如果FROM也選擇主幹head版本,TO也選擇head版本,就會把所有分支與主幹不同的差異覆蓋到當前主幹上來。造成主幹的文件被分支覆蓋。
舉例(分支合併到主幹):
主幹trunk:
https://192.168.0.11:8443/svn/code/product/trunk/項目名稱/code/OSGiServer/plugins/com.tzf.svn.test
分支branches:
https://192.168.0.11:8443/svn/code/product/branches/項目名稱/code/OSGiServer/plugins/com.tzf.svn.test
先 從http://subversion.apache.org/packages.html#windows 下載win32svn文件:Setup-Subversion-1.6.13。安裝,在cmd下,svn 命令就可以了。下載這個的作用有兩個:查看分支分出時的版本和解決合併衝突。
被操作對象: 主幹
From : 主幹的 打出分支時的版本
To: 分支的 Head版本 (最新版本)
好啦,現在將工程切換到主幹裏,因爲從分支合併到主幹,被操作對象是主幹工程。
要合併得知道分支分出去時的版本號,cmd打開命令行,使用svn log --verbose --stop-on-copy 【branch_path】查看版本更新信息,如圖:
找到最下版本信息,這裏就是r8623,記住這個版本號,以後合併的from就是從這個版本號開始的。to就是指你想要合併的版本號,一般都是最新版本,當然也可以是指定版本。
切換到主幹,選中工程,右鍵team -> 合併:
next,出現(如果沒提交要先提交)
from就是分支的路徑,下面選擇的就是剛剛記下的分支分出的版本號,to這裏就是合併到那個版本,我這裏選擇的最新版本。點finish,如果文件有衝突就彈出詢問框,選擇現在暫時不處理就行。
我這裏沒有出現文件衝突,點ok就基本大功告成。這時需要在主幹裏體檢帶修改符號的文件,完成提交就搞定了合併。
如果文件衝突了怎麼辦呢,在命令行下進入衝突文件的目錄,用svn命令行客戶端鍵入:svn resolved 衝突的文件名 就可以解除衝突。
好了這是從分支到主幹的合併。還有兩種合併:從主幹到分支和從分支到分支,操作也是大同小異。具體參考如下:
從主幹合併到分支
試想這樣的情況:一個項目裏面,要獨立出來一個子項目,需要單獨發佈版本,用到了基礎框架代碼,而基礎框架在主幹中不斷修改完善,這就需要從主幹合併到分支。
被操作對象: 分支
From: 分支的第一個版本(最舊版本)
To: 主幹的Head版本(最新版本)
相當於從分支的第一個版本開始一直到主幹最後一個版本結束合併之後,替換分支。
從分支合併到分支
有 這樣的需求:一個項目中有很多分支,這些分支需要分期上線,有多個工作並行,但每一期之間不能相互影響,這就可以打出幾個tag(也是分支),從主幹 copy而來。其他主幹根據排期分別合併到這些tag中來。比如有prjTag1和prjTag2,model1、model2需要合併到prjTag1 中,model3、model4需要合併到prjTag2中。拿prjTag1舉例:
在prjTag1的work copy中,merge
From : 主幹的 打出分支時的版本
To: 分支的 Head版本 (最新版本)
注意: From不是本Tag的某個版本,而是之前主幹打出分支時的版本,最終Merge到prjTag1的work copy,而prjTag1是找不到當初打分支時的版本的。
四、分支
需求:branches開發完切一個分支到tags
TortoriseSVN--->Branch/tag,選擇tags存放路徑。