上一篇博客我們分享了新增需求的確定思想《站在全局看問題》。今天我們來分享項目開發中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時每次都是先提交,後更新。每天早上打開後,首先要從版本庫獲取最新版本。每天下班前必須將已經編輯過的文檔都提交到版本庫。