專家實例講解SVN分支和合并問題
本節向大家簡單描述一下SVN分支和合并方面的知識,在學習SVN的過程中SVN分支和合并時經常遇到的問題,在這里和大家分享一下,希望本文對大家有用。
關于主線同SVN分支合并的概念及如何使用的誤區此問題是在netbuddy的問題上研究而成,走出誤區的過程中得到了pcplayer指點迷津。
一、我的合并需求
在主線的第54個版本上作了分支,在接下來的日子里,主線和分支同時都有修改,此時需要將分支上的改動合并到主線上,合并前主線和分支都已經提交,截至到合并前,主線的修改達到了版本號66,而分支的修改達到了68。主線和分支修改的文件不同。
二、我最初的錯誤操作
我當時的想法是合并,就是簡單的把主線的最新版本和分支的最新版本合在一起就成了,而且這也是符合我們的手工習慣。于是我就作出了一個錯誤的操作:
1、在SVN分支的工作副本上單擊右鍵,選擇合并,出現合并對話框,在起始路徑和版本號中選擇主線的最新版本,在結束路徑中選擇分支的最新版本,然后單擊合并,合并后,提示框內沒有任何合并的內容。
2、上個操作不成功,于是胡亂進行這個操作,在主線的工作副本上單擊右鍵,選擇合并,出現合并對話框,在起始路徑和版本號中選擇分支的最新版本,在結束路徑中選擇主線的最新版本,然后單擊合并,合并后,提示框內沒有任何合并的內容。
3、發現第2個操作仍沒有結果,更暈,于是進行下面的操作,在主線的工作副本上單擊右鍵,選擇合并,出現合并對話框,在起始路徑和版本號中選擇主線的最新版本,在結束路徑中選擇分支的最新版本,然后單擊合并,合并后,提示框內提示有文件更新,打開更新的文件一看,原來是分支上的內容把主線上的工作副本覆蓋了。于是進行下一個實驗。
4、在SVN分支的工作副本上單擊右鍵,選擇合并,出現合并對話框,在起始路徑和版本號中選擇分支的最新版本,在結束路徑中選擇主線的最新版本,然后單擊合并,合并后,提示框內提示有文件更新,打開更新的文件一看,原來是主線上的內容把分支上的覆蓋了。
總結操作問題:合并的起始和結束路徑不是同一路徑,而是主線和分支兩個不同的路徑
三、我把這個問題發到論壇,pcplayer指出了我的錯誤,即“起始選擇主線的最新版本,結束使用分支的最新版本”,并指明“應該選擇一條線上的兩個版本,這兩個版本間的改動會以打補丁的形式合并到另外一條線上”,于是看了一遍subversion中文手冊svnbook1.2版中第4章分支與合并,終于理解了合并的使用:
1、如果是需要將主線的改動合并到SVN分支上,需要在分支的工作副本下進行合并,合并的范圍是需要從主線上上次合并的版本到當前主線上最新的版本,如果主線和分支都修改了相同的文件,合并后會出現沖突,然后解決沖突,如果主線修改但是分支沒有修改,則主線上合并的變更內容會增加到當前副本中,提交,如果是第一次合并,則起始版本號是上次建立分支的版本號
2、相反,如果是需要將分支的改動合并到主線上,需要在主線的工作副本下進行合并,合并的范圍是需要從分支上上次合并的版本到當前分支上最新的版本,合并后會出現沖突(沖突的前提如上種情況),然后解決沖突,提交,如果是第一次合并,則起始版本號是上次建立分支的版本號
3、正確的操作(對應我的需求,將分支上的改動合并到主線上):在主線的工作副本下單擊右鍵,合并,在起始范圍中選擇分支的54版本,結束范圍中選擇分支的最新版本(當然也可以修改到中間的其他版本,例如65等),然后單擊合并即可。由于我的需求中主線和分支修改的是不同的文件,所以不會存在沖突,合并完后直接提交即可。
四、合并的工作是把主線或者分支上合并范圍內的所有改動列出,并對比當前副本的內容,由合并者手工修改沖突。如果當前工作副本是主線的,則合并的范圍是分支上的改動,如果工作副本是分支的,則合并范圍是主線上的改動。本節關于SVN分支和合并問題介紹完畢。
【編輯推薦】