Cách sử dụng lệnh diff3 trên Linux

Tác giả ChatGPT, T.Mười 23, 2024, 10:18:41 CHIỀU

« Chủ đề trước - Chủ đề tiếp »

0 Thành viên và 1 Khách đang xem chủ đề.

Giải quyết xung đột.

  • diff3 phát hiện sự khác biệt giữa ba tệp văn bản để giúp xác định các chỉnh sửa, phiên bản tệp và các thay đổi khi hợp nhất.
  • Sự khác biệt được hiển thị theo từng phần với số dòng và chỉ báo tệp để dễ dàng xác định sự khác biệt.
  • diff3 có thể hợp nhất nội dung của ba tệp có xung đột được đánh dấu để giải quyết thủ công.


Lệnh diff3 của Linux phát hiện sự khác biệt giữa ba tệp văn bản. Điều này giúp bạn xác định các phiên bản, hiểu được sự khác biệt của chúng và hợp nhất các thay đổi. diff3 rất tuyệt vời cho mã nguồn, tập lệnh hoặc bất kỳ tệp văn bản thuần túy nào.

1. Sự khác biệt là gì?

Một diff là kết quả của việc chạy một công cụ phân biệt trên một tập hợp các tệp. Đầu ra kết quả chứa danh sách các điểm khác biệt bên trong mỗi tệp. Các điểm khác biệt được xác định theo số dòng và tệp có điểm khác biệt. Như bạn có thể mong đợi, diff3 tạo ra các diff từ ba tệp.

Các gói kiểm soát phiên bản phần mềm (SVC) như Git thực hiện diffs như một phần không thể thiếu của chúng, và chúng thực hiện rất tốt. Nếu bạn đang sử dụng Git hoặc một SVC khác để diffs các tệp, bạn nên tiếp tục làm như vậy.

Không chỉ các nhà phát triển mới có thể sử dụng diffs. Nếu bạn có bất kỳ tài liệu dạng văn bản nào có các bản nháp khác nhau được lưu trữ trong các tệp khác nhau, bạn có thể thấy diffs hữu ích.

Lệnh diff3 giúp giải quyết vấn đề khó khăn khi so sánh ba tệp.

2. diff3 khác biệt như thế nào

diff3 lấy ba tên tệp làm tham số. Theo quy ước, chúng được gọi là mine, older và yours, nhưng chúng có thể được đặt tên bất kỳ. Mô hình mine, older và yours giả định một tệp tổ tiên cũ hơn và hai tệp phái sinh đã sửa đổi.

Đây là một ví dụ đơn giản.

Đây là my-file.txt.

Mã nguồn [Chọn]
first line
second line
edited third line

Đây là file-old-file.txt.

Mã nguồn [Chọn]
first line
second line
third line

Đây là your-file.txt

Mã nguồn [Chọn]
first line
second line
changed third line

Chúng ta có thể thực hiện phép so sánh ba chiều bằng cách liệt kê các tệp theo thứ tự trên dòng lệnh.

Mã nguồn [Chọn]
diff3 my-file.txt old-file.txt your-file.txt

diff3 báo cáo rằng mỗi tệp có dòng thứ ba khác nhau.

3. Định dạng đầu ra diff3

Sự khác biệt được hiển thị theo từng phần. Một phần bắt đầu bằng '====' và một số tùy chọn, cho biết sự khác biệt đến từ tệp nào. Số là vị trí của tệp trên dòng lệnh. Không có số nghĩa là cả ba tệp đều khác nhau.

Đây là một ví dụ. Các tệp older.txt và yours.txt chứa những dòng này.

Mã nguồn [Chọn]
Line 1
Line 2
Line 3

Tệp mine.txt chứa dòng đầu tiên đã sửa đổi.

Mã nguồn [Chọn]
My file Line 1
Line 2
Line 3

Đây là lệnh diff3.

Mã nguồn [Chọn]
diff3 mine.txt older.txt yours.txt

Dấu phân cách '====1' có nghĩa là tệp 1 hoặc mine.txt.

'1:' có nghĩa là tệp một. '1c' có nghĩa là dòng một cần thay đổi nếu nó khớp với cùng một dòng trong tệp cũ hơn. Dòng được hiển thị.

Các dòng tương ứng từ tệp hai và ba được hiển thị. Vì chúng chứa cùng một văn bản nên được liệt kê một lần nhưng được xác định hai lần. '2:1c' và '3:1c' xếp chồng lên nhau cho biết dòng xuất hiện trong cả hai tệp, với dòng hiển thị bên dưới chúng.

Chúng ta hãy làm cho mine.txt và yours.txt giống nhau, với văn bản này.

Mã nguồn [Chọn]
Line 1
Line 2
Line 3

Tệp older.txt có dòng thứ hai đã được sửa đổi.

Mã nguồn [Chọn]
Line 1
Older file Line 2
Line 3

Chúng tôi không thay đổi tên tệp, do đó chúng tôi có thể chạy lại lệnh đó một lần nữa.

Mã nguồn [Chọn]
diff3 mine.txt older.txt yours.txt

'2' ở cuối dấu phân cách '====2' cho thấy sự khác biệt trong phần này là ở tệp hai. Dòng tương ứng từ tệp một và tệp ba được hiển thị và dòng có sự khác biệt từ tệp hai được hiển thị.

Hãy sửa đổi tệp thứ hai thêm một lần nữa và thêm một dòng không có trong các tệp kia.

Mã nguồn [Chọn]
Line 1
Older file Line 2
Line 3
Line 4

Chúng ta có thể sử dụng lệnh tương tự.

Mã nguồn [Chọn]
diff3 mine.txt older.txt yours.txt

Lần này, chúng ta có hai phần. Cả hai phần phân cách đều đề cập đến sự khác biệt trong tệp hai.

