SVN分支與合併瀏覽器
1、 分支與合併的概念服務器
2、 SVN分支的意義svn
3、 如何建立分支與合併分支工具
1、分支與合併的概念:測試
分支:版本控制系統的一個特性是可以把各類修改分離出來放在開發品的一個分割線上。這條線被稱爲分支。分支常常被用來試驗新的特性,而不會對開發有編譯錯誤的干擾。當新的特性足夠穩定以後,開發品的分支就能夠混合回主分支裏(主幹線)。字體
合併:分支用來維護獨立的開發支線,在一些階段,你可能須要將分支上的修改合併到最新版本,或者將最新版本的修改合併到分支。url
2、 SVN分支的意義:spa
簡單說,分支就是用於區分開發版本與當前發佈版本的。3d
一、 主幹負責新功能的開發版本控制
2.、分支負責修正當前發佈版本的bug(對於能夠放入下個發佈版本的改進性bug能夠直接在主幹上開發)
3.、分支上修改的bug,常常性merge到主幹上,儘可能及時merge(避免大面積紅色區域)。
4.、只能分支往主幹靠攏(merge),不能反向!
5.、直到下個新版本發佈,該分支中止修改
3、 如何建立分支與合併分支:
一、首先要在你的版本庫存裏建立主幹目錄,經過版本庫瀏覽器,如圖1所示:
(圖 1)
二、輸入版本庫URL地址,如圖2所示:
(圖 2)
三、進入版本庫瀏覽器主目錄,如圖3所示:
(圖 3)
四、建立主幹目錄,如圖4所示:
(圖4)
(圖 5)
六、把你要加入版本控制的文件加入主幹,如圖6-8所示:
(圖 6)
(圖 7)
(圖 8)
七、從主幹裏檢出文件到你的本地工做副本上,如圖9-10所示:
(圖 9)
(圖 10)
八、選擇你要建立分支的工做副本,如圖11所示:
(圖 11)
九、在「至URL」裏填寫版本庫中要存放分支的目錄,如圖12-13所示:
(圖 12)
(圖 13)
注意:這時候工做副本對應版本庫的路徑仍爲原來對應的主幹的目錄。
十、再從分支裏檢出內容到本地目錄上,如圖14-15所示:
(圖 14)
(圖 15)
十一、打開剛從分支裏檢出的工做副本目錄,修改裏面的test.txt文檔並提交,如圖16-17所示:
(圖 16)
(圖 17)
注意:這時提交的修改只會提交到分支上,並不會更改主幹上的內容。
(圖 18)
1三、選擇合併類型(合併類型在文檔的最後有專門的介紹),若是19所示:
(圖 19)
1四、選擇合併選項(合併選項在文檔最後有專門的介紹),如圖20所示:
(圖 20)
1五、在合併以前,能夠先進行測試合併,如圖21所示:
(圖 21)
1六、測試合併成功後,點擊「合併」按鈕進行合併,如圖22所示:
(圖 22)
1七、合併完成後,打開test.txt文件,這時候能夠看見文件的內容跟分支裏的內容同樣,而且文件上有紅色歎號標記(說明已經修改過),如圖23所示:
(圖 23)
1八、在主幹上提交修改就完成了合併,若是24所示:
(圖 24)
對svn分支合併類型和深度的理解:
合併的工做是把主幹或者分支上合併範圍內的全部改動列出,並對比當前工做副本的內容,由合併者手工修改衝突,而後提交到服務器的相應目錄裏。若是當前工做副本是主幹,則合併的範圍是分支上的改動,若是工做副本是分支的,則合併範圍是主幹上的改動,而且必定要注意,合併的起始位置URL必定要和當前的工做副本的URL是相同的。
1、合併一個範圍的版本
此類型應用最爲普遍,主要是把分支中的修改合併到主幹上來。在主幹上點擊右鍵選擇合併,而後選擇合併類型:合併一個範圍的版本。合併的源URL填寫的是要合併的分支的URL,待合併的版本範圍若是爲空,則指的是合併分支上全部的版本,即自從分支建立以來到分支當前最新版本的全部演變。若是隻是選擇其中一個版本,或者幾個版本,那麼就表示只是將制定的n個版本的變化合併到主幹上。若是隻是選擇其中一個版本,那麼表示只是選擇那個版本的修改,以前或以後的修改將不被採納。
2、復興合併
復興合併能夠理解爲是第一種合併類型的一種特例,在復興合併中,主幹能夠理解爲是自從開創分支以後沒有任何修改,而分支是通過修改的,並且合併中分支是沒有版本選擇的。通過復興合併,分支中全部的修改都會合併到主幹中,合併的結果將使得分支和主幹如出一轍,從而能夠刪除分支。
3、合併兩個不一樣的樹
此類型與前兩種類型不一樣,第一種類型能夠選擇分支合併的版本,主幹不能選擇版本;第二種類型是主幹和分支都不能選擇合併的版本;而這種類型則是不管是主幹仍是分支均可以選擇合併的版本,便可以選擇過去的一個主幹版本與分支的某個版本進行合併。合併的時候以選擇的分支版本爲主,若是選擇的主幹版本與分支版本有不一樣的地方,合併時主幹部分將被放棄。
起始URL:選擇主幹目錄的URL(應當和當前工做副本的URL一致,這個是所謂的合併點)
結束URL:選擇要合併的分支的URL。
起始和結束的版本:通常起始版本應當找到最後一次同步時的版本,若是從沒有同步過(第一次合併),則選擇建立分支時的版本,結束版本通常是最新版本,若是你不想將某些內容合併進主幹的話,也能夠選擇一個合併點。
實例:
主幹A在95版本的時候建立分支B,此時兩棵樹都是95版本
一、 我在分支B上增長文件test.txt,提交。此時版本庫升級到了96版本;
二、 我在A上選擇合併類型1,合併分支最新版本,結果是把test.txt加入A;
三、 我在A上選擇合併類型2,合併分支最新版本,結果同上;
四、 我在A上選擇合併類型3,合併分支最新版本,結果同上;
五、 我在A上增長文件test2.txt,提交,此時版本庫升級到了97版本;
六、 我在A上選擇合併類型1,合併分支最新版本,結果是把test.txt加入A;
七、 我在A上選擇合併類型2,合併分支最新版本,結果是把test.txt加入A;
八、 我在A上選擇合併類型3,主幹選擇當前97版本,合併分支最新版本,結果是把test.txt加入A,把test2.txt從A刪除;
九、 我在A上選擇合併類型3,主幹97之前的版本,合併分支最新版本,結果是把test.txt加入A,而A中保留着test2.txt。
將分支合併到主幹上,首先須要在主幹的工做副本下進行,合併的範圍是從主幹的上次合併的版本開始到分支上最新的版本結束,若是是第一次合併,則從主幹建立分支的版本開始,因此每次合併要作好說明,在日誌中體現,否則忘記了下次再合併就有點麻煩。其實,應當儘可能避免一個分支合併屢次,分支的做用通常爲了解決bug,一旦bug對應結束了,分支的使命就結束了,之後再出現其餘的問題,應當從新創建分支,這樣就不會出現屢次合併的問題了。
分支的合併深度
合併深度:
1、工做副本:即你當前的工做目錄,通常默認爲這個選項;
2、全遞歸:即你選擇的目錄的版本庫,包括了其下面的子文件,子文件夾,包括子文件夾裏面的內容;
3、直接子節點,包括文件夾:即你選擇的目錄下面的文件,文件夾,可是不包括文件夾裏面的子文件,子文件夾;
4、僅文件子節點:即你選擇的目錄下面的文件,但不包括文件夾,固然不包括的文件夾下面的全部內容也都不歸入合併範圍;
5、僅此項:沒有任何合併內容。
實例:
一、主幹test文件夾下面有text.txt文件,把test文件夾建立分支test2
二、在test2文件夾下面增長test21文件夾,在test21文件夾下面增長文件夾test211,在test211文件夾下面增長文件test211.txt;修改test2文件夾下面的文件test.txt,增長文件test2.txt。提交
三、右鍵test文件夾合併test2文件夾,選擇工做副本。則test文件夾中原先的test.txt文件則顯示修改狀態,test2.txt文件顯示新增狀態,文件夾test21和test211以及裏面的test211.txt文件都顯示爲新增狀態。選擇將test文件夾svn還原,則新增狀態下的文件夾或者文件顯示爲無版本控制狀態,原先的test.txt還原爲常規常態。
四、右鍵test文件夾合併test2文件夾,選擇全遞歸,結果和3同樣。可是咱們以前的test文件夾和倉庫上的test的內容是一致的,若是不一致,那麼選全遞歸,是已倉庫版本爲標準。選工做副本,顧名思義,則以你本地的工做副本文件爲主,分支上有而工做副本中沒有的文件夾或文件則不進行比較合併。
五、右鍵test文件夾合併test2文件夾,選擇直接子節點,包含文件夾。則test文件夾中原先的test.txt文件顯示爲修改狀態,test2.txt文件顯示爲新增狀態,test21文件夾顯示爲新增狀態,可是其裏面內容則爲空,那麼就證實了分支中test21文件夾如下的內容並無合併到主幹test中來,合併行爲只是選取了當前目錄。選擇將test文件夾svn還原,則新增狀態下的文件夾或者文件顯示爲無版本控制狀態,原先的test.txt還原爲常規狀態。
六、右鍵test文件夾合併test2文件夾,選擇僅文件子節點。則test文件夾中原先的test.txt文件顯示爲修改狀態,test2.txt文件顯示爲新增狀態,分支test2中的test21文件夾沒有合併到test中來。選擇將test文件夾svn還原,則新增狀態下的文件顯示爲無版本控制狀態,原先的test.txt還原爲常規狀態。
七、右鍵test文件夾合併test2文件夾,選擇僅此項。則test文件夾顯示爲修改狀態,可是內容沒有任何改動。將test文件夾svn還原,則該文件夾顯示爲常規狀態。
只記錄合併(阻止這些版本未來被合併)
選擇此項意味着並無實際的合併動做,只是在未來的合併過程當中,svn將過濾掉此版本的修改動做。例如,我在合併的過程當中,選擇對分支的23版本只記錄合併(阻止這個版本未來被合併),那麼23版本並不會合併到主幹中。在之後的合併中,若是選擇合併分支的22到24版本,那麼23版本將被忽略,咱們也能夠看到,在選擇版本的對話框上,23版本的字體是灰色的。因此要慎重使用這個選項,一旦使用了,那麼表示這個版本在之後的合併中就不能再使用了。
忽略祖先:若是在分支上有一個文件曾經被刪除過,後來又加了一個同文件名的文件,那麼在merge的時候svn會識別到這兩個文件不是同一個祖先而直接覆蓋舊文件增長新文件。而實際上我是要對這兩個不一樣祖先的文件進行合併的,這個時候就須要使用svn merge --ignore-ancestry 忽略祖先來進行合併才能保證正確。
實例:
一、 將主幹test建立分支test1;
二、 將test1文件夾下的test.txt文件刪除,提交;
三、 在test1下建立文件test.txt,提交;
四、 將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。
================================================
有人問SVN合併時間遇到衝突怎麼辦?實際假若把beyond compare配置爲了svn的合併工具以後就會發現衝突合併比較簡單。(配置方法應該是在TortoiseSVN的幫助裏面有)