天天看點

svn沖突問題詳解 SVN版本沖突解決詳解svn沖突問題詳解 SVN版本沖突解決詳解

(摘自西西軟體園,原文連結http://www.cr173.com/html/46224_1.html)

解決版本沖突的指令。在沖突解決之後,需要使用svnresolved來告訴subversion沖突解決,這樣才能送出更新。沖突發生時,subversion會在WorkCopy中儲存所有的目标檔案版本(上次更新版本、目前擷取的版本,即别人送出的版本、自己更新的版本、目标檔案。

開發人員都知道代碼管理工具是開發中一個必不可少的工具,這裡也不廢話詳細介紹了。不管你個人喜歡git還是svn還是其他,但還有一大部分公司在使用svn做代碼管理工具。這裡詳細介紹下SVN送出檔案時沖突問題的解決方式。

假設A、B兩個使用者,他們分别從svn伺服器中檢出了test1.txt檔案,此時A、B、伺服器三個地方的test1.txt的版本都是13(我測試環境的目前svn賦予的版本号)。A、B檔案的内容如下圖(左A右B):

·

接下來,B使用者添加一句話并送出,内容如下:

此時B使用者和伺服器的test1.txt的版本都變為14,隻有A使用者的test1.txt的版本還為13。接下來A使用者添加一句“aa”,然後送出

由于A使用者是在13版本上做的修改,而伺服器已經是14版本了,是以會送出失敗:

接下來就是我們要解決的問題了,解決方法分為以下兩種方式。第一種方式:送出失敗後直接選擇revert,省去了解決沖突問題;第二種方式:送出失敗後選擇更新檔案,這時會有沖突問題。詳細介紹如下:

第一種方式:

A放棄自己修改的内容,進行Revert操作,使其test1.txt成為13版本的最初内容。然後update使其test1.txt成為14版本,再在14版本上修改送出。操作如下圖:

==》

   ==>然後再修改送出

第二種方式:

因為版本過時,送出失敗後。A使用者直接選擇更新操作,結果如下圖所見

(這裡聲明下,不要被檔案顯示的圖示所迷惑,這是其他軟體對它做了關聯導緻的,沒啥影響)

這裡詳細說一下産生沖突後的這幾個檔案,:

test1.txt.mine---這個檔案是A使用者在13版本中做了修改要送出的檔案。它的内容是:13版本内容+A使用者的修改

test1.txt.r13----這個檔案是A使用者最初的13版本的test1.txt。它的内容是:13版本内容

test1.txt.r14----這個檔案時svn伺服器中test1.txt的最新版本,這裡既是B使用者送出後的14版本。它的内容是:13版本内容+B使用者的修改

test1.txt--------由于A使用者選擇了直接更新,此檔案就是svn将 最新版本14 與 A使用者的修改 合并後的檔案。它的内容如下:

接下來說一下如何解決。對于源代碼檔案或其他的純文字檔案,我們可以将上圖的A使用者test1.txt的内容整理下,使其滿足條件,然後 選擇,這時test.txt.mine、test1.txt.r13、test1.text.r14将會消失。使用者A就可以順利送出了。但是,如果test1.txt是一個非純文字檔案,比如excel,這時的test1.txt将沒法手動合并了,不得不放棄自己的修改。可以在test1.txt上右鍵選擇消除掉test.txt.mine、test1.txt.r13、test1.text.r14這三個檔案。(點選Resolve不會更改test1.txt以及伺服器端的内容,僅僅是消除了那幾個檔案。)此時的test1.txt檔案是可以送出的,它對應的是伺服器的最新版本,即14版本(因為這是svn将伺服器最新版本14和A使用者修改内容合并後的結果)。但這是svn幫我們合并的,是不合法的檔案。我們可以右鍵然後選擇,然後test1.txt就會變成14版本,A使用者的修改沒有了,A、B、伺服器的test1.txt都成為了14版本。如下圖:

接下來A使用者就可以再進行修改送出了。

總結

對于純文字檔案因版本過時送出失敗的情況,我們可以選擇更新一下,然後打開”自己的修改和伺服器最新版合并“後的檔案(如上文發生沖突時的test1.txt檔案),進行手動合并,處理好後選擇resolve然後送出。

對于非純文字檔案因版本過時送出失敗時,我們隻能犧牲一下自己,選擇,然後更新到伺服器最新版本,再修改送出

例如,如果sally修改了一個檔案sandwich.txt,而harry也剛剛修改了這個檔案的相同位置并送出到伺服器。那麼sally在做這個檔案的update操作的時候會得到三個額外的檔案sandwich.txt.mine、sandwich.txt.r1、sandwich.txt.r2。并且在送出的時候會遭到伺服器的拒絕,因為這個檔案的沖突問題還沒有得到解決。要解決這個沖突,可以選擇:

a.手工合并SVN沖突檔案(檢查和修改檔案中的沖突标志)。

b.用一個臨時檔案(三個中的一個)覆寫你的工作檔案。

c.運作svnrevert<filename>來放棄所有的修改。

一旦解決了你的沖突,需要通過指令svnresolved讓subversion知道并删除三個臨時檔案。這時才可以送出。

下面再說說手工合并SVN沖突。開始的時候讓人覺得害怕,但做一段時間之後,就覺得不那麼煩人了。

看看如下文本:

Mayonnaise

Lettuce

Tomato

Provolone

<<<<<<<.mine

Salami

Mortadella

Prosciutto

=======

Sauerkraut

GrilledChicken

>>>>>>>.r2

CreoleMustard一連串的大于、小于、等于号是SVN沖突标記,這些資料得全部删除才可以送出。其中,

=======是你在沖突區裡面做的修改。

是别人在沖突區做的修改。

在SVN沖突區中,或許你需要和你的同僚溝通來安排沖突區的文本内容,如果是程式代碼,你需要和同僚商量一下,中間的這段代碼到底應該是什麼樣子的。

所有沖突區得到合理的解決之後,你就可以送出你的檔案了。

版本沖突原因:

假設A、B兩個使用者都在版本号為100的時候,更新了kingtuns.txt這個檔案,A使用者在修改完成之後送出kingtuns.txt到伺服器,這個時候送出成功,這個時候kingtuns.txt檔案的版本号已經變成101了。同時B使用者在版本号為100的kingtuns.txt檔案上作修改,修改完成之後送出到伺服器時,由于不是在目前最新的101版本上作的修改,是以導緻送出失敗。

版本沖突現象:

沖突發生時,subversion會在目前工作目錄中儲存所有的目标檔案版本[上次更新版本、目前擷取的版本(即别人送出的版本)、自己更新的版本、目标檔案]。

假設檔案名是kingtuns.txt

對應的檔案名分别是:

kingtuns.txt.r101

kingtuns.txt.r102

kingtuns.txt.mine

kingtuns.txt。同時在目标檔案中标記來自不同使用者的更改。

版本沖突解決:

場景:

1、現在A、B兩個使用者都更新kingtuns.txt檔案到本地。

2、文檔中原始檔案内容如下:

3、A使用者修改檔案,添加内容“A使用者修改内容”完成後送出到伺服器

4、B使用者修改檔案,添加内容“B使用者修改内容”完成後送出到伺服器

B使用者送出更新至伺服器時提示如下:

B使用者将檔案送出至伺服器時,提示版本過期:首先應該從版本庫更新版本,然後去解決沖突,沖突解決後要執行svn

resolved(解決),然後在簽入到版本庫。在沖突解決之後,需要使用svn

resolved(解決)來告訴subversion沖突解決,這樣才能送出更新。

解決沖突有三種選擇:

A、放棄自己的更新,使用svn revert(復原),然後送出。在這種方式下不需要使用svn resolved(解決)

B、放棄自己的更新,使用别人的更新。使用最新擷取的版本覆寫目标檔案,執行resolved filename并送出(選擇檔案—右鍵—解決)。

C、手動解決:沖突發生時,通過和其他使用者溝通之後,手動更新目标檔案。然後執行resolved filename來解除沖突,最後送出。

解決步驟如下:

1、  在目前目錄下執行“update”(更新)操作

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

Theirs視窗為伺服器上目前最新版本

Mine視窗為本地修改後的版本

Merged視窗為合并後的檔案内容顯示

3、  如果要使用伺服器版本,在Theirs視窗選中差異内容,右鍵,選擇Use this text block(使用這段文本塊)。

同理如果要使用本地版本,在協商後,在Mine視窗右鍵,選擇Use this text block(使用這段文本塊)。

4、  修改完成後,儲存kingtuns.txt檔案内容。

5、  在B使用者的沖突目錄下,選中檔案--右鍵菜單—TortoiseSVN—Resolved(解決)。會列出沖突的檔案清單,如果确認已經解決,點OK。

6、  沖突解決

7、送出解決沖突後的檔案。

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

1、當文檔編輯完成後,盡快送出,頻繁的送出/更新可以降低在沖突發生的機率,以及發生時解決沖突的複雜度。

2、在送出時,寫上明确的message,友善以後查找使用者更新的原因,畢竟随着時間的推移,對當初更新的原因有可能會遺忘

3、養成良好的使用習慣,使用SVN時每次都是先送出,後更新。每天早上打開後,首先要從版本庫擷取最新版本。每天下班前必須将已經編輯過的文檔都送出到版本庫。