Học bằng cách đọc theo thứ tự

Khác biệt giữa các tệp — diff

Tìm hiểu cách kiểm tra khác biệt giữa hai tệp bằng diff. Bạn sẽ đọc được những dòng nào đã được thêm, xóa hay thay đổi, qua sơ đồ và terminal thực hành ngay trong trình duyệt.

Khi nào dùng diff

Dùng nó khi bạn muốn kiểm tra bạn đã thay đổi gì sau khi sửa một tệp, hoặc xem hai tệp có cùng nội dung không. Đưa cho nó hai tệp và nó chỉ hiển thị những dòng khác nhau.

So sánh hai tệp — diff

diff so sánh hai tệp và chỉ hiển thị những phần khác nhau. Bạn dùng nó dưới dạng diff old.txt new.txt, xem tệp thứ nhất là bản cũ (trước) và tệp thứ hai là bản mới (sau). Các dòng giống nhau không được in ra — chỉ những khác biệt được báo cáo.

So sánh hai tệp bằng diff
old.txtapple / banana / cherrynew.txtapple / grape / cherrydiffKết quả-banana+grapemớihiện khác biệthai tệp được so sánh
diff old.txt new.txt đối chiếu hai tệp và chỉ hiển thị dòng thứ hai khác nhau dưới dạng -banana (cũ) và +grape (mới). Các dòng applecherry giống nhau không được in ra.

Trong terminal trình duyệt, diff hiển thị khác biệt theo định dạng hợp nhất (unified format). Phần ---+++ ở đầu là tên của hai tệp được so sánh, dòng @@ đánh dấu vị trí xảy ra thay đổi, và trong phần thân mỗi dòng bị xóa bắt đầu bằng - còn mỗi dòng được thêm bắt đầu bằng +. Các dòng không đổi bắt đầu bằng một khoảng trắng và xuất hiện kèm theo làm ngữ cảnh.

Ký hiệuÝ nghĩa
--- old.txtTên tệp thứ nhất (cũ) được so sánh
+++ new.txtTên tệp thứ hai (mới) được so sánh
@@ -N,M +N,M @@Thông tin vị trí nơi thay đổi xảy ra
- dòngMột dòng bị xóa (đã có trong tệp cũ)
+ dòngMột dòng được thêm (có trong tệp mới)
dòng (khoảng trắng đầu dòng)Một dòng không đổi, hiển thị kèm theo làm ngữ cảnh
Đọc định dạng hợp nhất
Dòng bị xóa(tệp cũ)@@ -1,3 +1,3 @@Đánh dấu nơithay đổi xảy ra- banana+ grapeDòng được thêm(tệp mới)
Trong định dạng hợp nhất, @@ đánh dấu vị trí thay đổi, - là dòng bị xóa (cũ), và + là dòng được thêm (mới). Các dòng không đổi xuất hiện kèm theo với một khoảng trắng ở đầu.
printf 'apple\nbanana\ncherry\n' > old.txt   # tạo tệp mẫu
printf 'apple\ngrape\ncherry\n' > new.txt    # tệp mẫu khác một dòng
diff old.txt new.txt
--- old.txt
+++ new.txt
@@ -1,3 +1,3 @@
 apple
-banana
+grape
 cherry

① Chạy printf 'apple\nbanana\ncherry\n' > old.txt để tạo tệp mẫu thứ nhất.

② Chạy printf 'apple\ngrape\ncherry\n' > new.txt để tạo tệp mẫu thứ hai, chỉ khác ở dòng 2.

③ Đưa hai tệp cho diff theo thứ tự này và đọc xem dòng nào nhận ký hiệu - (bị xóa) và + (được thêm). (Chạy đúng thì phần giải thích sẽ hiện ra.)

Linux console
0 / 3 đã hoàn thành
Loading Linux Terminal...

Đọc phần thêm và phần xóa

Khác biệt không chỉ là viết lại. Khi một dòng chỉ được thêm vào tệp bên phải, bạn chỉ nhận một dòng +; khi một dòng bị xóa khỏi tệp bên trái, bạn chỉ nhận một dòng -. Thay vì -+ xuất hiện thành cặp như khi viết lại, chỉ một trong hai xuất hiện là dấu hiệu của việc thêm hoặc xóa. Hãy đổi thứ tự so sánh, và cùng một khác biệt sẽ đảo giữa + (được thêm) và - (bị xóa).

printf 'one\ntwo\n' > base.txt        # tạo tệp mẫu
printf 'one\ntwo\nthree\n' > more.txt  # tệp mẫu thêm một dòng
diff base.txt more.txt
--- base.txt
+++ more.txt
@@ -1,2 +1,3 @@
 one
 two
+three
Đổi thứ tự thì + và - đảo chỗ
diffbase.txt more.txtĐổi thứ tự thì+ và - đảo chỗdiffmore.txt base.txt+ three(được thêm)- three(bị xóa)+ xuất hiện- xuất hiện
Với cùng hai tệp, diff base.txt more.txt hiển thị +three (được thêm), còn lệnh đảo ngược diff more.txt base.txt hiển thị -three (bị xóa).

① Chạy printf 'one\ntwo\n' > base.txt để tạo tệp mẫu thứ nhất có 2 dòng.

② Chạy printf 'one\ntwo\nthree\n' > more.txt để tạo tệp mẫu thứ hai có thêm dòng thứ ba.

③ So sánh bằng diff theo thứ tự base.txtmore.txt và xác nhận dòng được thêm bắt đầu bằng +.

④ Rồi đảo thứ tự thành more.txtbase.txt và xác nhận cùng khác biệt đó hiển thị thành - (bị xóa), và rằng đổi thứ tự thì +- đảo chỗ.

Linux console
0 / 4 đã hoàn thành
Loading Linux Terminal...

diff và patch, cùng cách các môi trường khác hiển thị

Bản diff theo định dạng hợp nhất mà diff tạo ra có thể áp dụng nguyên vẹn vào một tệp khác bằng lệnh patch. Khi một nhóm trao đổi các bản sửa, việc chuyển qua lại bản diff này (một patch) là phổ biến. Khóa học này tập trung vào việc đọc diff và không đề cập đến việc áp dụng chúng ở đây.

Trong terminal trình duyệt của khóa học này, diff xuất trực tiếp định dạng hợp nhất. Với GNU diff trên Ubuntu và tương tự, diff đơn thuần hiển thị định dạng truyền thống dùng 2c2< / >, còn thêm diff -u sẽ cho ra cùng định dạng hợp nhất được dùng trong khóa học này.

QUIZ

Kiểm tra kiến thức

Hãy trả lời từng câu hỏi một.

Câu 1Trong đầu ra định dạng hợp nhất của diff, ký hiệu nào bắt đầu một dòng bị xóa (dòng đã có trong tệp cũ)?

Câu 2Một dòng như @@ -1,3 +1,3 @@ cho biết điều gì?

Câu 3Khi một dòng chỉ được thêm vào tệp bên phải, đầu ra của diff trông như thế nào?