This text is a work in progress—highly subject to change—and may not accurately describe any released version of the Apache™ Subversion® software. Bookmarking or otherwise referring others to this page is probably not such a smart idea. Please visit http://www.svnbook.com/ for stable versions of this book.

Chu Kỳ Làm Việc Cơ Bản

Subversion có nhiều tính năng, tùy chọn, chuông và còi nhưng trên cơ sở hoạt động hàng ngày, chúng ta chỉ sử dụng một vài trong số chúng. Trong phần này, chúng ta sẽ đi xuyên xuốt những vấn đề phổ biến mà bạn sẽ gặp phải trong quá trình làm việc hàng ngày với Subversion.

Chu kỳ làm việc điển hình trông như thế này:

  1. Cập nhật bản sao làm việc của bạn. Điều này liên quan đến việc sử dụng lệnh svn update.

  2. Thực hiện thay đổi của bạn. Thay đổi phổ biến nhất mà bạn sẽ thực hiện là hiệu chỉnh nội dung của những tập tin hiện có. Tuy nhiên đôi khi bạn cần thêm, xóa, sao chép hoặc di chuyển tập tin và thư mục—những lệnh svn add, svn delete, svn copy, và svn move xử lý những thao tác thay đổi cấu trúc này trên bản sao làm việc.

  3. Xem lại những thay đổi của bạn. Những lệnh svn statussvn diff là quan trọng để xem lại những thay đổi mà bạn đã thực hiện trên bản sao làm việc của bạn.

  4. Sửa những sai sót của bạn. Không có ai hoàn hảo, vì vậy khi bạn xem lại những thay đổi của bạn, bạn có thể sẽ tìm thấy một vài điểm không hoàn toàn chính xác. Đôi khi cách dễ nhất để sửa một sai sót là bắt đầu làm lại từ đầu. Lệnh svn revert phục hồi một tập tin hoặc thư mục trở về trạng thái chưa chỉnh sửa của nó.

  5. Giải quyết những xung đột (hợp nhất thay đổi của những người khác). Trong lúc bạn thực hiện việc thay đổi và xem lại những thay đổi của bạn, những người khác cũng có thể đã thực hiện và đã phát hành những thay đổi. Bạn sẽ muốn tích hợp những thay đổi của họ vào trong bản sao làm việc của bạn để tránh tình huống quá-hạn khi bạn cố thực hiện việc phát hành những thay đổi của riêng bạn. Một lần nữa, lệnh svn update được dùng cho việc này. Nếu việc này dẫn tới xung đột trên bản sao cục bộ của bạn, bạn cần phải giải quyết những xung đột này với lệnh svn resolve.

  6. Phát hành (chuyển giao) những thay đổi của bạn. Lệnh svn commit chuyển giao những thay đổi của bạn đến kho lưu trữ, nơi mà nếu những thay đổi này được chấp nhận sẽ tạo thành phiên bản mới nhất của tất cả những thay đổi bạn đã thực hiện. Lúc này, những người khác cũng có thể thấy những thay đổi của bạn!

Cập nhật bản sao làm việc của bạn

Khi làm việc trong một dự án mà những thay đổi đến từ nhiều bản sao làm việc khác nhau, bạn sẽ mong muốn cập nhật bản sao làm việc của bạn để nhận mỗi thay đổi được chuyển giao từ những bản sao làm việc khác kể từ lần cập nhật cuối cùng của bạn. Đó có thể là những thay đổi mà những thành viên khác trong dự án thực hiện, hoặc có thể là những thay đổi của chính bạn từ một máy tính khác. Để bảo vệ dữ liệu của bạn, Subversion không cho phép bạn chuyển giao những thay đổi mới vào những tập tin và thư mục quá-hạn, vì vậy tốt nhất bạn nên có những tập tin và thư mục mới nhất trong dự án của bạn trước khi thực hiện những thay đổi của riêng bạn.

Sử dụng lệnh svn update để làm cho bản sao làm việc của bạn được đồng bộ với phiên bản mới nhất trên kho lưu tr:

$ svn update
Updating '.':
U    foo.c
U    bar.c
Updated to revision 2.
$

Trong tình huống này, ai đó đã chuyển giao những chỉnh sửa vào cả hai tập tin foo.cbar.c kể từ lần cuối bạn cập nhật và Subversion vừa mới cập nhật bản sao làm việc của bạn để bao gồm những thay đổi này.

Khi máy chủ gửi những thay đổi đến bản sao làm việc của bạn thông qua lệnh svn update, một mã ký tự được hiển thị sát bên tập tin để cho bạn biết rằng thao tác nào Subversion đã thực hiện để làm cho bản sao làm việc của bạn được cập nhật thông tin mới nhất. Để tìm hiểu những ký tự này có ý nghĩa gì, thực thi lệnh svn help update hoặc tham khảo svn update (up) trong svn Reference—Subversion Command-Line Client.

Thực hiện thay đổi của bạn

Lúc này bạn có thể bắt đầu làm việc và thực hiện những thay đổi trên bản sao làm việc của bạn. Bạn có thể thực hiện hai loại thay đổi trên bản sao làm việc của bạn: thay đổi tập tinthay đổi trên cấu trúc cây. Bạn không cần thiết phải thông báo cho Subversion biết rằng bạn có ý định thay đổi một tập tin; chỉ việc thực hiện thay đổi của bạn với một trình soạn thảo văn bản, trình xử lý văn bản, chương trình đồ hoạ hoặc là bất kỳ công cụ nào mà bạn hay sử dụng. Subversion phát hiện một cách tự động những tập tin được thay đổi, ngoài ra nó xử lý những tập tin nhị phân cũng dễ dàng như khi xử lý tập tin văn bản—và cũng hiệu quả tương tự. Những thay đổi trên cấu trúc cây là khác biệt và bao gồm những thay đổi trên cấu trúc thư mục. Những thay đổi này bao gồm thêm vào và loại bỏ tập tin, thay đổi tên của tập tin hay thư mục, và sao chép tập tin và thư mục đến vị trí mới. Với những thay đổi trên cấu trúc cây, bạn sử dụng những thao tác Subversion để lên lịch việc xoá, thêm, sao chép, di chuyển những tập tin và thư mục. Những thay đổi này có hiệu lực tức thời trên bản sao làm việc của bạn, nhưng không có thay đổi thêm bớt nào xảy ra trên khô lưu trữ cho tới khi bạn thực hiện chuyển giao những thay đổi này.

Dưới đây là tổng quan về năm lệnh phụ Subversion mà bạn sẽ sử dụng thường xuyên nhất để thực hiện việc thay đổi cây:

svn add FOO