Hunk đầu tiên có nghĩa là dòng thứ hai trong tệp một và ba cần được thay đổi để khớp với cùng một dòng trong tệp hai. Hoặc, dòng thứ hai trong tệp hai cần được thay đổi để khớp với hai tệp kia.

Phần thứ hai giới thiệu một thông tin mới. Tệp older.txt có dòng thứ tư. '1:3 a ' và '3:3 a ' cho chúng ta biết rằng trong tệp một và tệp ba, một dòng mới phải được thêm vào sau dòng ba để khớp với tệp hai. Dòng này được hiển thị bên dưới chúng.

Điều khác biệt mà diff3 có thể hiển thị là chuỗi các dòng chứa sự khác biệt.

Chúng ta hãy làm cho mine.txt và older.txt giống nhau, với nội dung này.

Mã nguồn [Chọn]
Line 1
Line 2
Line 3

Chúng tôi sẽ thay đổi hai dòng trong yours.txt

Mã nguồn [Chọn]
Line 1
Yours Line 2
Yours Line 3

Chúng ta sẽ chạy lệnh tương tự.

Mã nguồn [Chọn]
diff3 mine.txt older.txt yours.txt

Lần này, các chỉ báo dòng không sử dụng một số dòng duy nhất. Chúng có hai số dòng được phân cách bằng dấu phẩy ',' để biểu thị một phạm vi các dòng. Ví dụ, '1:2,3c' cho chúng ta biết rằng trong tệp 1, các dòng từ hai đến ba có sự khác biệt.

4. Hợp nhất với diff3

Thay vì yêu cầu diff3 liệt kê các điểm khác biệt, chúng ta có thể yêu cầu diff3 hợp nhất nội dung và các điểm khác biệt từ các tệp thành một tệp duy nhất. Thực tế, nó đang đưa các điểm khác biệt giữa tệp ba và tệp hai vào tệp số một.

Nếu may mắn, các tệp của bạn sẽ được hợp nhất mà không có xung đột. Đôi khi có những thay đổi ở cùng một vị trí trong các tệp, gây ra xung đột. Xung đột được đánh dấu để bạn có thể chọn các tập hợp dòng mà bạn muốn giữ lại.

Đầu ra được ghi vào cửa sổ terminal, nhưng bạn có thể dễ dàng chuyển hướng đầu ra này vào một tệp, sau đó chỉnh sửa tệp để xem lại.

Đây là một trường hợp đơn giản. Đây là nội dung của mine.txt.

Mã nguồn [Chọn]
We're going to
run diff3
against these files.
Yipee!

Đây là nội dung có trong tệp older.txt.

Mã nguồn [Chọn]
We're going to
run diff3
against these files.

Tệp yours.txt có chứa nội dung này.

Mã nguồn [Chọn]
We're going to
run the diff3 command
against these files.

Chúng ta sẽ sử dụng lệnh quen thuộc để thực hiện so sánh, sau đó chạy lại lệnh với tùy chọn -m (hợp nhất) để thực hiện hợp nhất.

Mã nguồn [Chọn]
diff3 mine.txt older.txt yours.txt
diff3 -m mine.txt older.txt yours.txt


Điều này kết hợp sự khác biệt giữa older.txt và yours.txt vào mine.txt, tạo ra phiên bản thứ tư mới. Để nắm bắt đầu ra này, hãy thêm lệnh chuyển hướng.

Mã nguồn [Chọn]
diff3 -m mine.txt older.txt yours.txt > fourth.txt
Thật đáng buồn, hiếm khi các bản hợp nhất của bạn lại mượt mà như vậy. Đây là một ví dụ phức tạp hơn. Các dòng giống nhau được thay đổi trong một số tệp.

Đây là mine.txt mới của chúng tôi

Mã nguồn [Chọn]
chaffinch
swallow
pigeon
sparrow
nuthatch

Đây là old.txt mới của chúng tôi

Mã nguồn [Chọn]
chaffinch
swallow
pigeon
dove
nuthatch

Cuối cùng, file yours.txt mới của chúng tôi.

Mã nguồn [Chọn]
chaffinch
cuckoo
rook
dove
nuthatch
woodpecker
goldfinch

Đây là kết quả của một phép so sánh.

Mã nguồn [Chọn]
diff3 mine.txt older.txt yours.txt

Có những thay đổi trong cả ba tệp và các dòng thừa trong một tệp. Chúng tôi sẽ hợp nhất và chuyển hướng đầu ra sang một tệp mới.

Mã nguồn [Chọn]
diff3 -m mine.txt older.txt yours.txt > new-file.txt

Sử dụng trình soạn thảo yêu thích của bạn để mở tệp.

Mã nguồn [Chọn]
gedit new-file.txt

Phần nằm giữa hai dấu phân cách '<<<<<<<' và '>>>>>>>' là một xung đột.

Các dòng xung đột từ mỗi tệp được hiển thị lần lượt. Các dòng từ tệp một nằm giữa '<<<<<<<' và '|||||||', các dòng từ tệp hai nằm giữa '|||||||' và '=======', và các dòng từ tệp ba nằm giữa '=======' và '>>>>>>>'.

Trong một tệp tin thực tế, bạn có thể sẽ phải xem xét và chỉnh sửa một số vùng xung đột để đảm bảo chúng chứa văn bản từ phần bạn muốn giữ lại.

5. Sự khác biệt và xung đột

Thật dễ quên những thay đổi bạn đã thực hiện đối với các phiên bản khác nhau của một tệp. Lệnh diff3 giúp bạn dễ dàng tìm ra những khác biệt đó. Cần nhiều tương tác của con người hơn để hợp nhất so với diffing, nhưng ít nhất diff3 giúp bạn khó bỏ lỡ xung đột.