1. 程式人生 > >解決常見svn衝突問題

解決常見svn衝突問題

  一個大專案在開發中可能會拆分成幾個小專案,分別分去,同時共通的部分再由人做,做完後再統一合併。同時,在開發中,共通的部分修改後,其它人要保持同步。
       
        在這個開發過程中我們就需要用到svn去管理我們的的程式碼,可是在使用過程中,我們經常可能遇到各種各樣的衝突問題,相當的頭疼鬱悶……,嚴重影響開發的工作效率
       
        在做總結之前我們先搞清幾個概念和規則:
        ①利用svn checkout,upade、merge下來的程式碼本地,無論你如何操作及時產生衝突,也不會造成主幹上面的程式碼混亂衝突。(記住本地產生衝突,還原到上一個版本就行了,一定不要提交到主幹導致主幹出問題)
        ②原生代碼有衝突一定不可向主幹提交程式碼,解決好了再提交
        ③merge合併程式碼時,是分支或者主幹跟本地的程式碼進行合併(這個概念一定要理解清楚),出現問題不要慌,大不了重新來過,反正只是本地操作而已
        ④建立分支是可以直接命令branchs/tag或者在trunk Copy to        分支,切勿直接拷貝檔案
        ⑤養成開發時將(switch)切換到主幹(trunk)建立分支(branchs),上線時切換到主幹合併(merge)分支,保持主幹的準確性
       


        由於使用svn的過程中遇到的種種坑,對解決衝突問題做一下總結:

        一、svn 提交程式碼遇到的衝突問題
       
        1. 如果執行svn commit命令時遇到了"xxx is out of date"提示,如下圖所示:

       

        那麼一般是因為您修改了本地某檔案或目錄結構,而別人也修改了同一個的檔案或目錄並且先於您提交到了SVN庫。

        2. 解決的辦法是先使用svn update命令獲取SVN庫上最新修改的檔案,這個命令並不會直接覆蓋掉您本地所做的修改,SVN客戶端會先嚐試將SVN庫上該檔案的修改合併到你的本地檔案中。

        如果SVN客戶端成功的進行了合併,您可以再次執行SVNcommit命令進行本地檔案的提交即可。

        3. 如果SVN客戶端無法進行自動合併(可能因為檔案是一些二進位制檔案,或者兩人修改的地方是同一個,或者修改的地方太多等原因),則svn客戶端會提示“one or more files are in confict state