Sử dụng lệnh này để lên lịch cho việc thêm tập tin, thư mục hoặc symlink FOO vào kho lưu trữ. Trong lần chuyển giao tiếp theo, FOO sẽ trở thành một con của thư mục cha. Lưu ý rằng nếu FOO là một thư mục, tất cả mọi thứ trên trong FOO sẽ được lên lịch để thêm vào. Nếu bạn muốn chỉ thêm FOO vào, bạn cần thêm tuỳ chọn --depth=empty.

svn delete FOO

Sử dụng lệnh này để lên lịch cho việc xoá tập tin, thư mục hoặc symlink khỏi kho lưu trữ. Nếu FOO là một tập tin hoặc liên kết, nó sẽ được xoá ngay tức thì khỏi bản sao làm việc của bạn. Nếu FOO là một thư mục, nó sẽ không bị xoá ngay nhưng Subversion sẽ lên lịch để xoá nó. Khi bạn chuyển giao những thay đổi của bạn, FOO sẽ được xoá bỏ hoàn toàn khỏi bản sao làm việc của bạn và khỏi kho lưu trữ.[6]

svn copy FOO BAR

Tạo mới một mục BAR như làm một bản nhân bản của FOO và tự động lên lịch để thêm BAR. Trong lần chuyển giao tiếo theo, BAR được them vào kho lưu trữ và lịch sử nhân bản của nó được ghi lại (được nhân bản từ FOO). Lệnh svn copy không tạo tức thì thư mục trừ khi bạn thêm tuỳ chọn --parents.

svn move FOO BAR

Lệnh này chính xác giống như thực thi những lệnh svn copy FOO BAR; svn delete FOO. Tập tin BAR được lên lịch để thêm vào như là một bản sao của FOOFOO được lên lịch để xoá. Lệnh svn move không tạo tức thì những thư mục trừ khi bạn thêm tuỳ chọn --parents.

svn mkdir FOO

Lệnh này chính xác giống như thực thi những lệnh mkdir FOO; svn add FOO. Một thư mục mới có tên FOO được tạo và được lên lịch để thêm vào.

Xem lại thay đổi của bạn

Một khi bạn đã hoàn thành việc thay đổi, bạn cần phải chuyển giao chúng vào kho lưu trữ, nhưng trước khi bạn thực hiện việc này, tốt nhất bạn nên xem lại chính xác những gì bạn đã thay đổi. Thông qua việc kiểm tra những thay đổi của bạn trước khi chuyển giao, bạn có thể soạn một thông điệp nhật ký chính xác (một mô tả dạng người-đọc-cũng-hiểu-được của những thay đổi được chuyển giao mà được lưu trữ cùng với những thay đổi này trên kho lưu trữ). Bạn cũng sẽ phát hiện ra rằng bạn đã thay đổi tập tin một cách vô tình và bạn cần phải hoàn tác thay đổi đó trước khi chuyển giao. Ngoài ra, đây là một cơ hội tốt để xem xét, rà soát những thay đổi trước khi xuất bản. Bạn sẽ có một cái nhìn tổng quan về những thay đổi bạn đã thực hiện với lệnh svn status và bạn có thể thâm nhập vào chi tiết của những thay đổi đó bằng cách dùng lệnh svn diff.

Xem tổng quan về những thay đổi của bạn

Để xem tổng quan về những thay đổi của bạn, sử dụng lệnh svn status. Bạn chắc chắn sẽ sử dụng lệnh svn status nhiều hơn những lệnh Subversion khác.

[Tip] Tip

Bởi vì lệnh kết quả của lệnh cvs status rất lộn xộn và bởi vì lệnh cvs update không chỉ thực hiện việc cập nhật mà còn báo cáo trạng thái của những thay đổi cục bộ của bạn, hầu hết người dùng CVS đã trở nên quen thuộc với việc sử dụng lệnh cvs update để báo cáo về những thay đổi của họ. Trong Subversion, cập nhật và thông báo tình trạng là hoàn toàn tách biệt nhau. Xem the section called “Distinction Between Status and Update” để nắm thông tin chi tiết.

Nếu bạn thực thi lệnh svn status ngay trên bản sao làm việc của bạn mà không có thêm tham số nào, nó sẽ phát hiện và báo cáo tất cả những thay đổi trên tập tin và trên cây mà bạn đã thực hiện.

$ svn status
?       scratch.c
A       stuff/loot
A       stuff/loot/new.c
D       stuff/old.c
M       bar.c
$

Trong chế độ đầu ra mặc định, lệnh svn status xuất ra nhiều cột những ký tự, được tiếp nối bởi nhiều ký tự trống, tiếp theo đó là tên tập tin hoặc thư mục. Cột đầu tiên thông báo về trạng thái của một tập tin hoặc thư mục và/hoặc nội dung của nó. Một trong những dấu hiệu chung nhất mà svn status hiển thị đó là:

? item

Tập tin, thư mục hoặc liên kết ký hiệu item chưa được đưa vào kiểm soát phiên bản.

A item

Tập tin, thư mục hoặc liên kết ký hiệu item đã được lên lịch để thêm vào kho lưu trữ.

C item

Tập tin item đang ở trạng thái xung đột. Những thay đổi được nhận từ máy chủ trong quá trình cập nhật chồng chéo với những thay đổi cục bộ mà bạn thực hiện trong bản sao làm việc của bạn (và đã không được giải quyết khi cập nhật). Bạn cần phải giải quyết xung đột này trước khi chuyển giao những thay đổi của bạn vào kho lưu trữ.

D item

Tập tin, thư mục hoặc liên kết ký hiệu item đã được lên lịch để xoá khỏi kho lưu trữ.

M item

Nội dung của tập tin item đã được sửa đổi.

Nếu bạn truyền một đường dẫn cụ thể vào lệnh svn status, bạn sẽ lấy thông tin chỉ riêng về mục đó:

$ svn status stuff/fish.c
D       stuff/fish.c

Lệnh svn status cũng có tuỳ chọn --verbose (-v) mà sẽ hiển thị cho bạn trạng thái của mọi mục trong bản sao làm việc của bạn ngay cả khi nó không được thay đổi:

$ svn status -v
M               44        23    sally     README
                44        30    sally     INSTALL
M               44        20    harry     bar.c
                44        18    ira       stuff
                44        35    harry     stuff/trout.c
D               44        19    ira       stuff/fish.c
                44        21    sally     stuff/things
A                0         ?     ?        stuff/things/bloo.h
                44        36    harry     stuff/things/gloo.c

