Subversion(SVN) - 衝突 & 合併 & 還原
衝突(conflict)
- 工作副本和檔案庫通訊時,若2邊的檔案和基準版本不一致
-
- 甲、乙都修改某一檔案,當一方commit後
- 另一方執行update時就會產生衝突
- 可能產生衝突的指令:
- update
- merge
- switch
- 衝突處理
- 開發人員討論 修改程式 執行Resolve 執行commit
- Resolve用來標示衝突已解決
- 執行Resolve後才能正常commit
- 開發人員討論 修改程式 執行Resolve 執行commit
- 衝突的類型
- 檔案衝突
- 2個或以上開發人員對同一檔案修改同一行或相鄰行程式碼
- SVN會對有衝突的檔案,自動產生3個檔案
- 檔名.mime:工作副本中有修改過版本
- 檔名.r舊版本:最後一次成功更新或checkout的版本
- 檔名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,及其修訂版本範圍萬用合併
- 將主線合併到分支:Merge a range of revisions
將分支合併回主線
- 特性:
- 分支合併到主線,合併後主線和分支會一模一樣
- 優點:
- SVN會記錄是由那個Branch合併到Trunk
- 節省檔案庫空間
- 可以產生Revision Graph
- 作法:
- 在分支工作副本,先將主線合併到分支並commit
- 切換到主線的工作副本(checkout or switch)
- 主線的工作副本update到最新版本
- 不可有未commit檔案及混合修訂版本號
- 對主線執行Reintegrate a branch
- 解決衝突 Build 測試 commit
- 切換回分支的工作副本 刪除分支 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