Bỏ qua đến nội dung
LeedyBox
Ủng hộ

So sánh văn bản hoạt động thế nào

Diff trả lời một câu hỏi duy nhất: cần thay đổi gì để biến văn bản thứ nhất thành văn bản thứ hai? Hướng dẫn này giải thích cách công cụ diff tìm ra câu trả lời, cách đọc kết quả, và cách chuẩn bị hai phiên bản để kết quả cho thấy những thay đổi bạn quan tâm thay vì nhiễu.

Diff cho thấy gì

Phần lớn công cụ diff, kể cả So sánh văn bản của LeedyBox, so sánh văn bản theo từng dòng. Mỗi dòng trong kết quả thuộc một trong ba loại: không đổi (có trong cả hai bản), bị xóa (chỉ có trong bản gốc) hoặc được thêm (chỉ có trong bản mới). Không có loại “đã sửa” riêng, nên một dòng sửa một từ sẽ xuất hiện hai lần, một lần là dòng bị xóa và một lần là dòng được thêm:

  Dear customer,
- Your order ships on Monday.
+ Your order ships on Tuesday.
  Kind regards

Các ký hiệu theo một quy ước lâu đời: - cho dòng bị xóa, + cho dòng được thêm và một dấu cách cho dòng không đổi. Màu sắc, thường là đỏ và xanh lá, lặp lại cùng thông tin đó.

Các dòng được ghép với nhau thế nào

Công cụ diff tìm chuỗi dòng dài nhất xuất hiện trong cả hai văn bản theo cùng thứ tự, tức dãy con chung dài nhất. Những dòng đó được giữ là không đổi; mọi dòng khác được đánh dấu là bị xóa hoặc được thêm. Nếu bản gốc là A, B, C, D và văn bản mới là A, C, B, D, dãy chung dài nhất có ba dòng, ví dụ A, B, D, nên C được thể hiện là đã di chuyển: bị xóa ở một chỗ và được thêm ở chỗ khác.

Thường có nhiều đáp án dài bằng nhau, và mỗi công cụ chọn theo cách riêng. Vì thế cùng một cặp tệp có thể cho diff hơi khác nhau ở hai chương trình. Git mặc định dùng thuật toán Myers và cho chọn patience hoặc histogram, hai thuật toán thường cho kết quả dễ đọc hơn với mã có nhiều dòng chỉ chứa dấu ngoặc đóng.

Việc tìm dãy chung dài nhất tốn công sức tăng theo tích số dòng của văn bản này với số dòng của văn bản kia. Công cụ LeedyBox trước hết gác lại các dòng giống nhau ở đầu và cuối, so sánh phần còn lại và dừng kèm thông báo khi tích này vượt 4.000.000, chẳng hạn khoảng 2.000 dòng khác nhau đối với 2.000 dòng.

Đọc diff hợp nhất từ Git và đánh giá mã

Hệ thống quản lý phiên bản chỉ hiển thị phần thay đổi của tệp, theo định dạng diff hợp nhất (unified diff):

--- a/config.yml
+++ b/config.yml
@@ -12,4 +12,5 @@
 server:
-  port: 8080
+  port: 8081
+  timeout: 30
 database:

Các dòng --- và +++ ghi tên tệp cũ và tệp mới. Header của khối @@ -12,4 +12,5 @@ có nghĩa: khối này bắt đầu ở dòng 12 và gồm 4 dòng trong tệp cũ, bắt đầu ở dòng 12 và gồm 5 dòng trong tệp mới. Vài dòng không đổi quanh mỗi thay đổi, mặc định là ba, cung cấp ngữ cảnh. Công cụ hiển thị toàn bộ văn bản như của LeedyBox không có header khối vì mọi dòng đều hiện ra; cũng vì thế mà kết quả của nó không thể áp dụng như một bản vá.

Chuẩn bị văn bản để so sánh hữu ích

