SVN解決衝突


Tom 決定為他們的專案新增README檔案。因此,他創造了README檔案,並新增到該TODO列表。在加入這個檔案庫在修訂版本6。

[[email protected] trunk]$ cat README 
/* TODO: Add contents in README file */

[[email protected] trunk]$ svn status
?       README

[[email protected] trunk]$ svn add README 
A         README

[[email protected] trunk]$ svn commit -m "Added README file. Will update it's content in future."
Adding         trunk/README
Transmitting file data .
Committed revision 6. 

Jerry 檢出最新的程式碼,這是修訂版本6。他就立刻開始工作。經過幾個小時的Tom更新README檔案並提交了他的變化。修改README這個樣子。

[[email protected] trunk]$ cat README 
* Supported operations:

1) Accept input
2) Display array elements

[[email protected] trunk]$ svn status
M       README

[[email protected] trunk]$ svn commit -m "Added supported operation in README"
Sending        trunk/README
Transmitting file data .
Committed revision 7.

現在,庫是修訂版本7 Jerry的工作拷貝是過時了。Jerry 還更新README檔案,並嘗試提交他的變化。

Jerry' 的README檔案看起來像這樣。

[[email protected] trunk]$ cat README 
* File list

1) array.c	Implementation of array operation.
2) README	Instructions for user.

[[email protected] trunk]$ svn status
M       README

[[email protected] trunk]$ svn commit -m "Updated README"
Sending        trunk/README
svn: Commit failed (details follow):
svn: File or directory 'README' is out of date; try updating
svn: resource out of date; try updating

Step 1: 檢視衝突

這是好事。Subversion的檢測README檔案已經改變,因為最後一次更新。因此,Jerry 更新自己的工作副本。

[[email protected] trunk]$ svn up
Conflict discovered in 'README'.
Select: (p) postpone, (df) diff-full, (e) edit,
        (mc) mine-conflict, (tc) theirs-conflict,
        (s) show all options:

Subversion抱怨README檔案有衝突,Subversion不知道如何解決這個問題。所以Jerry 選擇 df 檢視衝突。

[[email protected] trunk]$ svn up
Conflict discovered in 'README'.
Select: (p) postpone, (df) diff-full, (e) edit,
        (mc) mine-conflict, (tc) theirs-conflict,
        (s) show all options: df
--- .svn/text-base/README.svn-base	Sat Aug 24 18:07:13 2013
+++ .svn/tmp/README.tmp	Sat Aug 24 18:13:03 2013
@@ -1 +1,11 @@
-/* TODO: Add contents in README file */
+<<<<<<< .mine
+* File list
+
+1) array.c	Implementation of array operation.
+2) README	Instructions for user.
+=======
+* Supported operations:
+
+1) Accept input
+2) Display array elements
+>>>>>>> .r7
Select: (p) postpone, (df) diff-full, (e) edit, (r) resolved,
        (mc) mine-conflict, (tc) theirs-conflict,
        (s) show all options:

Step 2: 延緩衝突

Jerry 選擇推遲(p)選項,這樣他就可以解決衝突。

Select: (p) postpone, (df) diff-full, (e) edit, (r) resolved,
        (mc) mine-conflict, (tc) theirs-conflict,
        (s) show all options: p
C    README
Updated to revision 7.
Summary of conflicts:
  Text conflicts: 1

在文字編輯器中開啟README檔案後,他意識到,Subversion會包含Tom 的程式碼和他衝突標記程式碼。

[[email protected] trunk]$ cat README
<<<<<<< .min
* File list

1) array.c	Implementation of array operation.
2) README	Instructions for user.
=======
* Supported operations:

1) Accept input
2) Display array elements
>>>>>>> .r7

Jerry 希望 Tom 同他的變化一起修改,所以他只是刪除了行包含衝突標記。

所以修改後的README檔案會如下這個樣子。

[[email protected] trunk]$ cat README
* File list

1) array.c	Implementation of array operation.
2) README	Instructions for user.

* Supported operations:

1) Accept input
2) Display array elements

Jerry 解決衝突並提交,並讓他重試。

[[email protected] trunk]$ svn commit -m "Updated README"
svn: Commit failed (details follow):
svn: Aborting commit: '/home/jerry/project_repo/trunk/README' remains in conflict
 
[[email protected] trunk]$ svn status
?       README.r6
?       README.r7
?       README.mine
C       README

Step 3: 解決衝突

這裡是C字母表示有README檔案衝突。Jerry 解決衝突,但沒有告訴Subversion他解決衝突。他使用解決命令通知Subversion有關解決衝突

[[email protected] trunk]$ svn resolve --accept=working README
Resolved conflicted state of 'README'

[[email protected] trunk]$ svn status
M       README

[[email protected] trunk]$ svn commit -m "Updated README"
Sending        trunk/README
Transmitting file data .
Committed revision 8.