一、基本概念
trunk: 主干(可以理解為開發(fā)環(huán)境的代碼,平常做開發(fā)的工作目錄)
branches:從主干拷貝了一份代碼重新在svn服務器上的建了個分支目錄(通常叫branch,一般與生產上的代碼保持同步)
tag:主干版本標記(標識每次大的升級版本號)
二、管理原則
1、系統(tǒng)在沒有上線之前,只有一個主干(trunk),所有開發(fā)人員在主干上進行協(xié)同開發(fā)。
2、系統(tǒng)上線之后,在主干的基礎上創(chuàng)建一個分支,該分支上主要用于修復生產環(huán)境的BUG,或者緊急新功能上線。主干仍然進行新功能模塊的開發(fā)。
3、每次生產環(huán)境的升級,都從分支上進行打包部署。升級完之后需將分支上改動的代碼及時合并到主干上(開發(fā)人員常常忘記,切記)。
4、新功能在主干上開發(fā)好了,需要進行一次大的升級,可以先將主干打上一個TAG做為大版本號,并且同時在此基礎上創(chuàng)建一個對應的分支,然后切換到分支上進行打包部署,這個版本的生產代碼維護也在分支上。
原則:分支用于生產代碼維護,主干用于平時開發(fā),TAG用于主干大版本的標記。
三、合并
合并根據目標不同分為2種:
1、分支合并到主干:主要用在修復完生產BUG,并上線之后。需把改動的代碼合并到主干上。
2、主干合并到分支:公用的邏輯改動,需反映到所有并行的分支上。
注意:合并是要在目標目錄上進行操作的,如:分支合并到主干(主干為目標),需切換到主干上操作合并功能,主干合并到分支(分支為目標),需切換到分支上進行操作。
第一個選項:合并指定的版本,可以是從分支合并到主干,也可以是主干合并的版本,主要作用把分支的部分修改合并到主干上。
第二個選項:將主干上的修改合并到分支。
第三個選項:兩個不同的分支合并,但其實也可以是分支和主干的合并,只要from選擇為主干就行。
通常選擇第一項或第三項進行操作,這里需要注意的是:
這里其實就是比對TO版本和FROM版本的差異,并把差異合并到TO的當前版本(head版本)中去。
注:如果要把分支所有的修改合并到主干上,F(xiàn)ROM需要選擇主干創(chuàng)建見分支時的版本號,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版本 (最新版本)
好啦,現(xiàn)在將工程切換到主干里,因為從分支合并到主干,被操作對象是主干工程。
要合并得知道分支分出去時的版本號,cmd打開命令行,使用svn log --verbose --stop-on-copy 【branch_path】查看版本更新信息,如圖:
找到最下版本信息,這里就是r8623,記住這個版本號,以后合并的from就是從這個版本號開始的。to就是指你想要合并的版本號,一般都是最新版本,當然也可以是指定版本。
切換到主干,選中工程,右鍵team -> 合并:
next,出現(xiàn)(如果沒提交要先提交)
from就是分支的路徑,下面選擇的就是剛剛記下的分支分出的版本號,to這里就是合并到那個版本,我這里選擇的最新版本。點finish,如果文件有沖突就彈出詢問框,選擇現(xiàn)在暫時不處理就行。
我這里沒有出現(xiàn)文件沖突,點ok就基本大功告成。這時需要在主干里體檢帶修改符號的文件,完成提交就搞定了合并。
如果文件沖突了怎么辦呢,在命令行下進入沖突文件的目錄,用svn命令行客戶端鍵入:svn resolved 沖突的文件名 就可以解除沖突。
好了這是從分支到主干的合并。還有兩種合并:從主干到分支和從分支到分支,操作也是大同小異。具體參考如下:
從主干合并到分支
試想這樣的情況:一個項目里面,要獨立出來一個子項目,需要單獨發(fā)布版本,用到了基礎框架代碼,而基礎框架在主干中不斷修改完善,這就需要從主干合并到分支。
被操作對象: 分支
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開發(fā)完切一個分支到tags
TortoriseSVN--->Branch/tag,選擇tags存放路徑。