(遇到這樣的英文,就頭疼了)”,即告訴您有檔案發生了衝突,如下圖所示:


        4. 如果是文字檔案衝突,則在資料夾下會多出幾個衝突檔案,如下圖所示:
       

        其中:
        -f2是嘗試合併的檔案,裡面有svn客戶端加入的一些標記;(這個檔案是,合併的檔案,裡面有註釋標記,告訴你那裡出現了衝突)
        -f2.r69是您本地修改檔案的基礎版本,69是版本號;(這個檔案時你這個版本的問題,注意,是你沒有做更改的版本)
        -f2.mine是您本地修改後的檔案,即f2.mine是在f2.r69檔案基礎上更改的(這個檔案時你現在本地改完的版本);
        -f2.r70是伺服器上最新版本的檔案,即別人修改後提交的檔案。(這個檔案是線上的最新版本)       


        此時的解決方法有多種:
        (1)比較f2.r70和f2.mine,將您自己做的修改和別人做的修改手工合併,可以下載一個Beyond Compare 比較檔案不同,手動做更改,然後把合併後的內容覆蓋到f2中。
        最後右鍵點選f2,然後選擇Resovled,之後f2.mine,f2.r69,f2.r70檔案都會自動被刪除。然後您再次執行svn commit就可以了。如下圖所示:

       
        (2)如果要保留別人的修改而放棄自己的修改,則可以刪掉f2,f2.mine, f2.r69,f2.r70幾個檔案,再執行以下update,這樣會重新從伺服器上把最新檔案下載到本地。

        (3)如果是保留自己的修改而放棄別人的修改,則可以刪掉f2,f2.r69,f2.r70,然後把f2.mine改名為f2,然後再次執行svn commit,就可以把自己的修改上傳到svn伺服器。

        5. 如果發生衝突的是二進位制檔案,此時SVN客戶端是無法執行自動合併的,這樣目錄下只會多出以.rXX結尾的兩個檔案,而不會出現.mine結尾的檔案,此時的處理方法可以參考上面的(2)(3)。


        二、svn 合併分支時遇到的衝突問題
       
        svn 合併分支時,svn後臺基本上可以理解成進行了2種操作:①增加本地沒有的檔案 ②合併本地已有但不同的檔案
       
        1.增加本地沒有的檔案,並不會造成衝突

        2.合併本地已有但不同的檔案 ,如果單單是update就不會造成衝突,一旦出現update不了,svn無法自動識別合併,就會出現conflict衝突,這就蛋疼了。

        針對合併出現的衝突問題,把整個合併過程也圖文並茂的講解一下:



        從主幹 ( trunk ) 合併至分支 ( branches) 通常選第 1 個,也就是 [Merge a range of revisions],這個選單也是我們合併時用的最多的
       
        注意:其實也可以理解為把另一個分支合併到當前分支,這裡就相當於把主幹當成當前分支,有的版本比較高的svn可能就還有另一個選單如圖所示[Reintegrate a branch],其實它才是在當前分支下,將分支合併到主幹的快捷操作,合併完成之後,我們可以刪除分支,最後還是推薦大家用第一種 [Merge a range of revisions]
       
       
       

        在 Merge 的視窗有以下注意事項:
        1.合併的來源,由於我們打算從分支 ( branches ) 合併至主幹(trunk),所以合併的來源要選 branches /2015.01.07才對!
        2.合併的結果會直接與目前「工作目錄」(Working Copy) 做比對,並修改目前工作目錄中的所有檔案。因此建議在做合併之前可以將所有尚未 commit 的檔案先 commit 到版本庫,避免不必要的衝突事件發生。
       
       
        如圖,可以看到的集中操作,add update沒有衝突產生, svn自動合併不了了就會產生衝突

       

        3.當我們點選Edit conflict

       

        在衝突的檔案上(選中檔案--右鍵選單—TortoiseSVN—Edit conflicts(解決衝突)),出現如下視窗

        Theirs視窗為伺服器上當前最新版本
        Mine視窗為本地修改後的版本
        Merged視窗為合併後的檔案內容顯示

        如果要使用伺服器版本,在Theirs視窗選中差異內容,右鍵,選擇Use this text block(使用這段文字塊)。
        同理如果要使用本地版本,在協商後,在Mine視窗右鍵,選擇Use this text block(使用這段文字塊)。


        4、  修改完成後,儲存檔案內容,提交即可。

        5、  如果另一個使用者的衝突目錄下,則可選中檔案--右鍵選單—TortoiseSVN—Resolved(解決)。會列出衝突的檔案列表,如果確認已經解決,點OK。


        最後,給大家一些使用svn的建議:

        如何降低衝突解決的複雜度:

        1、當文件編輯完成後,儘快提交,頻繁的提交/更新可以降低在衝突發生的概率,以及發生時解決衝突的複雜度。

        2、在提交時,寫上明確的message,方便以後查詢使用者更新的原因,畢竟隨著時間的推移,對當初更新的原因有可能會遺忘

        3、養成良好的使用習慣,使用SVN時每次都是先提交,後更新。每天早上開啟後,首先要從版本庫獲取最新版本。每天下班前必須將已經編輯過的文件都提交到版本庫。


        參考資料:
        http://blog.sina.com.cn/s/blog_5f54f0be0101f04y.html
        http://blog.csdn.net/windone0109/article/details/4857044