Tại sao nên sử dụng diff / patch khi sử dụng cp dễ dàng hơn


19
diff -u file1.txt file2.txt > patchfile

tạo một tệp vá bao gồm hướng dẫn patchđể chuyển đổi file1.txt giống hệt như file2.txt

Điều này có thể được thực hiện bằng cách sử dụng cplệnh thay thế? Tôi có thể tưởng tượng điều này hữu ích khi tệp quá lớn và phải được truyền qua mạng nơi phương pháp này có thể tiết kiệm băng thông. Có cách nào khác để sử dụng diff / patch sẽ thuận lợi trong các tình huống khác không?

Câu trả lời:


31

Khác biệt có thể phức tạp hơn so với việc chỉ so sánh một tệp này với tệp khác. Có thể so sánh toàn bộ hệ thống phân cấp thư mục. Hãy xem xét ví dụ mà tôi muốn sửa một lỗi trong GCC. Thay đổi của tôi thêm một hoặc hai trong 4 hoặc 5 tệp và xóa một số dòng trong các tệp đó và các tệp khác. Nếu tôi muốn truyền đạt những thay đổi này cho ai đó, có khả năng đưa vào GCC, các tùy chọn của tôi là

  • Sao chép toàn bộ cây nguồn
  • Chỉ sao chép các tệp đã được thay đổi
  • Cung cấp chỉ những thay đổi tôi đã thực hiện

Sao chép toàn bộ cây nguồn không có ý nghĩa gì, nhưng còn hai tùy chọn khác, điều cốt lõi của câu hỏi của bạn. Bây giờ hãy xem xét rằng một người khác cũng làm việc trên cùng một tệp như tôi đã làm và cả hai chúng tôi đều đưa ra những thay đổi của mình cho ai đó. Làm thế nào người này sẽ biết những gì chúng tôi đã làm và nếu các thay đổi tương thích (các phần khác nhau của tệp) hoặc xung đột (cùng một dòng của tệp)? Anh sẽ khác họ! Khác biệt có thể cho anh ta biết các tệp khác nhau như thế nào và từ tệp nguồn không được sửa đổi. Nếu khác biệt là những gì cần thiết, nó chỉ có ý nghĩa hơn khi chỉ gửi khác biệt ở nơi đầu tiên. Một khác biệt cũng có thể chứa các thay đổi từ nhiều hơn một tệp, vì vậy trong khi tôi chỉnh sửa tổng cộng 9 tệp, tôi có thể cung cấp một tệp khác để mô tả các thay đổi đó.

Diff cũng có thể được sử dụng để cung cấp lịch sử. Điều gì sẽ xảy ra nếu một sự thay đổi ba tháng trước gây ra một lỗi mà tôi chỉ phát hiện ra ngày hôm nay. Nếu tôi có thể thu hẹp khi lỗi được giới thiệu và có thể cách ly nó với một thay đổi cụ thể, tôi có thể sử dụng diff để "hoàn tác" hoặc hoàn nguyên thay đổi. Đây không phải là điều tôi có thể dễ dàng làm nếu tôi chỉ sao chép các tệp xung quanh.

Tất cả điều này liên quan đến kiểm soát phiên bản nguồn trong đó các chương trình có thể ghi lại lịch sử tệp dưới dạng một loạt các khác biệt kể từ thời điểm nó được tạo cho đến ngày hôm nay. Các khác biệt cung cấp lịch sử (tôi có thể tạo lại tệp như vào bất kỳ ngày cụ thể nào) có lẽ họ chỉ quan tâm đến một thay đổi khi tôi thực hiện nhiều).

Tóm lại, có, cpdễ hơn diffpatch, nhưng tiện ích của diffpatchlớn hơn so với cpcác tình huống trong đó cách thay đổi tệp là quan trọng để theo dõi.


Trong thực tế, git không thực sự lưu trữ lịch sử tập tin như là khác biệt của các lần xác nhận tiếp theo. Đối với mỗi cam kết là các cửa hàng, nội dung của mỗi tệp (xem "git show -s --pretty = raw" và "git ls-tree HEAD"). Sau đó, ở trên cùng của lớp này vì nhiều tệp sẽ giống nhau trong các cam kết khác nhau, nó sử dụng nén delta để chia sẻ dữ liệu giữa các tệp (nhưng điều này không gắn liền với lịch sử).
ysdx

Các khác biệt tuy nhiên là một công cụ trực quan thuận tiện cho lịch sử này.
ysdx

20

Khi bạn nhận được một bản vá, bạn có thể thường xuyên (đó là trừ khi bạn đã thực hiện các thay đổi cho cùng một dòng chính xác), áp dụng bản vá cho một tập hợp các tệp mà bạn cũng đã tự thay đổi.

