對svn分支合並類型和深度的理解


    合並的工作是把主干或者分支上合並范圍內的所有改動列出,並對比當前工作副本的內容,由合並者手工修改沖突,然后提交到服務器的相應目錄里。如果當前工作副本是主干,則合並的范圍是分支上的改動,如果工作副本是分支的,則合並范圍是主干上的改動,並且一定要注意,合並的起始位置URL一定要和當前的工作副本的URL是相同的。

一、合並一個范圍的版本

    此類型應用最為廣泛,主要是把分支中的修改合並到主干上來。在主干上點擊右鍵選擇合並,然后選擇合並類型:合並一個范圍的版本。合並的源URL填寫的是要合並的分支的URL,待合並的版本范圍如果為空,則指的是合並分支上所有的版本,即自從分支創建以來到分支當前最新版本的所有演變。如果只是選擇其中一個版本,或者幾個版本,那么就表示只是將制定的n個版本的變化合並到主干上。如果只是選擇其中一個版本,那么表示只是選擇那個版本的修改,之前或之后的修改將不被采納。

二、復興合並

    復興合並可以理解為是第一種合並類型的一種特例,在復興合並中,主干可以理解為是自從開創分支之后沒有任何修改,而分支是經過修改的,而且合並中分支是沒有版本選擇的。經過復興合並,分支中所有的修改都會合並到主干中,合並的結果將使得分支和主干一模一樣,從而可以刪除分支。

三、合並兩個不同的樹

    此類型與前兩種類型不同,第一種類型可以選擇分支合並的版本,主干不能選擇版本;第二種類型是主干和分支都不能選擇合並的版本;而這種類型則是無論是主干還是分支都可以選擇合並的版本,即可以選擇過去的一個主干版本與分支的某個版本進行合並。合並的時候以選擇的分支版本為主,如果選擇的主干版本與分支版本有不同的地方,合並時主干部分將被放棄。

起始URL:選擇主干目錄的URL(應當和當前工作副本的URL一致,這個是所謂的合並點)

結束URL:選擇要合並的分支的URL。

起始和結束的版本:一般起始版本應當找到最后一次同步時的版本,如果從沒有同步過(第一次合並),則選擇創建分支時的版本,結束版本一般是最新版本,如果你不想將某些內容合並進主干的話,也可以選擇一個合並點。

實例:

主干A在95版本的時候創建分支B,此時兩棵樹都是95版本

1、 我在分支B上增加文件test.txt,提交。此時版本庫升級到了96版本;

2、 我在A上選擇合並類型1,合並分支最新版本,結果是把test.txt加入A;

3、 我在A上選擇合並類型2,合並分支最新版本,結果同上;

4、 我在A上選擇合並類型3,合並分支最新版本,結果同上;

5、 我在A上增加文件test2.txt,提交,此時版本庫升級到了97版本;

6、 我在A上選擇合並類型1,合並分支最新版本,結果是把test.txt加入A;

7、 我在A上選擇合並類型2,合並分支最新版本,結果是把test.txt加入A;

8、 我在A上選擇合並類型3,主干選擇當前97版本,合並分支最新版本,結果是把test.txt加入A,把test2.txt從A刪除;

9、 我在A上選擇合並類型3,主干97以前的版本,合並分支最新版本,結果是把test.txt加入A,而A中保留着test2.txt。

    將分支合並到主干上,首先需要在主干的工作副本下進行,合並的范圍是從主干的上次合並的版本開始到分支上最新的版本結束,如果是第一次合並,則從主干創建分支的版本開始,所以每次合並要做好說明,在日志中體現,不然忘記了下次再合並就有點麻煩。其實,應當盡量避免一個分支合並多次,分支的作用一般為了解決bug,一旦bug對應結束了,分支的使命就結束了,以后再出現其他的問題,應當重新建立分支,這樣就不會出現多次合並的問題了。

 

分支的合並深度

合並深度:

一、工作副本:即你當前的工作目錄,一般默認為這個選項;

二、全遞歸:即你選擇的目錄的版本庫,包括了其下面的子文件,子文件夾,包括子文件夾里面的內容;

三、直接子節點,包括文件夾:即你選擇的目錄下面的文件,文件夾,但是不包括文件夾里面的子文件,子文件夾;

