一些相關的概念和原理
· 分支(branch)和標記(tag)對於 svn 來說就只是副本(copy),沒有任何其它意義。分支和標記的意義是我們人為給予的。
· svn 的副本是通過"cheap copies "來實現的,建立乙個副本就類似 unix 中建立乙個硬鏈結(hard link),空間和時間的消耗都是固定並且很小的,因此不必太過擔心副本太多而導致效能問題。
· svn 的檔案儲存 是通過差異(diff)來實現的,底層儲存方法有兩種:1、berkeley db,完整儲存乙個檔案的最新版本(revision),舊版本通過反向差異(reverse diffs)來獲取。2、fsfs,跟 bdb 相反,完整儲存乙個檔案的初始版本,後續版本通過正向差異來獲取。當然,為了避免版本太多而造成效能下降,svn 還使用了"skip-deltas "來減少需要追溯的版本數。
· svn 屬性(property )可以附帶在檔案、目錄和版本(revision)上。檔案和目錄的屬性類似檔案內容,會被記錄進版本庫中的,例如每次提交時的注釋,其實就是該版本的乙個屬性 svn:log。以"svn:"開頭的屬性是系統預留的,使用者不應該自定義這樣的屬性。
進行分支開發的最佳實踐
· 做分支上做開發的時候,必須定期使分支與主幹同步,避免開發完成後合併(merge)回主幹時出現嚴重衝突(confict)。
· 進行合併前,處理掉工作副本上的所有本地修改,方便合併失敗時進行回滾(revert)。
· 進行合併時,特別注意 新增/刪除 操作,因為很多衝突都是這類操作引起的。
· 完成乙個分支的功能並合併回主幹後,拋棄該分支,後續其它功能的開發使用新建的分支。當然,也有辦法繼續使用該分支。
合併的分類
1、從主幹到分支(如果使用小烏龜選擇第一項)
假設"^/trunk"是主幹的 url,當前目錄為分支的工作副本。該命令同步主幹的最新修改到當前工作副本,用於使分支跟主幹保持同步。svn 會通過 svn:mergeinfo 屬性來記錄當前工作副本已經合併過的版本號,然後在每次合併時選擇合適的(eligible)版本進行合併。當然,也可以自己手動指定合併版本m到n的修改。
2、從分支到主幹(如果使用小烏龜選擇第二項)
假設"^/branches/quota"是分支的 url,當前目錄為主幹的工作副本。該命令將分支的最新版本(@head)跟主幹的最新版本進行比較,將差異實施到當前工作副本,用於將在分支上完成的工作合併回主幹。
分支使用 --reintegrate 合併回主幹後,如果繼續在該分支上開發,當需要同步主幹的修改到分支過來時,缺省會包括之前 reintegrate 的修改,而這些修改已經在分支上做過了,所以這樣往往會導致衝突。這也是前面「最佳實踐」中最後乙個建議的乙個原因。當然,想要使這個分支繼續可用也是可以的,這就需要使用下面這第三種合併。
這裡要注意的是:假如分支的起始版本號是1000,現在主幹上是2000,我們想合併主幹的修改到分支,我們必須svn merge [-r 1000:2000] ^/trunk ,不能只合併比如1500到2000,否則在合併會主幹時會有很大的問題。當出現這個問題時會提示分值上一些版本丟失,這個時候我們必須在這樣在分值上做一邊svn merge [-r 1000:2000] ^/trunk,然後在reintegration回trunk
3、僅記錄的合併
假設當前目錄為分支的工作副本,該命令將主幹的版本25標記為已合併到當前工作副本,但並不會進行實質性的合併,這樣下次合併主幹到分支時,該版本的修改就會被跳過,避免修改被重複實施導致的衝突。其實這種合併就是改一下 svn:mergeinfo 而已,但直接修改太危險了,所以弄了這樣乙個所謂合併來規範操作。
SVN分支與合併
合併 合併的工作是把主線或者分支上合併範圍內的所有改動列出,並對比當前副本的內容,由合併者手工修改衝突。如果當前工作副本是主線的,則合併的範圍是分支上的改動,如果工作副本是分支的,則合併範圍是主線上的改動 1 主幹合併到分支 如果是需要將主線的改動合併到分支上,需要在分支的工作副本下進行合併,合併的...
SVN分支與合併
一些相關的概念和原理 分支 branch 和標記 tag 對於 svn 來說就只是副本 copy 沒有任何其它意義。分支和標記的意義是我們人為給予的。svn 的副本是通過 cheap copies 來實現的,建立乙個副本就類似 unix 中建立乙個硬鏈結 hard link 空間和時間的消耗都是固定...
SVN分支與合併
分支的基本概念就正如它的名字,開發的一條線獨立於另一條線,如果回顧歷史,可以發現兩條線分享共同的歷史,乙個分支總是從乙個備份開始的,從那裡開始,發展自己獨有的歷史 如下圖所示 建立分支 假設目前我們版本庫中的專案的布局如下圖 如圖所示,我們的專案放在了trunk 主線 目錄,另外還有branch 分...