Đây là đầu ra dạng đầy đủ của lệnh svn status. Ký tự đầu tiên trong cột đầu tiên có cùng ý nghĩa như đã đề cập, tuy nhiên cột thứ hai lại hiển thị phiên bản đang làm việc của mục. Cột thứ ba và thứ tư hiển thị phiên bản mà mục được thay đổi lần cuối và ai là người đã thay đổi.

Không có lời gọi nào trong số các lời gọi trước tới lệnh svn status mà kết nối với kho lưu trữ—những lệnh này chỉ đơn thuần báo cáo những gì được biết về các mục bản sao làm việc dựa trên các hồ sơ lưu trữ trong khu vực hành chính của bản sao làm việc và dựa vào nhãn thời gian và nội dung của những tập tin được sửa đổi. Nhưng đôi khi nó sẽ hữu dụng khi biết mục nào trong bản sao làm việc của bạn được sửa đổi trên kho lưu trữ kể từ lần cuối bạn cập nhật kho lưu trữ của bạn. Cho yêu cầu này, lệnh svn status cung cấp tuỳ chọn --show-updates (-u) mà sẽ kết nối với kho lưu trữ và hiển thị thông tin về các mục quá hạn:

$ svn status -u -v
M      *        44        23    sally     README
M               44        20    harry     bar.c
       *        44        35    harry     stuff/trout.c
D               44        19    ira       stuff/fish.c
A                0         ?     ?        stuff/things/bloo.h
Status against revision:   46

Lưu ý về hai dấu sao trong ví dụ trên: nếu bạn thực thi lệnh svn update ở thời điểm đó, bạn sẽ nhận được những thay đổi trên READMEtrout.c. Điều này cho bạn biết một vài thông tin rất hữu ích—bởi vì một trong các mục đó cũng là mục mà bạn đã thay đổi trên bản sao cục bộ của bạn (tập tin README), bạn cần phải cập nhật và lấy những thay đổi của tập tin này trên máy chủ trước khi bạn chuyển giao để tránh tình huống kho lưu trữ từ chối chuyển giao của bạn với lý do quá hạn. Chúng ta sẽ bàn về vấn đề này chi tiết sau.

Lệnh svn status có thể hiển thị nhiều thông tin hơn nữa về những tập tin và thư mục trong bản sao làm việc của bạn so với những thông tin được trình bày ở đây—để xem thông tin mô tả đầy đủ của lệnh svn status và kết quả của nó, thực thi lệnh svn help status hoặc tham khảo svn status (stat, st) trong svn Reference—Subversion Command-Line Client.

Kiểm tra chi tiết những thay đổi trên bản sao cục bộ của bạn

Một cách khác để kiểm tra những thay đổi của bạn là dùng lệnh svn diff mà sẽ hiển thị những khác biệt trong nội dung tập tin. Khi bạn thực thi lệnh svn diff không có tham số nào trên bản sao làm việc của bạn, Subversion sẽ hiển thị những thay đổi bạn thực hiện trên những tập tin người-đọc-cũng-hiểu-được trên bản sao làm việc của bạn. Nó hiển thị những thay đổi này theo định dạng unified diff, là một định dạng mô tả những thay đổi như những hunks (hoặc snippets) của nội dung tập tin mà mỗi dòng văn bản được đánh tiếp đầu ngữ với một mã ký-tự-đơn: một khoảng trống, có nghĩa là dòng không thay đổi; dấu trừ (-), có nghĩa là dòng đã bị xoá khỏi tập tin; dấu cộng (+), có nghĩa là dòng đã được thêm vào tập tin. Trong ngữ cảnh của lệnh svn diff, những tiếp đầu ngữ dấu-cộng và dấu-trừ cho thấy những dòng như thế nào trước và sau khi bạn thực hiện thay đổi của bạn.

Đây là một ví dụ:

$ svn diff
Index: bar.c
===================================================================
--- bar.c	(revision 3)
+++ bar.c	(working copy)
@@ -1,7 +1,12 @@
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+
+#include <stdio.h>

 int main(void) {
-  printf("Sixty-four slices of American Cheese...\n");
+  printf("Sixty-five slices of American Cheese...\n");
 return 0;
 }

Index: README
===================================================================
--- README	(revision 3)
+++ README	(working copy)
@@ -193,3 +193,4 @@
+Note to self:  pick up laundry.

Index: stuff/fish.c
===================================================================
--- stuff/fish.c	(revision 1)
+++ stuff/fish.c	(working copy)
-Welcome to the file known as 'fish'.
-Information on fish will be here soon.

Index: stuff/things/bloo.h
===================================================================
--- stuff/things/bloo.h	(revision 8)
+++ stuff/things/bloo.h	(working copy)
+Here is a new file to describe
+things about bloo.

Lệnh svn diff kết xuất kết quả trên bằng cách so sánh tập tin làm việc của bạn với văn bản nguyên sơ của nó. Những tập tin được lên lịch để được thêm vào được trình bày theo kiểu tất cả các dòng được thêm vào; những tập tin được lên lịch để xoá được trình bày theo kiểu tất cả các dòng bị xoá khỏi tập tin. Kết quả của lệnh svn diff tương đối giống lệnh patch—Lệnh svn patch được giới thiệu trong Subversion 1.7 thực hiện được nhiều hơn. Lệnh thực thi bản vá như những lệnh này đọc và ghép tập tin vá (hoặc bản vá), là những tập tin mà mô tả sự khác biệt được thực hiện trên một hoặc nhiều tập tin. Vì vậy, bạn có thể chia sẽ những thay đổi mà bạn thực hiện trên bản sao làm việc của bạn với những người khác bằng cách tạo tập tin vá với kết quả của lệnh svn diff mà không cần phải chuyển giao những thay đổi này:

$ svn diff > patchfile
$

Subversion sử dụng cơ chế so sánh bên trong của nó mà mặc nhiên tạo ra định dạng unified diff. Nếu bạn muốn kết quả của diff theo một định dạng khác, hãy chỉ định một chương trình diff bên ngoài với --diff-cmd và truyền thêm những tham số phụ mà nó cần thông qua tuỳ chọn --extensions (-x). Ví dụ: bạn có thể muốn Subversion hoán lại việc tính toán và hiển thị khác biệt cho chương trình diff của GNU, yêu cầu chương trình này in các sửa đổi cục bộ được thực hiện cho tệp foo.c theo định dạng diff (một định dạng khác của định dạng khác biệt) trong khi bỏ qua các thay đổi được thực hiện trên các chữ cái được sử dụng trong tập tin:

$ svn diff --diff-cmd /usr/bin/diff -x "-i" foo.c
…
$

Sửa lỗi của bạn

