Thuật toán diff hoạt động như thế nào
Mọi chế độ xem diff trên trang này đều được tạo bởi thuật toán Myers — kỹ thuật năm 1986 của Eugene W. Myers tìm script chỉnh sửa ngắn nhất giữa hai chuỗi token trong thời gian O((N+M)D), trong đó D là khoảng cách chỉnh sửa. Thuật toán được xây dựng xung quanh bài toán Longest Common Subsequence, và engine chạy hoàn toàn trong trình duyệt bằng thư viện jsdiff mã nguồn mở.
- Tách token đầu vào — Trước khi so sánh, thuật toán chia mỗi đầu vào thành một chuỗi token. Độ chi tiết dòng chia theo dòng mới; độ chi tiết từ chia theo khoảng trắng và ranh giới dấu câu; độ chi tiết ký tự coi mỗi điểm code Unicode là token riêng.
- Xây dựng đồ thị chỉnh sửa — Thuật toán Myers mô hình hóa phép so sánh như một đường đi qua lưới 2D trong đó di chuyển sang phải nghĩa là "xóa khỏi bản gốc", di chuyển xuống nghĩa là "chèn từ bản đã thay đổi" và di chuyển chéo nghĩa là "token khớp trong cả hai". Thuật toán tìm đường đi ngắn nhất thiên về chéo.
- Trích xuất LCS — Các di chuyển chéo trong đường đi ngắn nhất vạch ra Longest Common Subsequence — các token xuất hiện trong cả hai đầu vào theo cùng thứ tự tương đối. Mọi token trong LCS đều là "không thay đổi"; mọi thứ khác đều là thêm mới hoặc xóa.
- Áp dụng tùy chọn tiền xử lý — Nếu bật "Bỏ qua phân biệt hoa thường", cả hai đầu vào đều được chuyển thành chữ thường trước lần LCS để "HELLO" và "hello" được tính là giống nhau. "Bỏ qua khoảng trắng" thu gọn nhiều khoảng trắng thành một. "Cắt bỏ khoảng trắng đầu/cuối dòng" loại bỏ khoảng trắng đầu và cuối mỗi dòng trước khi so sánh.
- Hiển thị chế độ xem đã chọn — Đầu ra là cùng kết quả LCS được hiển thị theo ba cách: Song song hiển thị bản gốc ở bên trái và bản đã thay đổi ở bên phải trong lưới hai cột với hàng được tô màu đỏ và xanh lá. Hợp nhất hiển thị một cột duy nhất với dòng có tiền tố − và +, như đầu ra của
git diff. Nội tuyến hiển thị các phần đã xóa dưới dạng gạch ngang đỏ và phần thêm mới dưới dạng gạch chân xanh trong cùng luồng văn bản. - Tính thanh tóm tắt — Sau khi hiển thị, công cụ đếm bao nhiêu token được thêm, xóa và không thay đổi, rồi tính độ tương đồng theo tỷ lệ token không thay đổi trên số lớn hơn giữa tổng token trong bản gốc và bản đã thay đổi. Độ tương đồng 100% có nghĩa là các đầu vào giống nhau sau khi tiền xử lý.
Tại sao dùng công cụ so sánh văn bản
- Review code không cần Git client — Dán hai phiên bản của tệp cấu hình, migration SQL hay shell script và xem những gì đã thay đổi mà không cần clone repo, chuyển branch hay chờ pipeline CI. Công cụ này tiện lợi cho review nhanh trong pair programming, cho bàn giao từ nhà thầu không chia sẻ lịch sử Git và cho các codebase cũ ra đời trước khi có version control. Chế độ xem hợp nhất cho ra đầu ra bạn có thể sao chép thẳng vào thread chat hay phiếu.
- Sửa đổi hợp đồng và tài liệu — Diff cấp độ từ hiển thị các điều khoản đã thay đổi giữa các bản thảo hợp đồng nhanh hơn bảng Track Changes của Word. Dán điều khoản A từ bản thảo đầu tiên và điều khoản B từ bản thực thi và phần thay thế sáng lên đỏ-xanh chính xác tại cụm từ đã thay đổi. Chuyên viên pháp lý và nhóm mua hàng dùng điều này để xác minh sửa đổi phút chót không lọt qua review trước khi hợp đồng được ký.
- Sửa đổi bài luận và bản thảo — Nhà văn so sánh bản thảo đầu tiên với phiên bản đã chỉnh sửa có thể chuyển sang độ chi tiết từ để xem mọi thay thế, chèn và cắt mà không cần đọc lại cả hai bản. Quy trình tương tự dùng cho dịch giả kiểm tra thay đổi so với văn bản nguồn, biên tập viên kiểm tra rằng bản chỉnh sửa giữ nguyên giọng văn của tác giả, và nhóm báo chí đối chiếu bài đã xuất bản với bản nháp đã nộp.
- So sánh nhật ký và cấu hình — Sysadmin so sánh hai ảnh chụp cấu hình máy chủ, hai lịch cron hay hai đầu ra
ps auxcó thể dùng độ chi tiết dòng để tìm tham số đã thay đổi duy nhất trong tệp 200 dòng trong vài giây. Kết hợp với tùy chọn Bỏ qua khoảng trắng và diff chỉ căn chỉnh ồn ào sẽ thu gọn thành các thay đổi tham số thực sự quan trọng.
Ứng dụng phổ biến
Diff văn bản xuất hiện ở cuối mọi chu kỳ chỉnh sửa trong công việc viết lách, phát triển và vận hành.
- Review pull request: dán hai triển khai hàm cạnh nhau để hiểu thay đổi logic trước khi phê duyệt, mà không cần overhead của việc checkout branch.
- QA quốc tế hóa: so sánh chuỗi nguồn tiếng Anh với tương đương đã dịch ở cấp độ từ để phát hiện chèn, bỏ sót hoặc hoán đổi thuật ngữ mà dịch giả có thể đã thực hiện.
- Phân tích sự cố: diff hai ảnh chụp manifest Kubernetes hay hai đầu ra "docker inspect" ở cấp độ dòng để cô lập thay đổi cấu hình xảy ra trước sự cố.
Ví dụ thực tế
Xét cấu hình máy chủ năm dòng. Gốc: host=localhost, port=5432, dbname=app_db, user=app, password=secret. Đã thay đổi: host=db.prod.example.com, port=5432, dbname=app_db, user=app_prod, password=secret. Với độ chi tiết dòng và chế độ xem Song song, dòng 1 hiển thị đỏ ở bên trái (host=localhost) và xanh ở bên phải (host=db.prod.example.com), dòng 4 hiển thị đỏ (user=app) và xanh (user=app_prod), và dòng 2, 3 và 5 không thay đổi ở cả hai bên. Thanh tóm tắt báo cáo 2 thêm mới, 2 xóa, 3 không thay đổi và độ tương đồng 60% — ba trong năm dòng được giữ. Chuyển sang độ chi tiết từ và diff siết chặt hơn: chỉ các giá trị ở bên phải của = trên dòng 1 và 4 sáng lên, các khóa không thay đổi và độ tương đồng tăng lên khoảng 85% vì LCS giờ đếm host, user và dấu câu xung quanh là đã giữ.
Điều này có chạy trong trình duyệt của tôi không?
Có. Toàn bộ tính toán diff chạy phía máy khách bằng thư viện mã nguồn mở jsdiff được tải với trang. Không có gì bạn gõ, dán hoặc so sánh được gửi đến bất kỳ máy chủ nào. Bạn có thể tự xác minh: mở DevTools trình duyệt, chuyển sang tab Network, xóa nhật ký, nhấp So sánh và xác nhận rằng không có yêu cầu mạng nào kích hoạt cho bước so sánh.
Phần trăm độ tương đồng có nghĩa gì?
Độ tương đồng được tính là token không thay đổi / max(tổng token trong bản gốc, tổng token trong bản đã thay đổi). Điểm 100% nghĩa là hai đầu vào giống nhau sau khi áp dụng tùy chọn tiền xử lý (gập chữ hoa, thu gọn khoảng trắng, cắt bỏ dòng). Điểm 0% nghĩa là không có token nào được chia sẻ giữa các đầu vào. Chỉ số này là xấp xỉ thô của khoảng cách chỉnh sửa — hữu ích như thước đo nhanh — không phải điểm đạo văn hay tính nguyên bản.
Có thể diff JSON / YAML / XML theo nghĩa ngữ nghĩa không?
Không có trong công cụ này. Đây là diff cấp văn bản, vì vậy định dạng lại JSON hay XML chỉ có khoảng trắng vẫn hiển thị nhiều thay đổi ngay cả khi dữ liệu về mặt logic giống nhau. Sắp xếp lại khóa đối tượng trong JSON cũng hiển thị là thay đổi mặc dù hầu hết parser coi thứ tự khóa là không quan trọng. Để diff ngữ nghĩa thật sự so sánh cây đối tượng đã phân tích và bỏ qua thứ tự khóa và định dạng, chúng tôi đang lên kế hoạch một công cụ JSON Diff chuyên dụng. Hiện tại, hãy chuẩn hóa cả hai đầu vào về cùng thụt lề và thứ tự khóa trước khi dán vào đây.
Chế độ xem hợp nhất và song song khác nhau như thế nào?
Song song hiển thị hai cột: bản gốc ở bên trái và phiên bản đã thay đổi ở bên phải, với dòng đã xóa được tô đỏ ở bên trái và dòng thêm mới được tô xanh ở bên phải. Dòng không thay đổi xuất hiện ở cả hai cột căn chỉnh cùng hàng. Hợp nhất hiển thị một cột duy nhất với tiền tố − và nền đỏ cho dòng đã xóa và tiền tố + và nền xanh cho dòng thêm mới — cùng layout mà git diff in ra terminal. Dùng hợp nhất khi bạn muốn sao chép kết quả như tệp patch hoặc dán vào thread review code. Dùng song song khi căn chỉnh trực quan của những gì thay thế gì quan trọng hơn văn bản patch thô.
Dán bản gốc ở bên trái, phiên bản đã thay đổi ở bên phải, chọn chế độ xem và độ chi tiết, và phép so sánh xuất hiện trong vài mili giây. Bật Chế độ trực tiếp và diff chạy lại mỗi lần gõ phím khi bạn chỉnh sửa bên nào. Tải kết quả dưới dạng tệp hợp nhất .patch chuẩn mà git apply nhận trực tiếp. Không tải lên, không cần tài khoản, không cần API key vendor, không có giới hạn quota.