跳到主要內容

講解 Subversion 分支與合併:以 TortoiseSVN 為例

在實務的版本控管情境中,套用分支與合併應該是最方便不過的了,會用的人可以得到許多版本控管的好處,但不會用的人卻會因為不理解而害怕使用它,由於 Subversion 1.5 開始新增了 Merge Tracking 功能,可有效降低維護分支的負擔,所以能學會分支與合併的技巧對整個版本管理流程來說會有非常大的幫助,今天我就來講解幾個利用 TortoiseSVN 實際的操作分支與合併的例子。

如下圖是一個很常見的分支示意圖,當你想在 trunk 發展一個新功能時,你可以透過 svn copy 的方式將整個 /calc/trunk 廉價複製/calc/branches/my-calc-branch,當 /calc/branches/my-calc-branch 分支完成所有新功能開發後,再將所有變更一次合併回 /calc/trunk 開發主線。

我講的 svn copy 其實就是對應到 TortoiseSVN 的 Branch/tag 功能

使用時應注意以下:

  1. 你要廉價複製的來源路徑
  2. 你要廉價複製的目的路徑 (「複製」就等同於「分支」,這是 SVN 附加上去的意義 )
  3. 寫下你為什麼要建立這個分支、用途是什麼,這訊息可以給團隊成員或版本經理看
  4. 我們可以在執行 Copy (Branch/tag) 的同時順便將你的「工作目錄」切換至「分支的路徑」

這時我們可以看一下 trunk 這個目錄的屬性,並切換至 Subversion 頁籤,你會發現該「工作目錄」所對應到的 Subversion 路徑已經變更到 /calc/branches/my-calc-branch 了。

但為了怕初學者混淆,我還是先將 /calc/trunk 切換回原本的 SVN 路徑:

這裡有幾點注意:

  1. 這裡是你的「工作目錄」(Working Copy)
  2. 這裡才是你要將「工作目錄」切換到的 SVN 路徑,也就是將 /calc/branches/my-calc-branch 切換至 /calc/trunk 路徑

這時你便可以開始在 /calc/branches/my-calc-branch 發展你這次想要新增的功能,且不會影響到其他團隊成員正在發展或維護的 /calc/trunk 開發主線。

也許過了一段時間,原本的 /calc/trunk 開發主線可能已經有其他團隊成員陸續修正了一些 Bugs,但這時你的分支 /calc/branches/my-calc-branch 就可以直接套用 開發主線 ( /calc/trunk ) 的更新,除了避免重複的工作外 (重複除錯),也可以避免版本的衝突發生,因為兩個人改同一個已知的 Bug 可能會因為用不同方法除錯或命名的方式不一致而發生衝突。

經常將 開發主線 ( /calc/trunk ) 的變更透過 svn merge 合併至 分支線路 ( /calc/branches/my-calc-branch ) 是一個非常好的習慣,這樣才不會讓你因為脫離 開發主線(trunk) 過久而導致將 分支線路 ( /calc/branches/my-calc-branch ) 合併回 開發主線 ( /calc/trunk ) 時發生許多版本衝突。

開發主線 ( /calc/trunk ) 合併至 分支線路 ( /calc/branches/my-calc-branch ) 通常選第 1 個,也就是 [Merge a range of revisions]

在 Merge 的視窗有以下注意事項:

  1. 設定要合併的來源,由於我們打算從 開發主線 ( /calc/trunk ) 合併分支這段時間所產生的變更至 分支線路 ( /calc/branches/my-calc-branch ),所以合併的來源要選擇 /calc/trunk 才對!
  2. 合併的結果會直接與目前「工作目錄」(Working Copy) 做比對,並修改目前工作目錄中的所有檔案。因此建議在做合併之前可以將所有尚未 commit 的檔案先 commit 到版本庫,避免不必要的衝突事件發生。

在正式進行合併(Merge)之前,建議先執行 Test merge 看看是否會發生什麼事!

若無異狀則可直接按下 [Merge] 按鈕進行合併動作,這時從 開發主線 ( /calc/trunk ) 分支出來的到目前工作目錄的版本就會做個比較,然後直接套用變更到你現有的檔案、目錄或屬性裡。

在合併之後如果沒有發生衝突,不代表真的沒衝突,所以必須再次對原始碼做出驗證後才能 commit 進版本庫,建議可參考以下流程:

  1. 將專案進行建置(Build)
  2. 如果沒問題再對專案進行單元測試(Unit Testing)或手動測試(Manual Testing)
  3. 如果都沒問題再 commit 目前合併無誤的版本到版本庫!