Diff so sánh ký tự chứ không so sánh ý nghĩa. Những khác biệt nhỏ vô hình làm các dòng khác nhau và có thể che lấp thay đổi thật:

  • Dấu cách và tab ở cuối dòng, hoặc một bản dùng tab còn bản kia dùng dấu cách. Hãy xóa dấu cách cuối dòng và dùng cùng kiểu thụt lề cho cả hai.
  • Ký tự vô hình như dấu cách không ngắt hay dấu cách độ rộng bằng không, hay gặp trong văn bản chép từ trang web và trình soạn thảo.
  • Dạng Unicode. Chữ có dấu như é có thể được lưu thành một ký tự hoặc thành e cộng dấu kết hợp. Văn bản từ tên tệp trên macOS hoặc một số PDF thường dùng dạng thứ hai.
  • Ngoặc kép cong và gạch dài. Trình soạn thảo thay " bằng “ ” và - bằng –, nên bản chép dán không còn khớp với bản gốc dạng văn bản thuần.
  • Ký tự xuống dòng. Windows kết thúc dòng bằng CR LF, còn macOS và Linux bằng LF. Trình duyệt đổi mọi dấu xuống dòng trong ô văn bản thành LF, nên khác biệt này không hiện trong công cụ LeedyBox, nhưng có hiện trong các công cụ so sánh tệp trực tiếp.
  • Định dạng dữ liệu và mã. JSON được thụt lề lại hoặc khóa đổi thứ tự khiến hầu như mọi dòng đều khác. Hãy định dạng hai bản giống nhau trước, ví dụ sắp xếp khóa và dùng cùng kiểu thụt lề.

So sánh văn xuôi

Trong tài liệu thông thường, cả một đoạn văn thường là một dòng dài, nên chỉ sửa một từ cũng khiến cả đoạn bị đánh dấu là xóa và thêm. Có hai thói quen giúp ích. Trước khi so sánh, đặt mỗi câu trên một dòng riêng để chỉ câu bị sửa nổi bật. Hoặc dùng công cụ so sánh từ bên trong dòng, như git diff --word-diff hay tính năng so sánh theo dõi thay đổi trong trình soạn thảo.

Văn bản chép từ PDF có bẫy riêng: dòng bị ngắt ở nơi bố cục trang ngắt, và từ có thể bị tách bằng gạch nối ở cuối dòng. Hãy nối lại các dòng của mỗi đoạn trước khi so sánh với tài liệu gốc.

Những điều diff theo dòng không cho biết

  • Di chuyển. Một đoạn được chuyển sang chỗ khác sẽ hiện là bị xóa ở một chỗ và được thêm ở chỗ khác. Một số công cụ, như git với --color-moved, đánh dấu riêng các khối bị di chuyển.
  • Ý nghĩa. Hai văn bản nói cùng một điều bằng những từ khác nhau sẽ khác hoàn toàn, còn một thay đổi chỉ một ký tự, như thiếu một chữ “not”, trông nhỏ nhưng có thể đảo ngược nghĩa của câu.
  • Nội dung nhị phân. Tài liệu Word, PDF và hình ảnh không phải văn bản thuần. Hãy trích văn bản ra trước, hoặc dùng tính năng so sánh của chương trình đã tạo ra chúng.

Quyền riêng tư khi so sánh tài liệu

Hợp đồng, tệp cấu hình và nhật ký thường chứa tên, khóa hoặc mật khẩu. Một số dịch vụ so sánh trực tuyến lưu văn bản được dán lên máy chủ của họ, đôi khi kèm một liên kết chia sẻ được. So sánh văn bản của LeedyBox chạy trong trình duyệt của bạn và không gửi hay lưu văn bản, nhưng vẫn nên xóa thông tin bí mật trước khi dán tệp cấu hình vào bất cứ đâu.

Câu hỏi thường gặp

Vì sao cả đoạn bị đánh dấu là đã đổi khi tôi chỉ sửa một từ?

Đoạn văn là một dòng, và diff theo dòng so sánh cả dòng. Hãy chia văn bản thành câu hoặc dòng ngắn hơn trước khi so sánh, hoặc dùng cách so sánh theo từ.

Tôi có thể bỏ qua khác biệt về dấu cách không?

Công cụ LeedyBox so sánh các dòng chính xác từng ký tự. Hãy làm sạch hai văn bản trước, chẳng hạn xóa dấu cách cuối dòng và đổi tab thành dấu cách; với tệp, git có các tùy chọn như --ignore-space-change.

So sánh hai tài liệu Word thế nào?

Word có sẵn tính năng So sánh, hiển thị cả thay đổi định dạng. Nếu chỉ muốn so sánh câu chữ, hãy chép văn bản của hai tài liệu vào một công cụ so sánh văn bản.

Hợp nhất ba chiều (three-way merge) là gì?

Khi hai người cùng sửa một bản gốc, công cụ hợp nhất so sánh từng phiên bản với bản gốc chung. Thay đổi ở những chỗ khác nhau được gộp tự động; thay đổi trên cùng các dòng được báo là xung đột để người dùng tự giải quyết.