環境
Centos 7
SVN 1.7
若需要部署SVN服務端,可以參考Centos7配置SVN服務端
將一個oa項目作為示例:
Shell> svn ls svn://localhost/oa branches/ tags/ trunk/
# 假設當前trunk剛剛發版,版本號是1.0,所以要打個1.0的tag,並創建一個修復bug的分支
Shell> svn cp svn://localhost/oa/trunk svn://localhost/oa/tags/1.0 -m '1.0 tag'
Shell> svn cp svn://localhost/oa/trunk svn://localhost/oa/branches/1.0-bug -m '1.0 bug branch'
Shell> svn co svn://localhost/oa # 導出代碼到本地,方便后文演示
概述
命令行合並的命令是 svn merge ... ,有一個參數 --dry-run ,任何合並都可用,作用是只模擬合並而不是真正合並,每次合並前先模擬一次是個好習慣。
合並有如下四種模式(注:下文都是以從主干創建了分支作為前提進行描述):
sync merge | 同步合並;創建分支后修改了主干,需要將主干的修改同步到分支時使用 |
cherry-pick merge | 選擇合並;將指定的某一次或多次修改合並到目標 |
reintegrate merge | 重聚合並;分支任務完成,需要將分支的修改合並到主干時使用,完成后刪除分支(很多翻譯為復興,我覺得重聚好一點,分支使命完成並與自己的源頭重新聚合到一起) |
2-URL merge | 合並兩棵不同的樹;對比兩個url的不同,然后將不同合並到指定目標,這三者可以是完全不同的樹,可以沒有任何關系 |
合並的操作中經常需要查看修訂版本號,常用的方法有:
Shell> svn log # 查看所有提交記錄
Shell> svn log -l 10 # 查看最近10條記錄
Shell> svn log --stop-on-copy # 查看分支創建以來的記錄
Shell> svn log | grep <關鍵字> -C 5 # 輸出內容中查找關鍵字,打印匹配行的前后5行內容
同步合並
用法:svn merge SOURCE[@REV] [TARGET_WCPATH]
在1.0-bug分支開發了一段時間后,由於某個原因trunk進行了一次或多次修改,現在需要將trunk的修改同步到分支,並且不能影響分支上已提交的bug修復,命令如下:
Shell> svn merge svn://localhost/oa/trunk oa/branches/1.0-bug/
Shell> svn ci oa/branches/1.0-bug/ -m '同步合並'
source后可接修訂版本號(默認是HEAD),表示同步到指定位置,假設trunk進行了兩次修改,版本號分別是r9、r10,那么:
Shell> svn merge svn://localhost/oa/trunk@r9 oa/branches/1.0-bug/ # 只同步到r9,r10的修改不會同步到分支
選擇合並
用法:svn merge [-c M[,N...] | -r N:M ...] SOURCE[@REV] [TARGET_WCPATH]
在標記了tag后,由於某個原因trunk進行了一次或多次修改,現在需要將trunk的某些必要的修改更新到tag,命令如下:
Shell> svn merge -c r10 svn://localhost/oa/trunk oa/tags/1.0/ # -c 指定版本號,將r10的修改進行合並
Shell> svn merge -c r9,r10 svn://localhost/oa/trunk oa/tags/1.0/ # 可以逗號分隔多個版本號,將r9和r10的修改進行合並
Shell> svn merge -r r9:r10 svn://localhost/oa/trunk oa/tags/1.0/ # -r 指定范圍版本號,將r9到r10的修改進行合並,注意這個范圍不包含r9本身的修改,這個 -r r9:r10 相當於 -c r10
Shell> svn merge -c r6 -r r9:r10 svn://localhost/oa/trunk oa/tags/1.0/ # -c -r 可以一起使用
Shell> svn ci oa/tags/1.0/ -m '選擇合並'
重聚合並
用法:svn merge --reintegrate SOURCE[@REV] [TARGET_WCPATH]
當分支完成了自己的使命,不需要再保留時,需要將分支合並回trunk,此時就需要重聚合並;合並后就可以刪除分支,若后續再有需求則應重建分支。
這種情況常見於功能性分支,功能開發完成即執行重聚合並,用於bug分支時表明結束對該版本的技術支持,后續不再修復bug了。
重聚合並前,為了減少可能的沖突,應該讓trunk與分支處於同步狀態,若創建分支后trunk進行過修改且未進行同步(或者說是有未同步的更新)則先進行一次同步合並,然后再重聚:
Shell> svn merge --reintegrate svn://localhost/oa/branches/1.0-bug oa/trunk/
Shell> svn ci oa/trunk/ -m '重聚合並'
source后可接修訂版本號(默認是HEAD),表示合並截止到指定位置,但重聚肯定是要把分支所有修改合並,所以非常特殊的情況下才會需要指定REV。
合並兩棵不同的樹
用法:svn merge SOURCE1[@N] SOURCE2[@M] [TARGET_WCPATH]
source1、source2、target三者可以是完全沒關系的三個地址,所以這是最靈活的合並,其他合並能做的它都能做,不能做的它也能做(懷疑其他合並就是根據常用場景封裝了這個合並吧?)。
靈活就意味着容易出錯,所以還是建議優先用其他合並,若那些都無法滿足要求再使用該合並方式。
比如,想把一個分支branch1相比於trunk的區別更新到另一個從trunk不同版本號創建的分支branche2,則命令如下:
Shell> svn merge svn://localhost/oa/trunk svn://localhost/oa/branches/1.0-branch1 oa/branches/1.0-branch2/
Shell> ci oa/branches/1.0-branch2/ -m '合並兩棵不同的樹'
source1、source2后面可接版本號(默認是HEAD),表示使用指定的版本進行對比。
over