Giả sử rằng khi xem kết quả của lệnh svn diff bạn nhận thấy rằng tất cả những thay đổi mà bạn thực hiện trên một tập tin cụ thể là nhầm lẫn. Có lẽ bạn hoàn toàn không nên thay đổi gì trên tập tin, hoặc có lẽ nó sẽ dễ dàng hơn nếu thực hiện những điều chỉnh khác bắt đầu lại từ đầu. Bạn có thể hiệu chỉnh lại tập tin và huỷ tất cả những thay đổi đó. Bạn có thể tìm một bản sao của tập tin trước khi bạn thực hiện thay đổi và thay thế vào nội dung bạn đã điều chỉnh. Bạn cũng có thể áp đảo ngược lại những thay đổi này vào tập tin bằng cách dùng svn patch --reverse-diff hoặc bạn có thể dùng lệnh patch -R của hệ điều hành của bạn. Và còn có nhiều cách tiếp cận khác mà bạn có thể thử.

Thật may mắn là với Subversion việc hoàn tác và bắt đầu hiệu chỉnh lại từ đầu không cần phải thực hiện những việc rối rắm như trên. Chỉ cần sử dụng lệnh svn revert:

$ svn status README
M       README
$ svn revert README
Reverted 'README'
$ svn status README
$

Trong ví dụ này, Subversion đảo ngược lại tập tin trở về trạng thái trước khi nó bị thay đổi bằng cách ghi đè bằng phiên bản nguyên sơ của tập tin. Tuy nhiên lưu ý rằng svn revert có thể hoàn tác bất kỳ những thao tác đã được lên lịch thực hiện—ví dụ, bạn có thể quyết định rằng cuối cùng thì bạn cũng không muốn thêm tập tin mới:

$ svn status new-file.txt
?       new-file.txt
$ svn add new-file.txt
A         new-file.txt
$ svn revert new-file.txt
Reverted 'new-file.txt'
$ svn status new-file.txt
?       new-file.txt
$

Hoặc có lẽ bạn xoá nhầm một tập tin:

$ svn status README
$ svn delete README
D         README
$ svn revert README
Reverted 'README'
$ svn status README
$

Lệnh svn revert là sự cứu vớt cho những người không hoàn hảo. Nó có thể tiết kiệm rất nhiều thời gian và năng lượng mà có thể được dùng để huỷ bỏ những thay đổi của bạn, hoặc là tệ hơn, huỷ hoàn toàn bản sao làm việc của bạn và kiểm xuất một bản mới hoàn toàn chưa có thay đổi nào để bắt đầu làm việc lại.

Giải quyết xung đột

Chúng ta đã biết lệnh svn status -u có thể dự đoán xung đột như thế nào, tuy nhiên đối phó với những xung đột này là một việc khác cần phải được thực hiện. Xung đột có thể xuất hiện bất kỳ khi nào bạn thực hiện việc hợp nhất hoặc tích hợp những thay đổi từ kho lưu trữ vào trong bản sao làm việc của bạn. Bạn đã biết lệnh svn update tạo ra chính xác tình huống này—mục đích chính của lệnh này là làm cho bản sao làm việc của bạn được cập nhật với kho lưu trữ bằng cách hợp nhất tất cả những thay đổi vào bản sao làm việc của bạn kể từ lần cập nhật cuối cùng. Vậy Subversion thông báo cho bạn những xung đột đó như thế nào, và bạn sẽ đối phó với nó như thế nào?

Giả sử bạn thực thi lệnh svn update và bạn có được kết quả thú vị bên dưới:

$ svn update
Updating '.':
U    INSTALL
G    README
Conflict discovered in 'bar.c'.
Select: (p) postpone, (df) show diff, (e) edit file, (m) merge,
        (mc) my side of conflict, (tc) their side of conflict,
        (s) show all options:
        

Những mã U (viết tắt của Updated) và G (viết tắt của merGed) là những mục không cần bận tâm; những tập tin này tiếp nhận những thay đổi từ kho lưu trữ. Tập tin được đánh dấu U không có thay đổi cục bộ nào được thực hiện nhưng được cập nhật với những thay đổi từ kho lưu trữ. Tập tin được đánh dấu G có chứa những thay đổi cục bộ nhưng những thay đổi từ kho lưu trữ không bị chồng lấp với những thay đổi cục bộ này.

Điều thú vị xuất hiện ở những dòng tiếp theo. Trước hết, Subversion thông báo cho bạn biết rằng trong quá trình thực hiện việc hợp nhất những thay đổi nổi bật từ máy chủ vào tập tin bar.c, nó phát hiện ra rằng một vài thay đổi xung đột với những thay đổi cục bộ chưa được chuyển giao mà bạn đã thực hiện trên bản sao làm việc của bạn . Có lẽ ai đó đã thay đổi trên cùng một dòng mà bạn cũng thay đổi. Bất kể lý do nào, Subversion ngay lập tức đánh dấu tập tin này đang ở trạng thái xung đột. Tiếp theo nó sẽ hỏi bạn muốn làm gì với vấn đề mới được phát hiện, cho phép bạn chọn hành động tiếp theo để giải quyết xung đột. Những tuỳ chọn được sử dụng nhiều nhất sẽ được hiển thị nhưng bạn có thể xem tất cả các tuỳ chọn bằng cách nhập thêm s:

…
Select: (p) postpone, (df) show diff, (e) edit file, (m) merge,
        (mc) my side of conflict, (tc) their side of conflict,
        (s) show all options: s

  (e)  - change merged file in an editor  [edit]
  (df) - show all changes made to merged file
  (r)  - accept merged version of file

  (dc) - show all conflicts (ignoring merged version)
  (mc) - accept my version for all conflicts (same)  [mine-conflict]
  (tc) - accept their version for all conflicts (same)  [theirs-conflict]

  (mf) - accept my version of entire file (even non-conflicts)  [mine-full]
  (tf) - accept their version of entire file (same)  [theirs-full]

  (m)  - use internal merge tool to resolve conflict
  (l)  - launch external tool to resolve conflict  [launch]
  (p)  - mark the conflict to be resolved later  [postpone]
  (q)  - postpone all remaining conflicts
  (s)  - show this list (also 'h', '?')
Words in square brackets are the corresponding --accept option arguments.

Select: (p) postpone, (df) show diff, (e) edit file, (m) merge,
        (mc) my side of conflict, (tc) their side of conflict,
        (s) show all options:

Hãy xem lướt qua từng tuỳ chọn này trước khi chúng ta đi vào chi tiết mỗi tuỳ chọn có ý nghĩa như thế nào.

(e) edit [edit]