四、僅文件子節點:即你選擇的目錄下面的文件,但不包括文件夾,當然不包括的文件夾下面的所有內容也都不納入合並范圍;

五、僅此項:沒有任何合並內容。

實例:

1、主干test文件夾下面有text.txt文件,把test文件夾創建分支test2

2、在test2文件夾下面增加test21文件夾,在test21文件夾下面增加文件夾test211,在test211文件夾下面增加文件test211.txt;修改test2文件夾下面的文件test.txt,增加文件test2.txt。提交

3、右鍵test文件夾合並test2文件夾,選擇工作副本。則test文件夾中原先的test.txt文件則顯示修改狀態,test2.txt文件顯示新增狀態,文件夾test21和test211以及里面的test211.txt文件都顯示為新增狀態。選擇將test文件夾svn還原,則新增狀態下的文件夾或者文件顯示為無版本控制狀態,原先的test.txt還原為常規常態。

4、右鍵test文件夾合並test2文件夾,選擇全遞歸,結果和3一樣。但是我們之前的test文件夾和倉庫上的test的內容是一致的,如果不一致,那么選全遞歸,是已倉庫版本為標准。選工作副本,顧名思義,則以你本地的工作副本文件為主,分支上有而工作副本中沒有的文件夾或文件則不進行比較合並。

5、右鍵test文件夾合並test2文件夾,選擇直接子節點,包含文件夾。則test文件夾中原先的test.txt文件顯示為修改狀態,test2.txt文件顯示為新增狀態,test21文件夾顯示為新增狀態,但是其里面內容則為空,那么就證明了分支中test21文件夾以下的內容並沒有合並到主干test中來,合並行為只是選取了當前目錄。選擇將test文件夾svn還原,則新增狀態下的文件夾或者文件顯示為無版本控制狀態,原先的test.txt還原為常規狀態。

6、右鍵test文件夾合並test2文件夾,選擇僅文件子節點。則test文件夾中原先的test.txt文件顯示為修改狀態,test2.txt文件顯示為新增狀態,分支test2中的test21文件夾沒有合並到test中來。選擇將test文件夾svn還原,則新增狀態下的文件顯示為無版本控制狀態,原先的test.txt還原為常規狀態。

7、右鍵test文件夾合並test2文件夾,選擇僅此項。則test文件夾顯示為修改狀態,但是內容沒有任何改動。將test文件夾svn還原,則該文件夾顯示為常規狀態。

只記錄合並(阻止這些版本將來被合並)

    選擇此項意味着並沒有實際的合並動作,只是在將來的合並過程中,svn將過濾掉此版本的修改動作。例如,我在合並的過程中,選擇對分支的23版本只記錄合並(阻止這個版本將來被合並),那么23版本並不會合並到主干中。在以后的合並中,如果選擇合並分支的22到24版本,那么23版本將被忽略,我們也可以看到,在選擇版本的對話框上,23版本的字體是灰色的。所以要慎重使用這個選項,一旦使用了,那么表示這個版本在以后的合並中就不能再使用了。

    忽略祖先:如果在分支上有一個文件曾經被刪除過,后來又加了一個同文件名的文件,那么在merge的時候svn會識別到這兩個文件不是同一個祖先而直接覆蓋舊文件增加新文件。而實際上我是要對這兩個不同祖先的文件進行合並的,這個時候就需要使用svn merge --ignore-ancestry 忽略祖先來進行合並才能保證正確。

實例:

1、 將主干test創建分支test1;

2、 將test1文件夾下的test.txt文件刪除,提交;

3、 在test1下創建文件test.txt,提交;

4、 將test1合並到主干test,如果默認選擇,則提示將test1中的test.txt文件替換test文件夾中的test.txt文件;如果選擇了忽略祖先,那么系統將把兩個test.txt作比較,必要時提示沖突。

carriage return是一個符號(指回車符號CR),而一般在代碼文件或文體文件里(WINDOWS下)里換行是CR和LF(即\r\n或十六進制碼0D 0A),而你行中只有CR,所以將要加一個LF(即OA)。說得很明確了,其實LF就是line feed的簡寫。whitespace包括line feeds, tabs, spaces, and carriage returns。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM