天天看點

[svn] 解決SVN沖突攻略(手冊)

This tutorial is walkthough on how to resolve a conflict in svn (subversion) 

這個手冊是解決svn沖突的攻略 

First I will make a test.txt 

首先,我建立了一個名為test.txt的檔案(在svn伺服器端),并錄入如下内容 

test 

Now I will commit the changes 

現在我們送出剛剛添加的内容 

C:\workspace\test>svn ci -m "making a starting point" 

Sending        . 

Sending        test.txt 

Transmitting file data . 

Committed revision 2. 

Suppose we have 2 users. User1 and User2. Both of them will get and update from svn 

假設我們有使用者1和使用者2兩個人通過svn用戶端擷取svn伺服器端的檔案test.txt 

C:\workspace\test>svn up 

A    test.txt 

At revision 2. 

Now User1 will change the file to: 

現在使用者1更改檔案test.txt内容為如下 

User1 is making a conflict test 

He then commits his changes 

然後使用者1送出剛才的更改 

C:\workspace\test>svn ci -m "User1 starting a conflict" 

Sending        . 

Sending        test.txt 

Transmitting file data . 

Committed revision 3. 

User2 now comes along and changes his local copy of the file not knowing that it has already been updated by User1 on the server. 

使用者2也對檔案test.txt做了更改,此時他并不知道使用者1做了更改并已送出。 

test User2 making a conflict 

When he tries to commit he will get and error from svn. 

當使用者2修改檔案test.txt完畢後,準備送出時出錯。 

svn: Commit failed (details follow): 

svn: File or directory 'test.txt' is out of date; try updating 

svn: resource out of date; try updating 

So User2 performs an update 

根據錯誤提示,使用者2更新了檔案test.txt(此時發生了沖突) 

C:\workspace\test>svn up 

Conflict discovered in 'test.txt'. 

Select: (p) postpone, (df) diff-full, (e) edit, 

        (mc) mine-conflict, (tc) theirs-conflict, 

        (s) show all options: 

svn detects that theres a conflict here and require you to take some kind of action. 

If you type ‘s’ here you will get a list of the commands and meaning 

如果你輸入s選項,則會列出所有svn解決沖突的選項,如下所示: 

(e)  edit             - change merged file in an editor               #直接進入編輯 

(df) diff-full        - show all changes made to merged file          #顯示更改至目标檔案的所有變化 

(r)  resolved         - accept merged version of file 

(dc) display-conflict - show all conflicts (ignoring merged version)  #顯示所有沖突 

(mc) mine-conflict    - accept my version for all conflicts (same)    #沖突以本地為準 

(tc) theirs-conflict  - accept their version for all conflicts (same) #沖突以伺服器為準 

(mf) mine-full        - accept my version of entire file (even non-conflicts)#完全以本地為準 

(tf) theirs-full      - accept their version of entire file (same)    #完全以伺服器為準 

(p)  postpone         - mark the conflict to be resolved later        #标記沖突,稍後解決 

(l)  launch           - launch external tool to resolve conflict 

(s)  show all         - show this list 

【選擇處理方式一:df】 

If you type ‘df’ it will show you a all the conflicts in the following format 

選擇選項df,則會按如下格式顯示所有沖突 

Select: (p) postpone, (df) diff-full, (e) edit, 

        (mc) mine-conflict, (tc) theirs-conflict, 

        (s) show all options: df 

--- .svn/text-base/test.txt.svn-base    Tue Aug 10 10:59:38 2010 

+++ .svn/tmp/test.txt.2.tmp     Tue Aug 10 11:33:24 2010 

@@ -1 +1,3 @@ 

-test 

\ No newline at end of file 

+<<<<<<< .mine +test User2 making conflict======= +User1 is making a conflict test>>>>>>> .r3 

‘e’ option will open the conflicted file in the text editor that you configured for svn to use. In this case it will show 

<<<<<<< .mine test User2 making conflict======= User1 is making a conflict test>>>>>>> .r3 

You can resolve the conflict here by changing the text to what you desire. 

For example: 

你可以解決沖突通過改變檔案内容,例如vim test.txt 

User1 is making a conflict test User2 making conflict 

save your changes and exit your text editor and it will give you the conflict options again. Now if you use the ‘r’ it will mark the file is merged with a ‘G’.  A status of ‘G’ means there was a conflict and it has been resolved. 

