SVN trunk(主線) branch(分支) tag(標(biāo)記) 用法詳解和詳細(xì)操作步驟

使用場景:

假如你的項目(這里指的是手機客戶端項目)的某個版本(例如1.0版本)已經(jīng)完成開發(fā)、測試并已經(jīng)上線了,接下來接到新的需求,新需求的開發(fā)需要修改多個文件中的代碼,當(dāng)需求已經(jīng)開始開發(fā)一段時間的時候,突然接到用戶或測試人員的反饋,項目中有個重大bug需要緊急修復(fù),并且要求bug修復(fù)后要立即上線;此時應(yīng)該怎么修復(fù)bug呢?是在當(dāng)前已經(jīng)開發(fā)新需求的基礎(chǔ)上進(jìn)行修復(fù)嗎?答案是否定的,原因是:如果是在已經(jīng)開發(fā)新需求的基礎(chǔ)上進(jìn)行修復(fù)bug,那么新需求還沒開發(fā)好,更沒有測試,怎么立刻(或最可能快的)上線?!再次如果新功能的開發(fā)和bug修復(fù)的代碼都涉及到同一段代碼沖突了怎么辦 。很顯然不能在當(dāng)前開發(fā)的代碼基礎(chǔ)上進(jìn)行bug修復(fù)工作完美的解決方案是:在當(dāng)時完成的那個版本中進(jìn)行bug fix,這樣帶來的好處是:

  • 1:bug修復(fù)好之后可立即上線,不會因為新需求還沒有完成或測試而延遲上線時間

  • 2: bug修復(fù)是在原來上線的那個版本進(jìn)行修復(fù)的,引起新bug的風(fēng)險小,如果是在新需求的基礎(chǔ)上修復(fù)bug, 那么新功能可能會帶來新的bug

SVN倉庫目錄結(jié)構(gòu)Repository:

  • trunk
  • tags
  • branches

trunk(主干|主線) branchs(分支) tags(標(biāo)記)

  • truck(主干|主線|主分支):是用來做主方向開發(fā)的,新功能的開發(fā)應(yīng)放在主線中,當(dāng)模塊開發(fā)完成后,需要修改,就用branch。
  • branch(分支):分支開發(fā)和主線開發(fā)是可以同時進(jìn)行的,也就是并行開發(fā),分支通常用于修復(fù)bug時使用
  • tag(標(biāo)記):用于標(biāo)記某個可用的版本,可以標(biāo)記已經(jīng)上線發(fā)布的版本,也可以標(biāo)記正在測試的版本,通常是只讀的

SVN具體操作步驟:(TortoiseSVN版本: 1.8.8)

一:創(chuàng)建倉庫

    1. 創(chuàng)建目錄結(jié)構(gòu)D:\TortoiseSVN\Repository\Repo-iOS
    1. 在該目錄結(jié)構(gòu)上右鍵
      ---> TortoiseSVN
      ---> Create repository here(創(chuàng)建倉庫這里)
      ---> Create folder structure(創(chuàng)建文件結(jié)構(gòu)) ---> Start Repobrowser(開始倉庫瀏覽) ---> Ok


      image.png

      image.png

      image.png

二:將項目上傳到SVN上

桌面右鍵
---> TortoiseSVN
--->repo-browser--> URL: file:///D:/TortoiseSVN/Repository/Repo-iOS ---> Ok
--> 選中trunk文件夾右鍵
---> Add folder...
---> 選中要上傳到SVN的項目的最外層目錄,輸入日志
---> Ok


image.png

image.png

三:Check Out

  1. 在電腦任意位置創(chuàng)建一個存放項目代碼的目錄,例如:D:\TortoiseSVN\Repository\Source
  2. 將代碼檢出到該位置


    image.png

四:開發(fā)周期

  1. 在目錄D:\TortoiseSVN\Repository\Source\trunk\MyAppProject上進(jìn)行開發(fā),注意是在trunk主線上
    因為項目剛建立,這是在開發(fā)新功能,所以要在主線上開發(fā)
  2. 開發(fā)一段時間后,經(jīng)測試,上線到App Store,Android上傳到其它應(yīng)用商城,摘取上線時的HomeViewController文件中一段代碼如下
