SVN 中分支的建立與合併

來自:http://yaozhong1988.blog.163.com/blog/static/141737885201162671635126/

一、  SVN分支的意義:

    簡單說,分支就是用於區分開發版本與當前發佈版本的。

    1、 主幹負責新功能的開發

    2.、分支負責修正當前發佈版本的bug(對於可以放入下個發佈版本的改進性bug可以直接在主幹上開發)

    3.、分支上修改的bug,經常性merge到主幹上,儘量及時merge(避免大面積紅色區域)。

    4.、只能分支往主幹靠攏(merge),不能反向!

    5.、直到下個新版本發佈,該分支停止修改

二、創建分支與合併分支:

1、創建主幹目錄

   打開版本庫瀏覽器:TortoiseSVN -> Repo-browser,填寫SVN的URL<svn://localhost/svn/project>,進入版本庫瀏覽器主目錄。

2、創建主幹目錄truck:

  在目錄中創建truck目錄。

3、將要加入版本控制的文件加入主幹

4、從主幹裏面檢出文件到本地工作副本

     Checkout ->   svn://localhost/svn/project/truck。

5、創建分支:

   選擇要創建分支的工作副本,然後TortoiseSVN -> Branch/tag···   在“to URL”中填入svn://localhost/svn/project/branch,單選按鈕選擇第二個,即“Specific revision in repository”,然後點擊“OK”,一直到導出成功。

6、檢出分支:

  Checkout  ->   svn://localhost/svn/project/branch

7、接下來做測試:

     打開剛檢出的分支,修改裏面的文件,然後 update  ->  Commit··· 

8、分支合併:

    選擇truck工作副本,TortoiseSVN ->  Merge··· 

  (1)Merge type中選擇第一個單選按鈕,即Merge a range of revisions,點擊下一步

  (2)"Url to merge from "選擇剛纔checkout分支的路徑:svn://localhost/svn/project/branch,然後next

  (3)Merge depth: 選擇 : Working copy.    單選按鈕選擇:  Compare whitespaces。 然後點擊“Merge”

9、合併完成後,打開test.txt文件,這時候可以看見truck裏面的文件的內容跟分支裏的內容一樣,並且文件上有紅色歎號標記。

10、提交主幹 truck ,選擇Commit。

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------

 

對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。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章