Bản vá có thông tin về trạng thái cũ mới của các tệp. Nếu bạn nhận được một tệp được sao chép, bạn không biết bản gốc là gì (trạng thái cũ) và bạn không thể áp dụng các khác biệt cho một tệp (hoặc bộ tệp) mà bạn đã thay đổi mà không gặp khó khăn lớn. Vì vậy, đối với các tập tin nguồn, nó không phải là bảo tồn không gian là mối quan tâm chính, đó là thông tin trước-sau.

Trước khi (bối cảnh / thống nhất) khác, điều này thường được thực hiện với các hướng dẫn cho người chỉnh sửa (chèn một dòng sau X, xóa dòng Y), nhưng điều đó sẽ chỉ hoạt động nếu bạn biết trạng thái các hướng dẫn này bắt đầu từ đó. Do đó, có cùng một vấn đề như "giải pháp" của bạn chỉ với việc sao chép.


2
một tệp vá cũng cho phép bạn hoàn tác và áp dụng nó cho nhiều tệp cùng một lúc
Gilsham

Trên thực tế, diffs ( diff -u) là một cải tiến được thiết kế cho con người, chúng không giúp sự mạnh mẽ chống lại xung đột trên bối cảnh khác thường ( diff -c), tôi nghĩ. Ngay cả diffs ( diff) đơn giản vẫn thường hoạt động mà không biết chính xác "trạng thái các hướng dẫn này bắt đầu từ". Tuy nhiên, điều này tốt hơn câu trả lời được chấp nhận bởi vì nói về cách các tệp vá có thể vá nhiều tệp nguồn cùng một lúc thực sự là một cá trích đỏ.
Celada

@celeda bạn nói đúng về sự khác biệt về bối cảnh, giữa điều đó và sự khác biệt bình thường là nơi phân biệt chính. Nếu không có các bản vá bối cảnh thì khó hơn nhiều để áp dụng ngược lại, nếu có.
Anthon

12

Nếu bạn đang sử dụng diff, bạn có thể thấy chính xác những gì đã thay đổi, vì vậy sử dụng diff / patch là một cách để ngăn ai đó trượt các thay đổi không mong muốn trong tệp.


11

Các thay đổi được thực hiện cho các tệp thường nhỏ hơn nhiều so với các tệp được thay đổi.

Điều này có nghĩa là lưu trữ một diff có thể giúp bạn tiết kiệm rất nhiều không gian. Khi diffđược tạo ra, không gian đĩa đắt tiền.

Nhưng nó cũng có nghĩa là bạn có thể áp dụng lại một diff cho một tập tin ngay cả khi tập tin đó đã thay đổi theo những cách khác. Các bản vá tiện ích sẽ làm điều đó cho bạn và cho bạn biết khi có những vấn đề.

Trên thực tế đây là lý do quan trọng nhất để làm việc với các khác biệt trong phát triển phần mềm. Khi một thay đổi đã được thực hiện (thường là nhiều hơn một tệp), nó có thể được lưu dưới dạng khác: kết quả được gọi là tập thay đổi hoặc bản vá . Nếu tất cả đều ổn, bản vá không chỉ là một số thay đổi tùy ý, mà nó còn thực hiện một số thay đổi chức năng - ví dụ: sửa lỗi hoặc một tính năng mới.

Trong khi đó, một sự thay đổi khác nhau có thể được thực hiện, có thể bởi một nhà phát triển khác, thậm chí ở một địa điểm khác. Nếu những thay đổi không được thực hiện cho cùng một phần của cùng một tệp, thì chúng có thể được áp dụng độc lập. Vì vậy, các nhà phát triển có thể gửi cho nhau các bản vá của họ để thử nghiệm. Một tập hợp các bản vá có thể xây dựng đại diện cho những thay đổi có thể; một số trong số này cuối cùng có thể bị từ chối, phần còn lại sẽ được tích hợp vào hệ thống.

Vì vậy, làm việc với diffs cho phép phát triển đồng thời. Bạn không còn phải làm việc trên một thay đổi tại một thời điểm.

Các hệ thống kiểm soát phiên bản phân tán hiện đại là sự tiếp nối của cách làm việc này.


1

Trong ngắn hạn nó có thể. Nếu bạn xem một số video Thinkg Big Larry Wall trên youtube, anh ấy nói về cách diff / patch bắt đầu và vấn đề họ đã giải quyết, và về bản chất, đó là về việc giảm kích thước để liên lạc qua internet trong khi vẫn giữ cho các bản vá linh hoạt và dễ đọc với con người .

Nếu bạn đang ở trên một hệ thống địa phương và không quan tâm đến bất kỳ điều nào trong số này, thì tốt cphoặc rsyncổn.


Cảm ơn PSKocik. Bạn có thể vui lòng chia sẻ liên kết đến video đó?
chập chững

Tôi không đồng ý với tuyên bố cuối cùng. Ngày nay, nó không phải là về kích thước, mà là theo dõi quá trình phát triển của bạn để việc quản lý trở nên dễ dàng hơn.
rebierpost

@reinierpost sử dụng git để theo dõi quá trình phát triển của tôi. Tôi không vá khác biệt trực tiếp.
PSkocik
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.