SVN:衝突解決 Conflict discovered in

原文地址:http://www.letuknowit.com/archives/svn-conflict-resolution

在項目中,基本不可避免多個人同時參與一個項目,因此就可能會出現多個人同時修改一個文件的情況,就不可避免的會出現衝突。svn已經很聰明瞭,如果你和別人對於同一個文件的修改之間不存在重疊(比如你在文件最開始增加了一行,而你同事在文件的結尾出增加了一行),svn會自動將你們的修改進行合併,然而意外總是會發生,而且超出了svn的處理範圍,只好採用人工智能(手工)來進行合併了。

要解決衝突,我們首先得製造個衝突,保證你現在已經有兩個工作拷貝了,我們現在修改其中的一個,例如這裏我們修改sally_calc中的main.c文件。

root@letuknowit:/home/kris/sally_calc/trunk# cat main.c
#include <stdio.h>
#include "add.h"
#include "sub.h"

int main()
{
        printf("5 + 10 = %d.\n",add(5,10));
        printf("15 - 10 = %d.\n",sub(15,10));
        //sally's test
        printf("sally: 60 - 33 = %d.\n",sub(60,33));
        return 0;
}

在這裏sally增加了一個屬於她自己的測試語句,改好後,提交到

root@letuknowit:/home/kris/sally_calc/trunk# svn ci -m "sally add some test code"
Sending        trunk/main.c
Transmitting file data .
Committed revision 7.

到kris的工作副本,做類似的修改,具體如下

root@letuknowit:/home/kris/calc/trunk# cat main.c
#include <stdio.h>
#include "add.h"
#include "sub.h"

int main()
{
        printf("5 + 10 = %d.\n",add(5,10));
        printf("15 - 10 = %d.\n",sub(15,10));
        //kris's test
        printf("kris: 12 + 28 = %d.\n",add(12,28));
        return 0;
}

下面的工作自然是提交了。

root@letuknowit:/home/kris/calc/trunk# svn ci -m "kris add some test code"
Sending        trunk/main.c
svn: Commit failed (details follow):
svn: File '/trunk/main.c' is out of date

很抱歉,提交失敗了,原因是本地文件過期了(因爲之前sally提交了對於main.c的修改)。原來如此,趕緊把sally的修改update過來。不過在這之前提供一個檢測本地文件是否已經過期的辦法,還記得經常用到的svn st命令吧

root@letuknowit:/home/kris/calc/trunk# svn st
M       main.c
root@letuknowit:/home/kris/calc/trunk# svn st -u
M       *        6   main.c
Status against revision:      7

看到那個*了吧,出現這個標記就說明本地副本的文件已經過期了,需要執行svn update了。

root@letuknowit:/home/kris/calc/trunk# svn up
Conflict discovered in 'main.c'.
Select: (p) postpone, (df) diff-full, (e) edit,
        (mc) mine-conflict, (tc) theirs-conflict,
        (s) show all options:

額滴個小心臟啊,又出錯了,還要做選擇題,糾結啊,糾結前還是看看各個選項都是做啥的吧

(p) postpone          暫時推後處理,我可能要和那個和我衝突的傢伙商量一番
(df) diff-full        把所有的修改列出來,比比看
(e) edit              直接編輯衝突的文件
(mc) mine-conflict    如果你很有自信可以只用你的修改,把別人的修改幹掉
(tc) theirs-conflict  底氣不足,還是用別人修改的吧
(s) show all options  顯示其他可用的命令

這裏我們先選擇p稍候處理,系統會給出如下輸出,main.c前面的C標識說明這是一個衝突中的文件,需要手工處理以解決衝突。

        (s) show all options:p
C    main.c
Updated to revision 7.
Summary of conflicts:
  Text conflicts: 1

如果這個時候你查看一下工作拷貝,你會發現多了幾個文件,對於每一個衝突的文件,svn會放置三個額外的未版本化文件到你的工作拷貝。

root@letuknowit:/home/kris/calc/trunk# ls -al m*
-rw-r--r-- 1 root root 312 2012-09-20 16:35 main.c
-rw-r--r-- 1 root root 216 2012-09-20 16:35 main.c.mine
-rw-r--r-- 1 root root 156 2012-09-20 16:35 main.c.r6
-rw-r--r-- 1 root root 218 2012-09-20 16:35 main.c.r7

其中main.c.mine是融合了你的修改的版本,裏面是你更新的內容,main.c.r6是你做更新操作以前的版本,你是在這個版本的基礎上做的修改,main.c.r7是版本庫中的最新版本,這裏有別人的修改,而就是這個修改和你的修改衝突了。這幾個文件可以自己去查看下,應該很好理解。
對了,還有主角沒有登場,這個時候如果你看下mian.c的內容,估計你又要鬱悶了,和你原先的修改完全不一樣了。

root@letuknowit:/home/kris/calc/trunk# cat main.c
#include <stdio.h>
#include "add.h"
#include "sub.h"

int main()
{
        printf("5 + 10 = %d.\n",add(5,10));
        printf("15 - 10 = %d.\n",sub(15,10));
<<<<<<< .mine
        //kris's test
        printf("kris: 12 + 28 = %d.\n",add(12,28));
=======
        //sally's test
        printf("sally: 60 - 33 = %d.\n",sub(60,33));
>>>>>>> .r7
        return 0;
}

你會看到由小於號、等於號和大於號串組成的三個部分,其中小於號和等號之間的內容是你的修改,而等號和大於號之間的修改是其他人的修改,在明確了衝突的原因之後,我們已經知道怎麼修改了,兩個人的修改都是需要保留的。
OK,那就保留所有的修改,刪除掉<、=和>,最後的結果如下。
小於號、等於號和大於號串是衝突標記,並不是衝突的數據,你一定要確定這些內容在下次提交之前得到刪除。

root@letuknowit:/home/kris/calc/trunk# cat main.c
#include <stdio.h>
#include "add.h"
#include "sub.h"

int main()
{
        printf("5 + 10 = %d.\n",add(5,10));
        printf("15 - 10 = %d.\n",sub(15,10));
        //kris's test
        printf("kris: 12 + 28 = %d.\n",add(12,28));
        //sally's test
        printf("sally: 60 - 33 = %d.\n",sub(60,33));
        return 0;
}

衝突解決了,下面的工作就是通知svn,我們已經把衝突搞定了(使用svn resolved命令),下面該你了,可以看到svn將生成的幾個臨時文件刪除了。

root@letuknowit:/home/kris/calc/trunk# svn resolved main.c
Resolved conflicted state of 'main.c'
root@letuknowit:/home/kris/calc/trunk# ls -al m*
-rw-r--r-- 1 root root 278 2012-09-20 17:07 main.c

接下來提交代碼,搞定收工。

root@letuknowit:/home/kris/calc/trunk# svn ci -m "kris add some test code"
Sending        trunk/main.c
Transmitting file data .
Committed revision 8.

svn中的衝突解決看起來非常的複雜,實則很簡單,只要掌握了原理,舉一反三,就可以得心應手了!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章