本文是由演講整理而來的,介紹了 SVN 分支與合并的概念、流程和一些實際操作方法,適合對版本控制有基本認識然后想了解 SVN 分支與合并的使用方法的讀者。
對應(yīng) SVN 版本最低為 1.5,因為分支、合并的很多功能都是 1.5(release notes ) 才加進來的。
svn merge [-r M:N] ^/trunk
假設(shè)"^/trunk"是主干的 URL,當前目錄為分支的工作副本。該命令同步主干的最新修改到當前工作副本,用于使分支跟主干保持同步。SVN 會通過 svn:mergeinfo 屬性來記錄當前工作副本已經(jīng)合并過的版本號,然后在每次合并時選擇合適的(eligible)版本進行合并。當然,也可以自己手動指定合并版本M到N的修改。
svn merge --reintegrate ^/branches/quota
假設(shè)"^/branches/quota"是分支的 URL,當前目錄為主干的工作副本。該命令將分支的最新版本(@HEAD)跟主干的最新版本進行比較,將差異實施到當前工作副本,用于將在分支上完成的工作合并回主干。
分支使用 --reintegrate 合并回主干后,如果繼續(xù)在該分支上開發(fā),當需要同步主干的修改到分支過來時,默認會包括之前 reintegrate 的修改,而這些修改已經(jīng)在分支上做過了,所以這樣往往會導(dǎo)致沖突。這也是前面“最佳實踐”中最后一個建議的一個原因。當然,想要使這個分支繼續(xù)可用也是可以的,這就需要使用下面這第三種合并。
svn merge -c 25 --record-only ^/trunk
假設(shè)當前目錄為分支的工作副本,該命令將主干的版本25標記為已合并到當前工作副本,但并不會進行實質(zhì)性的合并,這樣下次合并主干到分支時,該版本的修改就會被跳過,避免修改被重復(fù)實施導(dǎo)致的沖突。其實這種合并就是改一下 svn:mergeinfo 而已,但直接修改太危險了,所以弄了這樣一個所謂合并來規(guī)范操作。
在 Eclipse 中有兩個比較流行的 SVN 插件:Subclipse 和 Subversive,關(guān)于兩者的討論有很多,例如這里 。本文只介紹 Subclipse。
上圖是 Subclipse 進行合并操作時的界面,該圖所對應(yīng)的操作是:將 trunk 上版本 8 至今的修改同步到工作副本 pearbranch,也就是分支 branches/quake。這里可以發(fā)現(xiàn)幾個問題:
上述 Subclipse 的不足,應(yīng)該是因為 Subclipse 默認的合并實現(xiàn)是基于 SVN 1.4 之前的,那時還沒有 svn:mergeinfo、--reintegrate 和 --record-only 呢。要支持這些 1.5 的新特性,可以安裝 CollabNet Merge Client。
CollabNet Merge Client 是 Subclipse 的一個可選功能,其實就是一個增強的、支持新特性的合并實現(xiàn),如上圖所示,它的優(yōu)點有:
主要是看 Bubble-Up Method 這一節(jié),是 revision 的基本原理。
『Version Control with Subversion』
官方手冊,學(xué)習(xí) SVN 必讀。