Xử lý các xung đột (Conflict) trong SVN

Tom quyết định thêm một tệp README vào dự án của họ. Vì thế anh ta tạo ra tệp REAME và thêm danh sách TODO vào trong đó. Sau khi thêm, repository là phiên bản thứ 6.

[tom@CentOS trunk]$ cat README 
/* TODO: Add contents in README file */

[tom@CentOS trunk]$ svn status
?       README

[tom@CentOS trunk]$ svn add README 
A         README

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

Jerry kiểm tra code mới nhất mà ở phiên bản 6. Và ngay lập tức anh ta bắt đầu làm việc. Sau một vài giờ, Tom cập nhật tệp README và commit những thay đổi của anh ta. Tệp README sẽ trông như sau:

[tom@CentOS trunk]$ cat README 
* Supported operations:

1) Accept input
2) Display array elements

[tom@CentOS trunk]$ svn status
M       README

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

Bây giờ, repository tại phiên bản 7 và khu vực làm việc của Jerry đang bị lỗi thời. Jerry cũng cập nhật tệp README và cố gắng để commit những thay đổi của anh ta.

Tệp README của Jerry trông như sau:

[jerry@CentOS trunk]$ cat README 
* File list

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

[jerry@CentOS trunk]$ svn status
M       README

[jerry@CentOS 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

Bước 1: Kiểm tra xung đột

Subversion đã tìm ra rằng tệp README đã thay đổi từ khi lần cuối được cập nhật. Vì thế, Jerry phải cập nhật khu vực làm việc của anh ta.

[jerry@CentOS 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 đang phàn nàn rằng có một xung đột xảy ra với tệp README, và Subversion không biết cách để giải quyết điều này. Vì thế Jerry chọn chức năng df để duyệt sự xung đột này.

[jerry@CentOS 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:

Bước 2: Trì hoãn các xung đột

Tiếp đó, Jerry chọn chức năng postpone(p) để mà anh ta có thể giải quyết sự xung đột đó.

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

Sau khi mở tệp README trong bộ biên soạn văn bản (text editor), anh ta nhận ra rằng subversion đã bao cả code của Tom và của anh ta với vật ghi xung đột (conflict maker).

[jerry@CentOS 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 muốn những thay đổi của Tom cũng như của anh ta, vì thế anh ta dỡ bỏ các dòng trong vật ghi xung đột.

Vì thế, tệp README trông như sau:


[jerry@CentOS 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 giải quyết xung đột và anh ta cố gắng commit lại.


[jerry@CentOS trunk]$ svn commit -m "Updated README"
svn: Commit failed (details follow):
svn: Aborting commit: '/home/jerry/project_repo/trunk/README' remains in conflict

[jerry@CentOS trunk]$ svn status
?       README.r6
?       README.r7
?       README.mine
C       README

Bước 3: Giải quyết xung đột

Trong phần commit trên, ký tự C chỉ rằng có một xung đột trong tệp README. Jerry đã giải quyết xung đột nhưng không báo với subversion rằng anh ta đã giải quyết xung đột đó. Anh ta sử dụng lệnh resolve để thông báo cho subversion về việc giải quyết xung đột.

[jerry@CentOS trunk]$ svn resolve --accept=working README
Resolved conflicted state of 'README'

[jerry@CentOS trunk]$ svn status
M       README

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

Bình luận