Mở tập tin xung đột với trình soạn thảo yêu thích của bạn. Trình soạn thảo này được thiết lập trong biến môi trường EDITOR.

(df) diff-full

Hiển thị sự khác biệt giữa phiên bản base và tập tin xung đột theo dịnh dạng unified diff.

(r) resolved

Sau khi cập nhật một tập tin, thông báo với svn rằng bạn đã giải quyết xung đột trong tập tin và nó cần chấp nội dung hiện tại—cơ bản là bạn đã giải quyết xong xung đột.

(dc) display-conflict

Hiển thị tất cả các vùng chứa nội dung xung đột của tập tin, bỏ qua những thay đổi mà đã được hợp nhất thành công.

(mc) mine-conflict [mine-conflict]

Huỷ bất kỳ những thay đổi nào mới nhận từ máy chủ mà xung đột với những thay đổi cục bộ của bạn trên tập tin đang xem xét. Tuy nhiên, chấp nhật và hợp nhất tất cả những thay đổi không gặp xung đột từ máy chủ vào trong tập tin này.

(tc) theirs-conflict [theirs-conflict]

Huỷ bất kỳ thay đổi cục bộ nào mà xung đột với những thay đổi từ máy chủ trên tập tin đang xem xét. Tuy nhiên, giữ lại tất cả những thay đổi mà không có xung đột trên tập tin này.

(mf) mine-full [mine-full]

Huỷ tất cả những thay đổi mới nhận từ máy chủ trên tập tin đang xem xét, nhưng giữ lại tất cả những thay đổi cục bộ của bạn trên tập tin này.

(tf) theirs-full [theirs-full]

Huỷ tất cả những thay đổi cục bộ của bạn trên tập tin đang xem xét và chỉ sử dụng những thay đổi vừa nhận được từ máy chủ cho tập tin này.

(m) merge

Khởi động công cụ hợp nhất tập tin bên trong Subversion để thực hiện việc giải quyết xung đột. Tuỳ chọn này bắt đầu được cung cấp với Subversion 1.8.

(l) launch

Khởi động chương trình bên ngoài để thực hiện việc giải quyết xung đột. Điều này đòi hỏi một chút chuẩn bị trước.

(p) postpone [postpone]

Giữ nguyên tập tin trong trạng thái xung đột để bạn có thể giải quyết sau khi quá trình cập nhật hoàn tất.

(s) show all

Hiển thị danh sách tất cả các lệnh mà bạn có thể dùng để tương tác trong việc giải quyết xung đột.

Chúng ta sẽ tìm hiểu những lệnh này chi tiết ngay bây giờ, nhóm chúng lại với nhau theo chức năng.

Xem sự khác biệt trên xung đột một cách tương tác

Trước khi quyết định sẽ giải quyết xung đột như thế nào, tỷ lệ cao là bạn sẽ muốn biết chính xác điều gì khác biệt trong mỗi xung đột. Hai lệnh có sẵn ở dòng lệnh tương tác giải quyết xung đột có thể hỗ trợ bạn. Lệnh đầu tiên là diff-full (df) hiển thị tất cả những thay đổi cục bộ trên tập tin cộng với những vùng xung đột:

…
Select: (p) postpone, (df) show diff, (e) edit file, (m) merge,
        (mc) my side of conflict, (tc) their side of conflict,
        (s) show all options: df
--- .svn/text-base/sandwich.txt.svn-base      Tue Dec 11 21:33:57 2007
+++ .svn/tmp/tempfile.32.tmp     Tue Dec 11 21:34:33 2007
@@ -1 +1,5 @@
-Just buy a sandwich.
+<<<<<<< .mine
+Go pick up a cheesesteak.
+=======
+Bring me a taco!
+>>>>>>> .r32
…

Dòng đầu tiên của phần nội khác biệt hiển thị nội dung trước đó của thư mục làm việc (phiên bản BASE), dòng tiếp theo là thay đổi của bạn và dòng cuối cùng là thay đổi mới được tiếp nhận từ máy chủ (thông thường là phiên bản HEAD).

Lệnh thứ hai tương tự như lệnh đầu tiên, lệnh display-conflict (dc) này chỉ hiển thị vùng xung đột chứ không phải toàn bộ những thay đổi được thực hiện trên tập tin. Thêm vào đó, lệnh này hiển thị vùng xung đột theo một định dạng hơi khác giúp bạn dễ dàng so sánh nội dung tập tin trên những vùng này bởi vì nó sẽ được hiển thị theo một trong ba trạng thái: gốc và không có chỉnh sửa; với những thay đổi cục bộ của bạn được áp vào và những xung đột từ máy chủ được bỏ qua; chỉ với những thay đổi từ máy chủ được áp vào và những thay đổi cục bộ, những thay đổi gây xung đột được đảo ngược.

Sau khi xem lại thông tin được cung cấp bởi những lệnh này, bạn đã sẵn sàng thực hiện hành động tiếp theo.

Giải quyết xung đột một cách tương tác

Cách chính để giải quyết xung đột một cách tương tác đó là sử dụng công cụ hợp nhất tập tin có sẵn bên trong. Công cụ này sẽ hỏi bạn thực hiện hành động gì với mỗi xung đột và cho phép bạn hợp nhất và chỉnh sửa những thay đổi một cách chọn lọc. Tuy nhiên, có nhiều cách khác để giải quyết xung đột một cách tương tác—hai trong số đó cho phép bạn hợp nhất và hiệu chỉnh những thay đổi sử dụng trình soạn thảo bên ngoài, phần còn lại đơn giản cho phép bạn lấy một phiên bản của tập tin và xử lý. Công cự hợp nhất có sẵn bên trong cho kết hợp tất cả những cách có sẵn để giải quyết xung đột.

Bạn đã xem lại những thay đổi gây xung đột, giờ là thời điểm để giải quyết xung đột. Lệnh đầu tiên mà có thể hỗ trợ bạn là lệnh merge (m) mà có sẵn bắt đầu từ Subversion 1.8. Lệnh này hiển thị những vùng xung đột và cho phép bạn chọn nhiều tuỳ chọn để giải quyết xung đột từng vùng một.

Select: (p) postpone, (df) show diff, (e) edit file, (m) merge,
        (mc) my side of conflict, (tc) their side of conflict,
        (s) show all options: m
Merging 'Makefile'.
Conflicting section found during merge:
(1) their version (at line 24)                  |(2) your version (at line 24)
------------------------------------------------+------------------------------------------------
top_builddir = /bar                             |top_builddir = /foo
------------------------------------------------+------------------------------------------------
Select: (1) use their version, (2) use your version,
        (12) their version first, then yours,
        (21) your version first, then theirs,
        (e1) edit their version and use the result,
        (e2) edit your version and use the result,
        (eb) edit both versions and use the result,
        (p) postpone this conflicting section leaving conflict markers,
        (a) abort file merge and return to main menu:

Như bạn thấy, khi bạn sử dụng công cụ hợp nhất tập tin có sẵn, bạn có thể xoay vòng qua từng vùng xung đột riêng lẽ trên tập tin và chọn nhiều tuỳ chọn giải pháp hoặc là hoãn giải quyết xung đột cho một xung đột cụ thể nào đó.

Tuy nhiên, nếu bạn muốn sử dụng trình soạn thảo bên ngoài để chọn vài sự kết hợp của những thay đổi cục bộ, bạn có thể sử dụng lệnh edit (e) để hiệu chỉnh tập tin một cách thủ công với một trình soạn thảo văn bản (được cấu hình theo hướng dẫn trong the section called “Using External Editors”). Sau khi bạn hiệu chỉnh tập tin, nếu bạn hài lòng với những hiệu chỉnh của bạn, bạn có thể thông báo cho Subversion biết rằng tập tin được hiệu chỉnh đã không còn chứa xung đột bằng cách sử dụng lệnh resolved (r).

Bất kể những cao-bồi-thôn Unix có thể sẽ nói với bạn, hiệu chỉnh một tập tin thủ công với trình soạn thảo yêu thích của bạn là một cách hơi công-nghệ-thấp trong việc khác phục xung đột (xem hướng dẫn ở the section called “Giải quyết thủ công xung đột”). Vì lý do đó Subversion cung cấp lệnh launch (l) để kích hoạt một công cụ hợp nhất đồ hoạ thú vị (xem the section called “External merge”).

Ngoài ra còn có một vài lựa chọn có sẵn. Lệnh mine-conflict (mc) và theirs-conflict (tc) hướng dẫn Subversion chọn những thay đổi cục bộ hoặc những thay đổi từ máy chủ một cách riêng biệt như là người chiến thắng của tất cả những xung đột trên tập tin. Nhưng không giống lệnh mine-fulltheirs-full, những lệnh này giữ lại cả những thay đổi của bạn lẫn những thay đổi ở máy chủ trên những vùng không có xung đột được phát hiện trên tập tin.

Cuối cùng, nếu bạn quyết định rằng bạn không cần hợp nhất những thay đổi mà chỉ muốn chấp nhận một trong những phiên bản của tập tin, bạn có thể hoặc là chọn những thay đổi của bạn (còn được biết là mine) bằng cách dùng lệnh mine-full (mf) hoặc là chọn những thay đổi từ máy chủ bằng cách sử dụng lệnh theirs-full (tf).

Hoãn giải quyết xung đột

Dường như đây là một phần phù hợp cho việc tránh những bất đồng, nhưng thực tế thì vẫn đang là về Subversion, nên hãy tiếp tục. Nếu bạn đang thực hiện việc cập nhật và bạn gặp một xung đột mà bạn chưa chuẩn bị để xem hoặc giải quyết, bạn có thể nhập p để hoãn việc giải quyết xung đột trên từng tập tin khi bạn thực thi lệnh svn update. Nếu bạn không muốn giải quyết những xung đột một cách tương tác, bạn có thể truyền thêm tham số --non-interactive vào lệnh svn update và bất kỳ tập tin nào có chứa xung đột sẽ được đánh dấu C một cách tự động.

Bắt đầu từ Subversion 1.8, công cụ hợp nhất tập tin có sẵn bên trong cho phép bạn tạm hoãn giải quyết một xung đột cụ thể và tập trung vào giải quyết những xung đột khác. Vì vậy, bạn có thể hoãn giải quyết xung đột theo-từng-vùng chứ không phải chỉ theo-từng-tập-tin.

Mục C (đại diện cho Conflicted) có nghĩa là thay đổi từ phía máy chủ trùng lấp với thay đổi của riêng bạn và lúc này bạn cần phải lựa chọn giữa những thay đổi này một cách thủ công sau khi việc cập nhật hoàn thành. Khi bạn tạm hoãn giải quyết một xung đột, lệnh svn thông thường thực hiện ba thao tác trong việc hỗ trợ bạn lưu ý và giải quyết xung đột đó:

  • Subversion in xuất kết quả C trong quá trình cập nhật và ghi nhớ rằng tập tin đang trong tình trạng xung đột.

  • Subversion cân nhắc nếu tập tin là có thể hợp nhất được, nó sẽ đặt một dấu hiệu xung đột—một chuỗi văn bản đặc biệt đặt giới hạn cho các mặt của xung đột—vào trong tập tin để biểu diễn một cách trực quan vùng trùng lấp. (Subversion sử dụng thuộc tính svn:mime-type để quyết định liệu một tập tin có khả năng hợp nhất theo ngữ cảnh, dựa-trên-dòng).

  • Với mỗi tập tin xung đột, Subversion đặt thêm ba tập tin không đánh phiên bản vào trong bản sao làm việc của bạn:

    filename.mine

    Đây là tập tin tồn tại trong bản sao làm việc của bạn trước khi bạn bắt đầu tiến trình cập nhật. Nó bao gồm bất kỳ một thay đổi cục bộ nào mà bạn thực hiện trên tập tin cho tới thời điểm đó. (Subversion xem xét nếu tập tin này là không thể hợp nhất được, tập tin .mine sẽ không được tạo ra)

    filename.rOLDREV

    Đây là tập tin này tồn tại trong phiên bản BASE—phiên bản chưa chỉnh sửa của tập tin trong bản sao làm việc của bạn—trong đó OLDREV là số phiên bản base.

    filename.rNEWREV

    Đây là tập tin mà ứng dụng khách Subversion của bạn mới nhận được từ máy chủ thông qua quá trình cập nhật bản sao làm việc của bạn, với NEWREV tương đồng với số phiên bản mà bạn đang cập nhật (là HEAD nếu không có yêu cầu phiên bản nào khác).

Ví dụ, Sally thực hiện thay đổi tập tin sandwich.txt nhưng cô ấy chưa chuyển giao những thay đổi. Trong khi đó, Harry chuyển giao thay đổi của anh ấy trên cùng tập tin này. Sally sau đó cập nhật bản sao làm việc của cô ấy trước khi chuyển giao và cô ấy gặp tình huống xung đột, cố ấy tạm hoãn xung đột này:

$ svn update
Updating '.':
Conflict discovered in 'sandwich.txt'.
Select: (p) postpone, (df) show diff, (e) edit file, (m) merge,
        (mc) my side of conflict, (tc) their side of conflict,
        (s) show all options: p
