`Git diff --patience` dùng để làm gì?


219

Thuật toán kiên nhẫn khác với git diffthuật toán mặc định như thế nào và khi nào tôi muốn sử dụng nó?


1
Có thể nó khớp với mã di chuyển và các dòng được sửa đổi có thể chậm hơn nhiều
codymanix

Tôi đã trích xuất một tập lệnh độc lập cho Patience Diff từ Bazaar, bạn có thể tìm thấy nó trong một luồng SO khác .
TryPyPy

38
Một câu hỏi tiếp theo. Khi nào tôi không nên sử dụng khác biệt kiên nhẫn?
balki

4
Ngoài ra còn có --histogramtham số "... mở rộng thuật toán kiên nhẫn để" hỗ trợ các yếu tố phổ biến ít xảy ra " git-scm.com/docs/git-diff.html
Robert

Câu trả lời:


183

Bạn có thể đọc một bài đăng từ Bram Cohen , tác giả của thuật toán diff kiên nhẫn, nhưng tôi thấy bài viết trên blog này để tóm tắt thuật toán diff kiên nhẫn rất tốt:

Thay vào đó, Patience Diff tập trung năng lượng vào các dòng nội dung cao tần số thấp dùng làm điểm đánh dấu hoặc chữ ký của nội dung quan trọng trong văn bản. Nó vẫn là một khác biệt dựa trên LCS ở cốt lõi của nó, nhưng với một sự khác biệt quan trọng, vì nó chỉ xem xét sự tồn tại phổ biến dài nhất của các dòng chữ ký:

Tìm tất cả các dòng xảy ra chính xác một lần ở cả hai bên, sau đó thực hiện nối tiếp chung dài nhất trên các dòng đó, khớp với chúng.

Khi nào bạn nên sử dụng khác biệt kiên nhẫn? Theo Bram, khác biệt kiên nhẫn là tốt cho tình huống này:

Các trường hợp thực sự xấu là những trường hợp có hai phiên bản đã chuyển hướng đáng kể và nhà phát triển không cẩn thận để kiểm soát kích thước bản vá. Trong các trường hợp đó, thuật toán diff đôi khi có thể trở thành 'căn chỉnh' trong đó nó khớp các phần dài của dấu ngoặc nhọn với nhau, nhưng nó kết hợp tương quan giữa các dấu ngoặc nhọn của các hàm trong một phiên bản với dấu ngoặc nhọn của hàm tiếp theo trong phiên bản khác. Tình huống này rất xấu , và có thể dẫn đến một tệp xung đột hoàn toàn không thể sử dụng được trong tình huống mà bạn cần những thứ như vậy được trình bày mạch lạc nhất.


3
Theo kinh nghiệm của tôi với XML bây giờ, nó cho kết quả chính xác "xấu" như một khác thường.
stivlo

5
Tôi đã có nhiều may mắn hơn với sự kiên nhẫn khác với XML; chắc chắn là diff tôi đang xem hiện tại có chính xác vấn đề sai lệch được mô tả với thuật toán diff thông thường, nhưng trông hoàn toàn lớn với sự khác biệt kiên nhẫn.
me_and

22
Blog này có một lời giải thích tuyệt vời, bao gồm một gif hoạt hình của quá trình: alfedenzo.livejournal.com/170301.html
Quantum7

3
Tôi thấy blog này rất thú vị và cung cấp lời giải thích tốt với các liên kết tiếp theo đến chi tiết thuật toán: fabiensanglard.net/git_code_Vview/diff.php Hy vọng nó sẽ hữu ích cho ai đó
SathOkh

Có thể thấy frobnitz / fib / fact diff tại gist.github.com/roryokane/6f9061d3a60c1ba41237
George V. Reilly

52

Bạn cũng có thể sử dụng nó để hợp nhất (hoạt động thực sự tốt ở đây đối với một số xung đột XML):

git merge --strategy-option=patience ...

51
Hoặc thông quagit config --global diff.algorithm patience
Tobu

11
Ngắn hơn sẽ là git merge -X patience.
PythonNut

42

Thuật toán diff kiên nhẫn là một thuật toán diff khác chậm hơn cho thấy kết quả tốt hơn trong một số trường hợp.

Giả sử bạn đã đăng ký tệp sau vào git:

.foo1 {
    margin: 0;
}

.bar {
    margin: 0;
}

Bây giờ chúng tôi sắp xếp lại các phần và thêm một dòng mới:

.bar {
    margin: 0;
}

.foo1 {
    margin: 0;
    color: green;
}

Thuật toán diff mặc định tuyên bố rằng các tiêu đề của phần đã thay đổi:

$ git diff --diff-algorithm=myers   
diff --git a/example.css b/example.css
index 7f1bd1e..6a64c6f 100755
--- a/example.css
+++ b/example.css
@@ -1,7 +1,8 @@
-.foo1 {
+.bar {
     margin: 0;
 }

-.bar {
+.foo1 {
     margin: 0;
+    color: green;
 }

Trong khi sự kiên nhẫn khác biệt cho thấy một kết quả được cho là trực quan hơn:

$ git diff --diff-algorithm=patience
diff --git a/example.css b/example.css
index 7f1bd1e..6a64c6f 100755
--- a/example.css
+++ b/example.css
@@ -1,7 +1,8 @@
-.foo1 {
-    margin: 0;
-}
-
 .bar {
     margin: 0;
 }
+
+.foo1 {
+    margin: 0;
+    color: green;
+}

một cuộc thảo luận tốt về chất lượng khác biệt chủ quan ở đây , và git 2.11 đang khám phá các heuristic khác .

Lưu ý rằng thuật toán diff kiên nhẫn vẫn có một số trường hợp bệnh lý đã biết .

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.