最後我們的 my-calc-branch 分支已經將新功能開發完成且測試無誤,所以要將 分支線路 ( /calc/branches/my-calc-branch ) 的最終版本合併回 開發主線 ( /calc/trunk ),這時的手續如下:

分支線路 ( /calc/branches/my-calc-branch ) 合併回 開發主線 ( /calc/trunk ) 通常選第 2 個,而特別選擇 [Reintegrate a branch] 這個選項是很重要的,因為這有以下好處:

  1. 讓 Subversion 能知道 開發主線 ( /calc/trunk ) 是從哪個分支、哪些版本合併進來的
  2. 有效節省 Subversion Repository (SVN儲存庫) 的空間,因為不用重複儲存分支的所有變更資訊
  3. 可以產生 Revision graph 得知專案開發的分支狀況

一樣可以先 測試合併(Test merge) 再正式進行 合併(Merge)

合併完後再將變更 commit 到版本庫

分支線路 ( /calc/branches/my-calc-branch ) 合併回 開發主線 ( /calc/trunk ) 並 commit 了之後,該分支就沒用了,該分支如果未來不再更新或繼續開發,Subversion 也不會繼續追蹤這個分支的變更 (因為之前已經 Reintegrate 過了),建議將該分支刪除。

刪除後要記得 commit 才能將「刪除動作」寫入到 Subversion Repository (SVN儲存庫) 中

以上就是一個 Subversion 分支與合併的完整過程,但有許多很細部的觀念我很難在一篇文章裡講清楚,如有時間建議多閱讀 Subversion 線上文件,當你建立起更多更完整的觀念後,對 Subversion 甚至是其他版本管理工具應該都能夠更加得心應手!

相關連結

留言

這個網誌中的熱門文章

[試用心得] 日本無線上網超Wi-Ho(走SoftBank),一日不限流量NT299,可供多人使用,林氏璧讀者九五折優惠。

[試用心得] 日本無線上網超Wi-Ho(走SoftBank),一日不限流量NT299,可供多人使用,林氏璧讀者九五折優惠。 p.s.上面這張圖的吃到飽是錯的,Docomo小白機從去年就有限流量了,但特樂通聲稱Soft Bank小紅機是沒有限流量的。 我 是一個重度網路使用者,因為我有一個部落格需要管理。即使是在旅行的時候,我也很難忍受一天不能上網。去年從美國回來後終於入手了智慧型手機,這才發現這 個世界已經進步成什麼樣了!!一個小小手機就可以上網辦到好多事啊!!我也變成了一個低頭族,喜歡到處打卡,到了一個新地方就想上傳照片和粉絲專頁的朋友 們分享,或是用line或Skype和家人報平安。2012年8月我去東北的那一次是申請中華電信的漫遊,速度感覺不是很快或很穩定(當然也和東北多半比 較郊區有關)。這次回東京,終於試用到了網路上大名鼎鼎的上網神器:Wi-Ho。其實我想用用看WI-HO很久了,因為似乎比常用的B-MOBILE快很 多又不用裝SIM卡,這次終於有機會^^ 感謝日商特樂通資訊台灣分公司提供我們試用!!這次旅行途中一路暢通的網路,讓我體驗到活用各式App,google地圖等來定位,Tabelog找店家 等等的方便功能,真的深深感覺,傳統的玩東京的方式可以被行動上網徹底改變呢! 2013.7.19更新: 特樂通公司將推出兩台新機器,舊的小白機有可能慢慢淘汰,這篇介紹的小紅機還是不錯的選擇,但都有更好的機種了,請看: [新機上市] Wi-Ho黑旋風機(走Docomo適合郊區)及小黑機(走E-mobile適合城市),可使用超過十小時的日本無線上網新選擇,林氏璧讀者九五折優惠。 2013.7.3更新: 1.超WiHo! Softbank 3.5G (JP-S )(小紅機) 日本 $199/天 !! 說明:只有限前往日本及小紅機訊號優良地區,其他地區小紅機訊號不好處,需使用Docomo (JP-DM),仍維持原價$299 比方說我從6月15日借八天Soft bank小紅,不但一天199,整個金額會再打95折歐!快從這個林氏璧的專屬網址 線上申請 吧。(如果沒有打折,請在經銷商的欄位輸入linshibi,應該就會有打折了) 2.7~9月份使用的所有國家(包含日本),請即日起上網預訂,7~9月日本機器尚有充足貨源,...