C    sandwich.txt
Updated to revision 2.
Summary of conflicts:
  Text conflicts: 1
$ ls -1
sandwich.txt
sandwich.txt.mine
sandwich.txt.r1
sandwich.txt.r2

Tại thời điểm này, Subversion sẽ không cho phép Sally chuyển giao tập tin sandwich.txt cho đến khi ba tập tin tạm được loại bỏ:

$ svn commit -m "Add a few more things"
svn: E155015: Commit failed (details follow):
svn: E155015: Aborting commit: '/home/sally/svn-work/sandwich.txt' remains in conflict

Nếu bạn hoãn một xung đột, bạn cần phải giải quyết xung đột đó trước khi Subversion cho phép bạn chuyển giao những thay đổi. Bạn thực hiện việc này với lệnh svn resolve. Lệnh này chấp nhận tham số --accept mà cho phép bạn chỉ định hướng tiếp cận mong muốn của bạn để giải quyết xung đột. Trước phiên bản Subversion 1.8, lệnh svn resolve yêu cầu phải có tuỳ chọn này. Subversion từ phiên bản 1.8 cho phép bạn thực thi lệnh svn resolve mà không cần phải có tham số này. Khi bạn thực thi lệnh này như vậy, Subversion khuấy động cơ chế giải quyết xung đột tương tác của nó, bạn có thể đọc về cơ chế này ở trong phần kế trước, the section called “Giải quyết xung đột một cách tương tác”. Chúng tôi sẽ tận dụng cơ hội này để thảo luận về tuỳ chọn --accept trong việc giải quyết xung đột.

Tuỳ chọn --accept của lệnh svn resolve chỉ thị Subversion sử dụng một trong những cách tiếp cận đã được đóng gói sẵn. Nếu bạn muốn Subversion giải quyết xung đột bằng cách sử dụng phiên bản của tập tin mà bạn kiểm xuất lần cuối trước khi bạn hiệu chỉnh, sử dụng --accept=base. Nếu bạn thích giữ lại phiên bản mà chỉ chứa những thay đổi của bạn, sử dụng --accept=mine-full. Bạn cũng có thể chọn phiên bản mà những cập nhật mới nhất của bạn được lấy về từ máy chủ (huỷ bỏ toàn bộ những chỉnh sửa của bạn)—sử dụng --accept=theirs-full. Ngoài ra cũng còn có những loại giải pháp được đóng gói sẵn khác. Xem chi tiết tại --accept ACTION trên svn Reference—Subversion Command-Line Client.

Bạn không bị giới hạn một cách cứng nhắc vào những tuỳ chọn tất-cả-hoặc-không-có-gì. Nếu bạn muốn chọn lọc từ những thay đổi của bạn và những thay đổi mà bạn lấy về từ máy chủ, bạn có thể chỉnh sửa tập tin đang làm việc một cách thủ công, sửa chữa phần văn bản xung đột bằng tay (bằng cách xem xét và hiệu chỉnh dấu hiệu xung đột bên trong tập tin) và thông báo cho Subversion giải quyết xung đột bằng cách giữ nguyên trạng thái của tập tin đang làm việc bằng lệnh svn resolve với tuỳ chọn --accept=working.

Lệnh svn resolve loại bỏ ba tập tin tạm và chấp nhật phiên bản của tập tin mà bạn chỉ định. Sau khi lệnh được thực hiện thành công—và giả sử rằng bạn không chọn để hoãn giải quyết một cách tương tác—Subversion không còn xem tập tin trong trạng thái xung đột nữa:

$ svn resolve --accept working sandwich.txt
Resolved conflicted state of 'sandwich.txt'

Giải quyết thủ công xung đột

Giải quyết xung đột một cách thủ công có thể khá đáng sợ khi bạn thử nó lần đầu tiên, tuy nhiên chỉ cần luyện tập không nhiều, nó trở nên dễ như là rơi khỏi xe đạp.

Đây là một ví dụ. Vì lý do hiểu nhầm, bạn và Sally, cả hai cùng hiệu chỉnh tập tin sandwich.txt tại cùng một thời điểm. Sally chuyển giao những thay đổi của cô ấy và khi bạn cập nhật bản sao làm việc của bạn, bạn gặp phải xung đột và bạn cần phaỉ hiệu chỉnh tập tin sandwich.txt để giải quyết xung đột. Trước hết, hãy xem qua tập tin:

$ cat sandwich.txt
Top piece of bread
Mayonnaise
Lettuce
Tomato
Provolone
<<<<<<< .mine
Salami
Mortadella
Prosciutto
=======
Sauerkraut
Grilled Chicken
>>>>>>> .r2
Creole Mustard
Bottom piece of bread

Những chuỗi ký tự dấu nhỏ hơn, dấu bằng và dấu lớn hơn là những dấu hiệu xung đột và không phải là một phần của dữ liệu thực đang trong xung đột. Bạn thường muốn đảm bảo rằng những chuỗi này bị loại khỏi tập tin trước khi bạn chuyển giao. Phần văn bản ở giữa hai vùng đầu tiên đánh dấu hiệu xung đột bao gồm những thay đổi mà bạn thực hiện trong vùng xung đột:

<<<<<<< .mine
Salami
Mortadella
Prosciutto
=======

Phần văn bản ở giữa vùng đánh dấu xung đột thứ hai và vùng thứ ba là phần văn bản mà Sally commit:

=======
Sauerkraut
Grilled Chicken
>>>>>>> .r2

Thông thường bạn sẽ không chỉ muốn những dấu hiệu xung đột và những thay đổi của Sally—cô ấy sẽ cực kỳ ngạc nhiên khi miếng sandwich đến và nó không phải là những gì cô ấy muốn. Đây là lúc mà bạn nhấc điện thoại hoặc đi bộ qua văn phòng và giải thích với Sally rằng bạn không thể mua dưa cải bắp từ một nhà hàng Ý.[7] Khi bạn đã hài lòng với những thay đổi mà bạn sẽ chuyển giao, hiệu chỉnh tập tin của bạn và xoá bỏ những dấu hiệu xung đột:

Top piece of bread
Mayonnaise
Lettuce
Tomato
Provolone
Salami
Mortadella
Prosciutto
Creole Mustard
Bottom piece of bread

Lúc này sử dụng lệnh svn resolve, bạn đã sẵn sàng để chuyển giao những thay đổi của bạn:

$ svn resolve --accept working sandwich.txt
Resolved conflicted state of 'sandwich.txt'
$ svn commit -m "Go ahead and use my sandwich, discarding Sally's edits."

