參考博客: http://www.cnblogs.com/cxd4321/archive/2012/07/12/2588110.html
(1)爲何要使用SVN分支開發和主幹合併?html
目的:在SVN下進行版本升級模式的開發 需求: 一、項目目前已經有比較穩定的版本(release_version_1.0),須要在穩定版本上面作程序的升級 2、升級開發時,可能有10個程序員同時在修改程序,且都須要對絕大多數文件作大部分改動 3、噁心的技術經理說:如今須要把數據庫換成hbase,可是沒有更改完畢以前依舊保持mysql不變 4、多人頻繁提交代碼引入了過多的不穩定因素 5、爲不一樣用戶客定製不一樣的版本 目標: 一、在開發過程當中須要保證隨時能夠切換到指定的版本(1.0/2.0/3.0) 2、最大程度避免程序的肆意修改和較多的衝突 3、程序員間相互的修改不受影響 解決方案:在SVN下進行分支開發與主幹合併
(2)SVN標準結構mysql
url_of_repository |-trunk |-cnblogs |-tags |-cnblogs_release_version_1.0 |-cnblogs_release_version_1.2 |-cnblogs_release_version_2.0 |-branches |-cnblogs_update_version_1.2_20151012 |-cnblogs_update_version_2.0_20151213 解讀: 從目錄能夠看出,目前有三個版本,分別是1.0、1.二、2.0. 其中最新穩定可發佈版本是2.0。 目前項目針對1.2和2.0版本在作分支升級開發,1.2版本是從1012開始進行升級,2.0版本是1213開始進行升級維護的。
(3)Trunk、Tags、Branches詳細解讀程序員
① trunk[主幹]sql
任什麼時候候,應該保證trunk裏面的代碼是最新的穩定版本
當branch裏面修改的代碼通過屢次測試成功經過後,應該把branch裏面的代碼合併到主幹trunk裏
② tags[存儲階段性的發佈版本]數據庫
將某時刻認爲穩定的最新版本做爲一個備份保存在tags目錄下,以便隨時切換到該穩定節點版本 做爲一個里程碑的版本進行存檔 注意:tags下面的版本文件默認是隻讀的(能夠強制修改),但仍是建議不要修改tags下面的任何文件。 經常聽項目經理說: A.嗯,不錯。這個版本比較穩定,給打個2.0版本極限吧。 B.有沒有搞錯,這個版本這麼多錯誤還敢上線!趕忙給我回退到上一個版本! 相對應的操做是: A.將當前trunk裏的代碼"複製"一份到tags下面(cnblogs_release_version_2.0),並註明這個版本的更新和修改狀況 B.忽略本次發佈版本(cnblogs_release_version_2.0),將系統回退到上一個經測試驗證後比較穩定的版本(cnblogs_release_version_1.2)
③ branches[分支]併發
一個branch是某個 trunk 的一個拷貝 新建的branch在repository中其實只是一個指向trunk某個revision的軟鏈接而已,並無真的複製文件。 流程:從trunk建立(create)branch,而後在branch上作開發,開發完畢後合併(merge)到trunk中。 項目經理把小李子和小葉子叫過來講: 大家負責的模塊都有不一樣程度的問題,須要修改一下。 可是我不想讓大家在trunk裏面直接修改,大家回頭各自建立一個branch,分別修改完本身的bug再合併到trunk裏面吧 1)一個重要問題:branch和trunk在並行開發的過程當中如何感知對方,避免二者越走越遠,致使最後沒法合併? 解決這一問題的惟一手段是:branch要不停地和trunk保持同步,你要及時地知道trunk都作了什麼修改,這些修改是否會影響你正在開發的新功能,若是須要,你必須及時調整branch的代碼,使之能與trunk「兼容」。 2)那麼如何讓branch和trunk保持同步?合併,從trunk合併到branch,你沒聽錯,是從trunk合併到branch。 關於TortoiseSVN的合併,有幾點須要注意: A.TortoiseSVN的合併發生在本地,也即你的working copy中,你無需過多擔憂會對repository中的代碼形成影響 B.不論是從trunk合併到branch仍是最終從branch合併回trunk,在每次合併前最好先update,而後將本地的修改先所有commit,保護好現場,萬一合併不理想隨時均可以revert C.合併完成後看是否能正確編譯,而後測試驗證,最後將合併後的改動提交到repository
(4)Branch和Merge具體執行流程測試
① 建立Branch/Tagurl
在/trunk/MyProject目錄上右鍵,選擇「分支/標記」,在彈出框中的"ToURL"中填入分支/標記的地址,
在這裏目標revision選擇HEAD revision。添加log後點擊ok分支/標記便創建了。
② 檢出(Check Out)或者切換(Switch)到分支,在分支中作修改spa
③ 將trunk中的修改同步到branchcode
首先,保證此時trunk中的代碼是最新的,沒有任何衝突。(該Commit的和Update的都已經執行完畢) "Merge a range of revision" - 將某個分支或主線上提交的多個revision間的變化合併到另一個分支上。 當branch和trunk在獨立、並行地開發時,爲了防止在「錯誤」的道路上越走越遠,branch意識到是時將trunk合併到branch了。
trunk先Update至最新代碼,在/branches/MyProject上右鍵,選擇Merge選項,選擇"Merge a range of revision"。
在點擊Merge按鈕前你能夠先Testmerge一把,當作功與否,以及merge的詳細信息。
點擊Merge按鈕後trunk所作的修改將同步到branch中。
至此,branch已經徹底和trunk同步,branch和trunk的代碼相處很融洽,沒有任何衝突。
④ 將branch合併回trunk
首先,須要保證此時branches中的代碼是最新的,沒有任何衝突。(該Commit的和Update的都已經執行完畢) "Reintegrate a branch" - 在分支開發結束後將全部的改動合併回主線。 在/trunk/MyProject上右鍵,選擇「Merge」,在彈出的窗口中,Merge type選擇"Reintegrate a branch" 最後,須要將成功合併後的trunk趕忙commit!
⑤ 刪除branch
若是你認爲你新加的功能已經開發完成了,你能夠刪除你的分支。