儲存更改,又出現剛才的選項。此時你使用r選項,則會合并檔案。如下所示: 

Select: (p) postpone, (df) diff-full, (e) edit, (r) resolved, 

        (mc) mine-conflict, (tc) theirs-conflict, 

        (s) show all options: e 

Select: (p) postpone, (df) diff-full, (e) edit, (r) resolved, 

        (mc) mine-conflict, (tc) theirs-conflict, 

        (s) show all options: r 

G    test.txt 

Updated to revision 3. 

you can now check the status with svn status. You see that test.txt is marked as ‘M’ all thats left to do is commit. 

檢查svn狀态,你會發現檔案test.txt前面已變成M 

C:\workspace\test2>svn st 

M       test.txt 

C:\workspace\test2>svn ci -m "conflict resolved" 

Sending        test.txt 

Transmitting file data . 

Committed revision 4. 

【選擇處理方式二:p】 

Sometimes the conflicts are a bit more extensive and it requires more time or better tools to resolve the conflict in these cases you can chose ‘p’ to postpone the resolution. 

有時,沖突會複雜一些,可能需要借助其他工具才能解決,這時你可以使用選項p 

Select: (p) postpone, (df) diff-full, (e) edit, (r) resolved, 

        (mc) mine-conflict, (tc) theirs-conflict, 

        (s) show all options: p 

C    test.txt 

Updated to revision 3. 

Summary of conflicts: 

  Text conflicts: 1 

Now if you look in your directory you will see that svn has created a few extra files for you. 

此時,檢視目前檔案夾下,出現了如下幾個檔案 

08/10/2010  11:44 AM                94 test.txt 

08/10/2010  11:44 AM                26 test.txt.mine 

08/10/2010  11:44 AM                27 test.txt.r2 

08/10/2010  11:44 AM                31 test.txt.r3 

The test.txt file is now a file with both User2 and User1′s changes but marked. 

檔案test.txt包含了使用者1和使用者2的更改。 

<<<<<<< .mine test User2 making conflict======= User1 am making a conflict test>>>>>>> .r3 

test.txt.mine is User2′s copy. 

檔案.txt.mine儲存了使用者2的内容 

test User2 making conflict 

test.txt.r2 is the original base copy 

檔案.txt.r2是未沖突前的内容 

test 

test.txt.r3 is the copy User1 commited 

檔案.txt.r3儲存了使用者1的内容 

User1 is making a conflict test 

At this point you can choose your favorite merge tools to merge the differences in a file. 

這種情況下,你可以選擇自己喜歡的對比工具,檢視差别。 

I suggest merging the differences into test.txt and the do a 

我建議和并不同至檔案test.txt中,如果如下指令: 

C:\workspace\test>svn resolve --accept working test.txt 

Resolved conflicted state of 'test.txt' 

You can also use any of the other files if you wanted to and just pass resolve –accept a different argument. Here are the valid arguments 

當然,你也可以使用其他檔案,使用resolve -accept 加其他參數,共6個 

執行個體: 

svn resolve mail.sh --accept 'mine-conflict'     #解決沖突。 

svn resolved mail.sh                                          #告知svn。4個檔案中的其他3個消失 

(1)#svn resolve –accept base 

Choose the file that was the BASE revision before you updated your working copy. That is, the file that you checked out before you made your latest edits. 

使用1.txt.r2作為最後送出的版本 

(2)#svn resolve –accept working 

Assuming that you've manually handled the conflict resolution, choose the version of the file as it currently stands in your working copy. 

使用目前拷貝即test.txt作為最後送出的版本 

(3)#svn resolve –accept mine-full 

Resolve all conflicted files with copies of the files as they stood immediately before you ran svn update. 

使用test.txt.mine作為最後送出的版本 

(4)#svn resolve –accept theirs-full 

Resolve all conflicted files with copies of the files that were fetched from the server when you ran svn update. 

使用test.txt.r3作為最後送出的版本 

(5)#svn resolve –accept mine-conflict 

沖突的部分以本地修改為準 

(6)#svn resolve –accept theirs-conflict 

沖突的部分以伺服器端修改為準 

執行一下:svn resolved test.txt。 

Now you are ready to commit. 

然後送出 

C:\workspace\test>svn ci -m "conflict resolved" 

Sending        test.txt 

Transmitting file data . 

Committed revision 4.