svn分支和合並實戰(圖解)
被svn分支和合並折騰了兩天了。適才終於搞定了分支和合並的問題,打包部署成功了。總結下,以防遺忘。專案前段時間因為要加入OSGi的blueprint方法釋出和獲取服務,從svn主幹上做了分支。如今分支的開發完成了,要求合併到主幹中。svn的目錄結構如下:
主幹trunk:
https://192.168.0.11:8443/svn/code/product/trunk/專案名稱/code/OSGiServer/plugins/com.tzf.svn.test
tag:
https://192.168.0.11:8443/svn/code/product/tag
分支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 下載win2svn檔案:Setup-Subversion-1.6.13。安裝,在cmd下,svn 命令就可以了。下載這個的作用有兩個:檢視分支分出時的版本和解決合併衝突。
我這裡是從分支合併到主幹,
被操作物件: 主幹
From : 主幹的 打出分支時的版本
To: 分支的 Head版本 (最新版本)
怎麼理解這個 From 和 To 呢 ? 似乎跟我們的想當然不太一樣:因為我們理解,把分支合併到主幹,肯定是 From 分支,To 主幹。怎麼搞反了呢?
實際上, Svn 認為,我們要合併的,是從主幹的某個版本開始,到分支的某個版本結束。兩邊的版本號實際上是一套系統,不會有重複。
比如我主幹的結構如下:
現在在分支裡做點修改,比如我加個類叫Bean2.java,並且提交。如圖:
好啦,現在將工程切換到主幹裡,因為從分支合併到主幹,被操作物件是主幹工程。
要合併得知道分支分出去時的版本號,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是找不到當初打分支時的版本的。
被svn合併折騰了兩天,也許還有OSGi複雜的原因,問題算是解決了,但是也是非常的繁瑣。希望能看到網友朋友更好的方法分享。