Đương nhiên, bạn cần phải cẩn thận không sử dụng lệnh svn resolve để thông báo cho Subversion biết rằng bạn đã giải quyết một xung đột trong khi bạn thật tế chưa giải quyết xung đột đó. Ngay khi những tập tin tạm được xoá bỏ, Subversion sẽ cho phép bạn chuyển giao tập tin ngay cả khi nó vẫn còn chứa những dấu hiệu xung đột.

Trong khi hiệu chỉnh tập tin xung đột, bạn có thể tham khảo ba tập tin mà Subversion tạo cho bạn trong bản sao làm việc—bao gồm cả tập tin của bạn ở trạng thái trước khi bạn cập nhật. Bạn cũng có thể sử dụng công cụ hợp nhất tương tác của bên-thứ-ba để xem xét những tập tin này.

Huỷ bỏ những thay đổi của bạn và sử dụng phiên bản mới được lấy về

Nếu bạn gặp một xung đột và bạn quyết định rằng bạn muốn vứt bỏ những thay đổi của bạn, bạn có thể thực thi lệnh svn resolve --accept theirs-full CONFLICTED-PATH và Subversion sẽ loại bỏ những thay đổi của bạn và xoá bỏ những tập tin tạm:

$ svn update
Updating '.':
Conflict discovered in 'sandwich.txt'.
Select: (p) postpone, (df) show diff, (e) edit file, (m) merge,
        (mc) my side of conflict, (tc) their side of conflict,
        (s) show all options: p
C    sandwich.txt
Updated to revision 2.
Summary of conflicts:
  Text conflicts: 1
$ ls sandwich.*
sandwich.txt  sandwich.txt.mine  sandwich.txt.r2  sandwich.txt.r1
$ svn resolve --accept theirs-full sandwich.txt
Resolved conflicted state of 'sandwich.txt'
$

Đặt cược: sử dụng svn revert

Nếu bạn quyết định rằng bạn không muốn giữ lại những thay đổi của bạn và bắt đầu lại việc chỉnh sửa (ngay sau khi một xung đột xuất hiện hoặc bất kỳ lúc nào), chỉ cần đảo ngược lại những thay đổi của bạn:

$ svn revert sandwich.txt
Reverted 'sandwich.txt'
$ ls sandwich.*
sandwich.txt
$

Lưu ý rằng khi bạn đảo ngược một tập tin xung đột, bạn không cần phải sử dụng lệnh svn resolve.

Chuyển giao những thay đổi của bạn

Cuối cùng! Việc hiệu chỉnh của bạn đã hoàn tất, bạn đã hợp nhất tất cả những thay đổi từ máy chủ và bạn đã sẵn sàng để chuyển giao những thay đổi của bạn vào kho lưu trữ.

Lệnh svn commit gửi tất cả những thay đổi của bạn vào kho lưu trữ. Khi bạn chuyển giao một thay đổi, bạn cần cung cấp một ghi chú nhật ký mô tả những thay đổi của bạn. Ghi chú nhật ký của bạn sẽ được đính kèm vào trong phiên bản mà bạn mới tạo. Nếu ghi chú của bạn ngắn gọn, bạn có thể cung cấp nó trên dòng lệnh dùng tuỳ chọn --message (-m):

$ svn commit -m "Corrected number of cheese slices."
Sending        sandwich.txt
Transmitting file data .
Committed revision 3.

Tuy nhiên, nếu bạn soạn nhật ký ghi chú trong một tập tin văn bản khác, bạn có thể thông báo cho Subversion lấy nội dung ghi chú trong tập tin đó bằng cách truyền tên tập tin vào tham số --file (-F):

$ svn commit -F logmsg
Sending        sandwich.txt
Transmitting file data .
Committed revision 4.

Nếu bạn không chỉ rõ tuỳ chọn --message (-m) hoặc --file (-F), Subversion sẽ tự động khởi động trình soạn thảo văn bản yêu thích của bạn (xem thông tin editor-cmd trong the section called “General configuration”) để soạn ghi chú nhật ký.

[Tip] Tip

Nếu bạn đang soạn thảo một ghi chú chuyển giao với trình soạn thảo của bạn và bạn quyết định huỷ việc chuyển giao, bạn chỉ việc thoát khỏi trình soạn thảo mà không lưu lại những thay đổi. Nếu bạn đã lưu ghi chú chuyển giao, chỉ việc đơn giản xoá tất cả phần văn bản, lưu lại và huỷ (với abort):

$ svn commit
Waiting for Emacs...Done

Log message unchanged or not specified
(a)bort, (c)ontinue, (e)dit
a
$

Kho lưu trữ không biết hoặc không quan tâm liệu những thay đổi của bạn có ý nghĩa như thế nào; nó chỉ kiểm tra để chắc chắn rằng không có ai khác thay đổi trên cùng một tập tin. Nếu có ai đó có thay đổi, toàn bộ việc chuyển giao sẽ thất bại với một thông báo báo cho bạn biết rằng một hoặc nhiều tập tin của bạn quá hạn:

$ svn commit -m "Add another rule"
Sending        rules.txt
Transmitting file data .
svn: E155011: Commit failed (details follow):
svn: E155011: File '/home/sally/svn-work/sandwich.txt' is out of date
…

(Câu từ chính xác của thông báo lỗi này tuỳ thuộc vào giao thức mạng và máy chủ mà bạn đang sử dụng, tuy nhiên ý tưởng chung là như nhau trong tất cả các trường hợp.)

Tại điểm này, bạn cần thực thi lệnh svn update, giải quyết bất kỳ sự hợp nhất hay xung đột nào và thực hiện lại việc chuyển giao.

Trên đây bao gồm chu trình làm việc cơ bản để sử dụng Subversion. Subversion cung cấp nhiều tính năng khác mà bạn có thể sử dụng để quản lý kho lưu trữ và bản sao làm việc của bạn, tuy nhiên đa số những ứng dụng hàng-ngày của Subversion sẽ chỉ bao gồm những lệnh mà cho đến nay chúng tôi đã thảo luận. Tuy nhiên, chúng tôi sẽ bàn thêm một số lệnh mà bạn sẽ sử dụng khá thường xuyên.



[6] Dĩ nhiên, không có gì bị xoá hoàn toàn khỏi kho lưu trữ—chỉ từ phiên bản HEAD. Bạn vẫn có thể tiếp tục truy cập vào mục đã bị xoá trong những phiên bản trước. Nếu bạn mong muốn phục hồi lại mục bị xoá để nó lại hiện diện trong HEAD, xem the section called “Resurrecting Deleted Items”.

[7] Và nếu bạn hỏi mua dưa cải, họ có thể đẩy bạn ra khỏi thành phố bằng xe lửa.