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 list1) 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 list1) 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 list1) 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.
Các bài học SVN phổ biến khác tại VietJack:
- SVN - Tiến trình Checkout
- SVN - Thực hiện các thay đổi
- SVN - Review các thay đổi
- SVN - Tiến trình Update
- SVN - Sửa lỗi