Subversion(SVN)
YehYeh\'s Notepad yehyeh@gmail.com 

Subversion(SVN) - 衝突 & 合併 & 還原

衝突(conflict)

  • 工作副本和檔案庫通訊時,若2邊的檔案和基準版本不一致
    • 甲、乙都修改某一檔案,當一方commit後
    • 另一方執行update時就會產生衝突
  • 可能產生衝突的指令:
    • update
    • merge
    • switch
  • 衝突處理
    • 開發人員討論 修改程式 執行Resolve 執行commit
      • Resolve用來標示衝突已解決
      • 執行Resolve後才能正常commit
  • 衝突的類型
    • 檔案衝突
      • 2個或以上開發人員對同一檔案修改同一行或相鄰行程式碼
      • SVN會對有衝突的檔案,自動產生3個檔案
        1. 檔名.mime:工作副本中有修改過版本
        2. 檔名.r舊版本:最後一次成功更新或checkout的版本
        3. 檔名r新版本:檔案庫中被修改過的版本
    • 屬性衝突
      • 2個或以上開發人員修改同一個檔案的屬性
    • 樹衝突
      • 當一個開發人員對專案內的檔案或資料匣執行 - 移動、改名、刪除、修改
      • 若有另一個開發人員也執行 - 移動、改名、刪除、修改
  • SVN的衝突機制不是萬能的,沒辨法找出程式邏輯上的衝突 測試來找出邏輯衝突
Δ 回到最上方

合併(merge)

  • 合併(merge)
    • 將工作副本與檔案庫中的某一個版本整合
    • 將工作副本還原回舊版
    • 合併時可能會發生衝突 合併後務必處理衝突
    • 合併後需重新Build專案並測試
      • 沒衝突不代表沒bug
      • 即使程式碼沒有衝突,但邏輯上仍可能有衝突
    • 合併完需再執行commit,送交到檔案庫
  • 合併的類型
    • 將主線合併到分支Merge a range of revisions 將主線合併到分支
      • 開發分支時,用來和主線同步
      • 會合併多個修訂版本 只合併有差異的修訂版本
      • 還原指定修定版本的異動Reverse Merge
        • 例如發現212修定版本的修改是不必要或是錯誤的,可以用Reverse Merge取消當次的commit
      • 摘要合併Cherrypicking 摘要合併
        • 只合併指定版本的差異集(changeset)
    • 將分支合併到主線Reintegrate a branch 將分支合併到主線
      • 完成分支開發時,將分支併回主線
    • 將2個樹狀結構合併Merge two different trees
      • 可指定2個URL,及其修訂版本範圍萬用合併
Δ 回到最上方

將分支合併回主線

  • 特性:
    • 分支合併到主線,合併後主線和分支會一模一樣
  • 優點:
    • SVN會記錄是由那個Branch合併到Trunk
    • 節省檔案庫空間
    • 可以產生Revision Graph
  • 作法:
    1. 在分支工作副本,先將主線合併到分支並commit
    2. 切換到主線的工作副本(checkout or switch)
    3. 主線的工作副本update到最新版本
      • 不可有未commit檔案及混合修訂版本號
    4. 對主線執行Reintegrate a branch
    5. 解決衝突 Build 測試 commit
    6. 切換回分支的工作副本 刪除分支 commit
  • 分支刪除後,對分支仍可對分支的URL查詢History Log
  • 當分支合併到主線後
    • 分支不再繼續開發: delete commit
    • 分支想繼結開發:由主線再建新分支
Δ 回到最上方

還原已刪除的檔案

  • 假設目前檔案庫最新的修訂版本為222,想還原修訂版本212中刪除的檔案object.cpp
    • 方法一:
      • 利用Reverse Merge還原修訂版本212的異動
      • 若某修訂版本異動檔案很多,但只想還原其中少數幾個檔案時,則不適用
    • 方法二:
      • 利用copy指令,由修訂版本211複製object.cpp到工作副本
Δ 回到最上方

還原舊版本

  • 方法一:
    • 使用merge
  • 方法二:
    • 將工作副本刪除
    • 使用checkout取出指定的版本
    • Commit時會出現Out of Date Error
  • 方法三:
    • 使用update to revision
    • Commit會出現Out of Date Error
Δ 回到最上方