Sửa lỗi trong SVN



Giả sử Jerry tình cờ sửa tệp array.c và anh ta biên dịch lỗi. Bây giờ anh ta muốn dỡ bỏ các thay đổi. Trong tình huống này, hoạt động revert sẽ giúp làm điều này. Hoạt động revert sẽ undo bất cứ thay đổi nội bộ nào tới một file hoặc thư mục và giải quyết bất cứ trạng thái tranh chấp.

[jerry@CentOS trunk]$ svn status

Lệnh trên sẽ tạo ra kết quả sau:

M       array.c

Bây giờ cố gắng để tạo mảng này như sau:

[jerry@CentOS trunk]$ make array

Lệnh trên sẽ tạo ra kết quả sau:

cc     array.c   -o array
array.c: In function 'main':
array.c:26: error: 'n' undeclared (first use in this function)
array.c:26: error: (Each undeclared identifier is reported only once
array.c:26: error: for each function it appears in.)
array.c:34: error: 'arr' undeclared (first use in this function)
make: *** [array] Error 1

Jerry thực hiện hoạt động revert trên tệp array.c.

[jerry@CentOS trunk]$ svn revert array.c 
Reverted 'array.c'[jerry@CentOS trunk]$ svn status
[jerry@CentOS trunk]$

Bây giờ biên dịch code trên.

[jerry@CentOS trunk]$ make array
cc     array.c   -o array

Sau khi thực hiện hoạt động trả lại (revert), khu vực làm việc của anh ta được trả lại trạng thái ban đầu. Hoạt động này có thể trả lại một file đơn cũng như một thư mục đầy đủ. Để trả lại một thư mục, sử dụng tùy chọn -R như dưới đây.

[jerry@CentOS project_repo]$ pwd
/home/jerry/project_repo[jerry@CentOS project_repo]$ svn revert -R trunk

Tới bây giờ, chúng ta đã thấy cách để trả lại các thay đổi, mà đã được thực hiện với khu vực làm việc. Nhưng điều gì xảy ra nếu bạn trả lại một phiên bản đã commit. Công cụ VCS không cho phép xóa lịch sử từ repository. Chúng ta chỉ có thể gán lịch sử. Nó sẽ xảy ra ngay cả khi bạn xóa các file từ trong kho chứa. Để undo một phiên bản cũ, chúng ta phải trả lại những gì đã thay đổi trong phiên bản cũ và sau đó commit một phiên bản mới. Điều này được gọi là sáp nhập trả lại (revert merge).

Bây giờ chúng ta giả sử rằng Jerry thêm một code cho hoạt động linear search. Sau khi thẩm tra anh ta commit những thay đổi của mình.

[jerry@CentOS trunk]$ svn diff
Index: array.c
===================================================================
--- array.c   (revision 21)
+++ array.c   (working copy)
@@ -2,6 +2,16 @@
 
 #define MAX 16
 
+int linear_search(int *arr, int n, int key)
+{
+   int i;
+
+   for (i = 0; i < n; ++i)
+      if (arr[i] == key)
+         return i;
+   return -1;
+}
+
 void bubble_sort(int *arr, int n)
 {
    int i, j, temp, flag = 1;[jerry@CentOS trunk]$ svn status
?       array
M       array.c[jerry@CentOS trunk]$ svn commit -m "Added code for linear search"
Sending        trunk/array.c
Transmitting file data .
Committed revision 22.

Jerry tò mò về những gì Tom đang làm. Vì thế anh ta kiểm tra các thông báo log.

[jerry@CentOS trunk]$ svn log

Lệnh trên sẽ tạo ra kết quả sau:

------------------------------------------------------------------------
r5 | tom   | 2013-08-24 17:15:28 +0530 (Sat, 24 Aug 2013) | 1 lineAdd binary search operation
------------------------------------------------------------------------
r4 | jerry | 2013-08-18 20:43:25 +0530 (Sun, 18 Aug 2013) | 1 lineAdd function to accept input and to display array contents

Sau khi quan sát các thông báo log, Jerry nhận ra rằng anh ta đã thực hiện một lỗi nghiêm trọng. Bởi vì Tom đã chạy hoạt động binary search, mà là tốt hơn lệnh linear search; code của anh ta là thừa, và bây giờ Jerry phải trả lại (revert) những thay đổi tới phiên bản trước. Vì thế, điều đầu tiên tìm kiếm phiên bản hiện tại của repository. Hiện tại, phiên bản của repository là 22 và chúng ta phải revert nó về phiên bản trước, là phiên bản 21.

[jerry@CentOS trunk]$ svn up 
At revision 22.[jerry@CentOS trunk]$ svn merge -r 22:21 array.c 
--- Reverse-merging r22 into 'array.c':
U    array.c[jerry@CentOS trunk]$ svn commit -m "Reverted to revision 21"
Sending        trunk/array.c
Transmitting file data .
Committed revision 23.

Các bài học SVN phổ biến khác tại VietJack: