分支的基本概念就正如它的名字,
開發的一條線獨立於另一條線,
如果回顧歷史,
可以發現兩條線分享共同的歷史,
一個分支總是從一個
備份開始的,
從那裏開始,
發展自己獨有的歷
史(
如下圖所示
)
⑴
創建分支
假設目前我們版本庫中的項目的佈局如下圖:
如圖所示,我們的項目放在了trunk
(主線)目錄,另外還有branch(
分支)
和tags(
標籤)
目錄,這樣的佈局是爲了更清晰的區別主線、分支和標籤三者的位置。
subversion
對分支和標籤是通過複製一份最新的版本庫的快照來實現的。
開始創建分支:
在我們CheckOut
的主線目錄(trunk)
上,右鍵點擊然後選擇
“Branch/tag…”
在彈出的窗口中,將To
Url
指向branch
目錄並輸入分支的具體目錄名,這裏是mybranch1.0
,我們即將創建的分支便存放於此處,點擊OK
。
Update
一下本地的branch
目
錄,你就可以看到你剛剛創建的分支“mybranch1.0”
,這樣一來我們的分支就創建完成了。
創建分支的最大的目的就是跟主線進行並行開發的時候不影響主
線的開發。
因爲你在分支上所做的提交都只存於分支上,主線上的Update
是看不到分支的修改的。如下圖所示,trunk
只
能看到r344
的版本,並看不到r343
的
版本。
(什麼時候應該使用分支呢?例如你接到了一個任務,完成這個任務需要三四個人的合作,你們之間需要
共享資源,那們就可以創建一個專爲這次任務的分支,參與此次任務的人員則在分支上做開發,等完成之後再合併到主線上,纔不會出現將實現了一半的不完成功能
也提交到主線上,影響主線的正常工作。又或者自己需要一個較長的開發週期來完成任務,這麼長的時間內如果一直沒有將資源進行提交,萬一丟失了就前功盡棄
了。當然分支不是隻用於此類情況,還有其它很多種情況也能使用分支來達到目的。)
使用
分支需要注意,
由於長期的獨立開發,可能會在合併回主線時出現較多的衝突。所以在支線上開發間期如
果發現主幹有更新,而且這個更新有可能將來跟你產生衝突,那你可以先將主線的內容合併到分支上。已免等到做了大量修改再來更新。(
其實此過程跟分支合併到主線上是一樣的操作,只是目的地不同。
)
例如我們在主線上的版本爲3
,我們
如何將此版本的信息合併到分支上呢?
Merge…”
。
à
在分支的根目錄上右鍵點擊,選擇
“TortoiseSVN
在這裏我們必需先弄明白一個合併背後的關健概念
合併
的過程中發生的所有事:
首先兩個版本庫樹的比較,然後將區別應用到本地拷貝
.
這個命令是包括三個參數的
:
1.
初始的版本樹 2.
最終的版本樹 3
一個接收區別的工作拷貝。
弄
明白這些概念之後我們繼續往下操作。
在彈出的窗口中,選擇主線目錄和其
版本號(
初始的版本樹)
,再選擇主線目錄和
最新的版本號(最終的版本樹),這裏也可以是某一個版本號但應該比初始的版本樹的版本號要高,接收區默認爲你右鍵所指的目錄,這裏是mybranch1.0
。
在
合併之前我們可以通過點擊“Unified diff”
,查看兩版本樹之間所有文件的內容的變化,“diff”
顯示出有發生變化的文件列表,“dry run”
能
顯示真正合並時的狀態信息,但並沒有做任何的合併操作。
我們點擊“Merge”
。
在點擊“Merge”
,
合併後的文件(即對分支上的文件補上了主線上修改的內容),如無衝突則可以在分支上像其它文件一樣使用了,如果合併後的內容不滿意,可以通過撤銷來取消這
次的合併操作,前提是未對合並後的文件做提交操作。
分支合併到主線跟從主線上
合併內容到分支上類似
不同的是
1
、開始的版本庫是分支創建的版本
2
、結束的版本庫是完成所以開發工作之後的版本
3
、應用的目的是主線目錄
關於轉換工作拷貝、標籤(標籤在Subversion
中
跟分支是相同原理的,一個不去做任何的修改的分支就是版本庫某一時刻的一個快照,相當於爲某一個版本做了一個標籤)
====================================================
圖文:
首先說下爲什麼我們需要用到分支-合併。比如項目demo下有兩個小組,svn
下有一個
trunk版。由於客戶需求突然變化,導致項目需要做較大改動,此時項目組決定由小組1繼續完成原來正進行到一半的工作【某個模塊】,小組2進行新需求的
開發。那麼此時,我們就可以爲小組2建立一個分支,分支其實就是trunk版【主幹線】的一個copy版,不過分支也是具有版本控制功能的,而且是和主幹
線相互獨立的,當然,到最後我們可以通過【合併】功能,將分支合併到trunk上來,從而最後合併爲一個項目。
下面是在eclipse下使用subeclipse插件詳細使用過程:
首先建立一個工程,名字叫Facebook
1.建立分支,爲新的分支指定訪問URL:Facebook3[註釋不要忘了]
2.建立好分之後,使用“切換”功能切換到分支下進行開發。
我新建了一個FB3.html的文件並在分支下進行提交。
3.切換回trunk版【即URL爲Facebook的版本】
你會發現trunk版裏並沒有出現我們剛剛提交的FB3.html,因爲FB3.html是屬於分支的,接下來我們要做的就是“合併”,通過合
並,我們可以將分支下進行的更改合併到trunk版裏。
下面是合併的主要配置:
起始路徑:trunk版的路徑【若需要把trunk版的改動合併到分支則相反】
目標路徑:從哪裏獲取改動【這裏是分支路徑】
你可以使用指定的版本號,這裏採用最新修訂版。
4.點擊合併,你會發現trunk版下新增了一個文件FB3.html
這樣我們就將分支下所做的改動合併到了trunk版裏。
值得注意的是:
1.在建立分支的時候最好添加註釋。
2.進行合併前最好保證兩個版本都是乾淨的【即沒有未提交或者衝突的文件存在】
3.合併時的目標路徑:需要把誰的改動合併到其他版本就填誰的URL。
整個過程的SVN
命令行輸出如下:
- copy -rHEAD svn ://192.168.1.192/placii/staggingarea/xiangqi/Facebook svn ://192.168.1.192/placii/staggingarea/xiangqi/Facebook3
- propset subclipse:tags "1538,Facebook2,/Facebook2,branch
- 1540,Facebook3,/Facebook3,branch" E:/myeclipse /workspace/Facebook
- switch svn ://192.168.1.192/placii/staggingarea/xiangqi/Facebook3 E:/myeclipse /workspace/Facebook -rHEAD
- At revision 1541.
- add -N E:/myeclipse /workspace/Facebook/WebRoot/FB3.html
- A E:/myeclipse /workspace/Facebook/WebRoot/FB3.html
- commit -m "" E:/myeclipse /workspace/Facebook/WebRoot/FB3.html
- Adding E:/myeclipse /workspace/Facebook/WebRoot/FB3.html
- Transmitting file data ...
- Committed revision 1542.
- switch svn ://192.168.1.192/placii/staggingarea/xiangqi/Facebook E:/myeclipse /workspace/Facebook -rHEAD
- D E:/myeclipse /workspace/Facebook/WebRoot/FB3.html
- Updated to revision 1542.
- ===== File Statistics: =====
- Deleted: 1
- merge svn ://192.168.1.192/placii/staggingarea/xiangqi/Facebook@HEAD svn ://192.168.1.192/placii/staggingarea/xiangqi/Facebook3@HEAD E:/myeclipse /workspace/Facebook
- A E:/myeclipse /workspace/Facebook/WebRoot/FB3.html
- Merge complete.
- ===== File Statistics: =====
- Added: 1
希望本文能有所幫助。
其他參考資料:
http://www.javaeye.com/wiki/subclipse/1626-subclipse-getting-started-guide-and-reference-c