上一篇部落格我們分享了新增需求的確定思想《站在全域看問題》。今天我們來分享項目開發中SVN衝突的解決經驗:SVN衝突和處理!
引言
開發過項目的人都知道,公司開發一個項目都會使用到版本控制工具,版本控制工具很多,比如Clear case,CVS,Visual SourceSafe,SourceAnywhere ,StarTeam,SVN,CVS,GIT等等,有的是元老級開發工具,有的是後起之秀,各種版本,百花齊放,這篇部落格我們將要談到的則是常用版本控制工具:SVN的衝突和處理。
執行個體
1.衝突產生
假設A、B兩個使用者都在版本號碼為1000的時候,更新了practice.txt這個檔案,A使用者在修改完成之後提交practice.txt 到伺服器,這個時候提交成功,然後practice.txt檔案的版本號碼已經變成1001了。同時B使用者在版本號碼為1000的practice.txt檔案上作修改,修改完成之後提交到伺服器時,由於不是在當前最新的1001版本上作的修改,所以導致提交失敗。
衝突發生時,subversion會在當前工作目錄中儲存所有的目標檔案版本[上次更新版本、當前擷取的版本(即別人提交的版本)、自己更新的版本、目標檔案]。
(1)現在A、B兩個使用者都更新practice.txt檔案到本地。
(2)文檔中原始檔案內容如下:
(3)A使用者修改檔案,新增內容“A使用者修改-提交”完成後提交到伺服器
(4)B使用者修改檔案,新增內容“B使用者修改-提交”完成後提交到伺服器
(5)B使用者提交更新至伺服器時提示如下:
B使用者將檔案提交至伺服器時,提示版本到期:首先應該從版本庫更新版本,然後去解決衝突,衝突解決後要執行svn resolved(解決),然後在簽入到版本庫。在衝突解決之後,需要使用svn resolved(解決)來告訴subversion衝突解決,這樣才能提交更新。
2.
衝突
處理
方法一:放棄自己的更新,使用svn Revert(復原),然後提交。
當使用svn revert時不需要再用svn resolved來刪除臨時檔案了,因為撤銷會恢複所有的檔案到修改前,除了已刪除的檔案。
方法二:放棄自己的更新,使用別人的更新。使用最新擷取的版本覆蓋目標檔案,執行resolved filename並提交(選擇檔案—右鍵—解決);
方法三:手動解決,衝突發生時,通過和其他使用者溝通之後,手動更新目標檔案。然後執行resolved filename來解除衝突,最後提交。
(1)手工合并衝突檔案:當查看了具體出衝突的檔案後,可以開啟該檔案,找到衝突的標誌。
Top piece of bread
Mayonnaise
Lettuce
Tomato
Provolone
<<<<<<< .mine
Salami
Mortadella
Prosciutto
=======
Sauerkraut
Grilled Chicken
>>>>>>> .r2
Creole Mustard
Bottom piece of bread
小於和大於符號之間的就是衝突的地方,如果有能力在修改完檔案並且刪除衝突標誌之後,進行svn resolved來刪除三個臨時檔案
註:如果修改時不是很明白,可以參考衝突時的三個檔案
(2)複製某一工作檔案(一般用的不是很頻繁):如果只是希望取消本次的修改,你可拷貝svn為你產生的檔案替換你的工作拷貝
$ svn update
C practice.txt
Updated to revision 2.
$ ls practice.*
practice.txt practice.txt.mine practice.txt.r2 practice.txt.r1
$ cp practice.txt.r2 practice.txt(這裡r2是版本庫裡你此次更新前的版本檔案)
$ svn resolved practice.txt(用來刪除三個臨時檔案)
OK!衝突解決!
提交更新!
總結
有時候衝突是不可避免的,但是我們可以盡量降低衝突的複雜度,具體解決方式有:
1、當文檔編輯完成後,儘快提交,頻繁的提交/更新可以降低在衝突發生的機率,以及發生時解決衝突的複雜度。
2、在提交時,寫上明確的message,方便以後尋找使用者更新的原因,畢竟隨著時間的推移,對當初更新的原因有可能會遺忘。
3、養成良好的使用習慣,使用SVN時每次都是先提交,後更新。每天早上開啟後,首先要從版本庫擷取最新版本。每天下班前必須將已經編輯過的文檔都提交到版本庫。