全程剖析:Subversion合并之簡單介紹一
Subversion合并問題你是否了解,這里就向大家簡單介紹一下,歡迎大家能和我一起學習Subversion合并。
Subversion1.5支持合并跟蹤,本文將對什么是合并跟蹤,及其對你們組織具備的意義提供了高級的總體看法,我將會從許多基本的解釋開始,如果你熟悉分支與合并,請掠過第1段。
1.什么是分支與合并?
開發團隊經常會在多個并行線上開發,叫做”分支”,一個分支從拷貝開發項目(或一個目錄)所有的文件開始,然后開始單獨的維護這個拷貝,文件開始都是相同的,但經過一段時間,它們將會不同,因為不同的開發者在不同分支做出了修改。
為什么分支?你或許在Subversion創建一個分支用來維護產品發布,同時為下一個版本工作。為什么?下一個版本會有新的特性,但是在維護分支你只接受bug修改。另一個用例是開發復雜的新特性,而它會將使得開發構建不穩定,通過在不同分支開發,你將其他開發者從可能的構建失敗中分離出去。Subversion自己的合并跟蹤特性在一個分支上開發了差不多一年。
Graph1.兩個分支的主線開發(trunk)
Subversion一直支持分支,但與其他系統不同,它不會真正的拷貝文件,那樣會快速加大版本庫的體積。相反,Subversion會創建一個到原來已有目錄的快速引用,只是記錄分支和trunk的文件修改,這樣的結果是創建分支非常迅速,版本庫幾乎不會增加大小。有些時候,代碼需要合并。例如,一個開發者在維護分支上修訂了一個bug,你會希望將修改合并到主開發線上,否則,你的下個發布還會有這個bug。另一個例子是在分支上開發一個新特性。就像我們說的,Subversion自己的合并跟蹤特性就是在分支上開發的,在2007年2月,這個特性足夠穩定,然后合并到了trunk。
Graph2.Subversion合并代碼
讓我們看一個簡單的合并實例,這是我們的代碼:
- trunk的代碼(主碼基)
- main()
- {
- printf(”hello,wordn”);
- }
- 現在我們做一個分支,從用戶的角度會有兩份代碼:trunk的代碼(主碼基)分支代碼
- main()
- {
- printf(”hello,wordn”);
- }
- main()
- {
- printf(”hello,wordn”);
- }
- “Word”實際上應該為”World”,我們有一個bug,開發者在分支上修改了它,文件現在已經不同了。
- main()
- {
- printf(”hello,wordn”);
- }
- main()
- {
- printf(”hello,worldn”);
- }
- 在某一時刻,bug修正合并到了trunk
- >>svnmerge:Subversion將修改從分支合并到trunk。
- main()
- {
- printf(”hello,worldn”);
- }
- main()
- {
- printf(”hello,worldn”);
- }
2.Subversion與合并
就像分支,Subversion一直支持合并,如果你要求它可以自動完成許多工作。但是Subversion不會”記住”什么代碼從什么分支在什么時候合并,盡管分支與合并在Subversion中工作很好,但是合并跟蹤特性的添加解決了許多限制:重復合并,假設你有一個特性分支與主干同步,沒有合并跟蹤時,你必須小心的(且手工的)記錄哪些修訂版本已經合并,這會非常乏味,而且如果你忘了合并特定修改或是創建叫做”偽造的沖突”的東西,這意味著文件沒有正確的合并,結果修訂版本有錯誤。
審計。當你合并一個特性分支回trunk,trunk的歷史只記錄了合并的發生,但是不知道合并了什么,這樣就很難準確找出合并了什么到trunk。
3.這對你意味著什么?
開發團隊多年里成功使用Subversion合并和分支,但是合并跟蹤提供了許多好處:合并跟蹤添加了審計/跟蹤能力(那些代碼合并了,何時,何地?)。許多組織因為管理目的需要這個特性。合并跟蹤減少了錯誤和管理費用。團隊會因為Subversion的合并跟蹤功能提高生產力。經常合并很重要。兩個開始相同的文件會隨著時間變得很不一樣,不同的越多,越難以合并。如果經常合并,增量的區別會比較小,會易于合并。合并跟蹤可以使得易于經常合并。許多選擇Subversion的公司采用限制分支的策略,他們不能從好的分支策略和并行開發中得到好處,例如:他們選擇在主開發線開發一個風險很大的新特性,結果就是項目成員要處理經常的構建錯誤。最終的好處:一些公司還沒有使用Subversion,而使用傳統的昂貴的工具,他們在等待合并跟蹤。本文對Subversion合并問題的介紹還沒有結束,請大家繼續關注。
【編輯推薦】