- (void) viewDidLoad {
   [super viewDidLoad];
   // -----------------------------------------
    int y = 0;
    int result = 10 / y;   
    NSLog(@"iOS APP 第一階段開發(fā)完成了! 結(jié)果是:%ld", result);
   // End
}
  1. 在D:\TortoiseSVN\Repository\Source\tags 目錄下新建一個目錄:1.0,并將該目錄提交到SVN上,然后右鍵 D:\TortoiseSVN\Repository\Source\trunk\MyAppProject該目錄---> TortoiseSVN---->Branch/tag... ----->
    To Path :/tags/1.0/MyAppProject 并選中 Head revision in repository --->
    Ok此時Source/tags/1.0 目錄中沒有任何內(nèi)容,需要更新一下該目錄做update操作。更新之后看到一個完整的項目源碼保存到該目錄中(該目錄下的源碼可看做是trunk目錄下版本為1.0的一個副本),查看一下/tags/1.0/HomeViewController中的viewDidLoad和trunk/MyAppProject/HomeViewController中的viewDidLoad代碼完全一樣。


    image.png

    image.png
  2. 開發(fā)下一階段的新需求,開發(fā)中ing

  3. 用戶或測試人員反饋應(yīng)用有重大bug,需要立即修復(fù)該bug并盡快上線, 此時程序員需要為 tags/1.0 下的MyAppProject 打一個分支branch。

  • 操作過程如下:選中Source/tags/1.0/MyAppProject
    右鍵 TortoiseSVN---->Branch/tag... -----> To Path :/branches/MyAppProject ---> Ok
    此時看D:\TortoiseSVN\Repository\Source\branches目錄下仍然沒有任何內(nèi)容,也需要update一下,更新之后發(fā)現(xiàn)該目錄下
    也出現(xiàn)一個完整的項目代碼(該代碼可看做是tags/1.0/MyAppProject的一個副本),注意打分支和打標(biāo)記都是使用Branch/tag...菜單,不同的是To Path 的目錄不一樣,圖解看打分支的圖,只是to path 值不一樣,此時branches/MyAppProject/HomeViewController中的viewDidLoad和tags/1.0/MyAppProject/HomeViewController中的viewDidLoad代碼完全一致。
  1. 切換工作空間,使用Xcode|Eclipse集成工具打開/branches/MyAppProject下的項目,然后在此基礎(chǔ)上調(diào)試并修復(fù)bug,注意打開的必須是分支中的項目

  2. bug 修復(fù)好后,先提交修改的文件,并進(jìn)行客戶端App上線,上線完成后再將branches/MyAppProject/打個tag到1.0.1目錄下(tags/1.0.1)(操作步驟同步驟3),tag操作完成后,可以看到tags/1.0.1/HomeViewController.viewDidLoad 和 branches/ MyAppProject/HomeViewController.viewDidLoad是完全一致的,將branches/MyAppProject打一個新的tag是以便于下次在此基礎(chǔ)上再次修復(fù)bug,至此bug修復(fù)已經(jīng)完成;修復(fù)bug后的代碼如下:

- (void) viewDidLoad {
   [super viewDidLoad];
   // -----------------------------------------
    int y = 10;
    int result = 10 / y;
    NSLog(@"iOS APP 第一階段開發(fā)完成了! 結(jié)果是:%ld", result);
   // End
   NSLog(@"1.0 版本閃退bug 已修復(fù), 程序出現(xiàn)除0異常");
}
  1. 接下來將branch和trunk進(jìn)行合并,操作步驟如下:
    右鍵 branches/MyAppProject ------>TortoiseSVN
    ----> Merge...
    ---> Merge a range of revisions
    ----> Next --->URL to merge from : file:///D:/TortoiseSVN/Repository/Repo-iOS/trunk/MyAppProject
    ----> Next
    ----> Merge


    image.png

    image.png
  2. 將trunk和branches進(jìn)行合并 步驟如下,
    右鍵/turnk/MyAppProject ----> Merge... -----> Merge a range of revisions -----> Next
    -----> URL to merge from : file:///D:/TortoiseSVN/Repository/Repo-iOS/branches/MyAppProject
    步驟同上,只是 URL to merge from 的路徑不一樣。合并完成后,查看一下/trunk/MyAppProject/HomeViewController/viewDidLoad方法如下:

- (void) viewDidLoad {
   [super viewDidLoad];
   // -----------------------------------------
    int y = <strong>10</strong>;            // <strong>可以看到branches分支中的代碼已經(jīng)合并到主線上了</strong>
    int result = 10 / y;
    NSLog(@"iOS APP 第一階段開發(fā)完成了! 結(jié)果是:%ld", result);
   // End
 
   NSLog(@"<strong>1.0 版本閃退bug 已修復(fù), 程序出現(xiàn)除0異常</strong>");
 
   NSLog(@"其他同事在主線trunk中進(jìn)行新需求開發(fā)...");
   NSLog(@"其他同事在主線trunk中進(jìn)行新需求開發(fā)...");
}
  1. 此時合并徹底結(jié)束,branches目錄下的源碼如果不想要也可以刪掉,接著修改bug的這位程序員需要切換工作空間到主線上來,使用Xcode重新打開trunk/MyAppProject項目,接著開發(fā)尚未完成的新功能。SVN目錄如下:


    image.png

    說明:

  2. 分支開發(fā)和主干開發(fā)是兩個完全獨立的過程,兩者可以同時進(jìn)行開發(fā)
  3. 因分支和主干開發(fā)是并行的,所以兩者可以任意的多次提交當(dāng)前工程所修改的文件
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容