Bắt diff (hoặc git diff) để hiển thị hunk được chèn đúng cách


7

Hãy nói rằng tôi có hai tập tin. Cái đầu tiên có nội dung:

line 1
foo
line 2

line 1
bar
line 2

Và phần thứ hai có một phần mới được chèn ở giữa, vì vậy nó trông như thế này:

line 1
foo
line 2

line 1
new text
line 2

line 1
bar
line 2

Bây giờ, khi tôi thực hiện "diff -u", tôi nhận được đầu ra như thế này:

--- file1   2013-06-25 16:27:43.170231844 -0500
+++ file2   2013-06-25 16:27:59.218757056 -0500
@@ -1,7 +1,11 @@
line 1
foo
line 2

line 1
+new text
+line 2
+
+line 1
bar
line 2

Điều này không phản ánh đúng rằng khổ thơ giữa đã được chèn - thay vào đó, nó trông giống như khổ thơ thứ hai đã được thay đổi, và một đoạn mới được thêm vào cuối (điều này là do thuật toán bắt đầu ở dòng khác nhau đầu tiên).

Có cách nào để lấy diff (bằng chính nó, hoặc sử dụng git diff) để hiển thị đầu ra này thay thế không?

--- file1   2013-06-25 16:27:43.170231844 -0500
+++ file2   2013-06-25 16:27:59.218757056 -0500
@@ -1,7 +1,11 @@
line 1
foo
line 2
+
+line 1
+new text
+line 2

line 1
bar
line 2

Đây chủ yếu là một vấn đề khi tạo một bản vá để ai đó xem xét, trong đó một chức năng mới được chèn vào một nhóm các chức năng tương tự. Hành vi mặc định không phản ánh những gì thực sự thay đổi.


Hãy thử sdiff file1 file2có thể đây là những gì bạn đang tìm kiếm.
g4ur4v

@ g4ur4v, không hoàn toàn - điều đó vẫn khiến nó trông giống như một phần của phần 2 đã được sửa đổi và một phần của phần 3 được thêm vào - khi trong thực tế, một phần mới được chèn vào giữa hai phần còn lại.
Derek Pressnall

"Hàm mới được chèn vào một nhóm các hàm tương tự" là một chút mùi mã, ngoại trừ quá phổ biến trong một số ngôn ngữ. Bạn đã thử --unified 5hoặc giá trị lớn hơn?
msw

@msw, tôi đồng ý về mùi mã nói chung - Tôi không thể nhớ lại trường hợp ban đầu này là gì. Tuy nhiên trường hợp gần đây nhất của tôi là khi chèn các bản ghi vào xuất cơ sở dữ liệu XML; trong trường hợp này, các bản ghi mới thường sẽ tương tự như các bản ghi xung quanh (gần giống với ví dụ tôi có ở trên). Đối với việc thêm một số lượng lớn vào cờ --unified, điều đó chỉ mang lại nhiều bối cảnh hơn, nhưng không thay đổi khi xuất hiện các dấu "+".
Derek Pressnall

XML rất lặp đi lặp lại. Tôi đã không truy đuổi bất kỳ liên kết nào nhưng có lẽ stackoverflow.com/questions/1871076/NH có thể hữu ích. Sau đó tôi đã suy nghĩ về thuật toán chuỗi con chung dài nhất và nhận ra nó, về sự cần thiết, sẽ tạo ra các khác biệt không biết nguồn. Điều này đã bật lên msdn.microsoft.com/en-us/l Library / aa302294.aspx dường như hoạt động ở cấp độ ngữ nghĩa.
msw

Câu trả lời:


2

Git 2.9 đã được phát hành vào đầu năm nay, bao gồm cờ thử nghiệm --compaction-heuristictrên git difflệnh:

Trong 2.9, công cụ tìm khác biệt của Git đã học được một heuristic mới: nó cố gắng giữ các ranh giới hunk ở các dòng trống, dịch chuyển hunk "lên" bất cứ khi nào đáy của hunk khớp với đáy của bối cảnh trước đó, cho đến khi chúng ta chạm một dòng trống.

Tôi không nghĩ GitHub đã kích hoạt tính năng khác biệt trên giao diện người dùng web cho Yêu cầu kéo và so sánh, nhưng bạn có thể thực hiện tại địa phương. Tôi khuyên bạn nên sử dụng kết hợp với --word-diffnếu bạn cần mức độ chi tiết đó.

Thêm chi tiết có sẵn trên blog GitHub: https://github.com/blog/2188-git-2-9-has-been-release


Không có vẻ như lá cờ đó tồn tại nữa, ít nhất là trên git 2.20
Boris

1

Thuật toán diff kiên nhẫn ( git diff --patience) có thể cho bạn kết quả tự nhiên hơn, mặc dù không phải trong mọi trường hợp.


1
Điều này vẫn tạo ra kết quả tương tự trong ví dụ của tôi ở trên. Tôi biết có một giải pháp ở đâu đó, vì tôi nhớ đọc về nó một lúc trước, chỉ không thể nhớ.
Derek Pressnall

0

Trong một số trường hợp nhất định, lệnh git diff --word-diff(hoặc --color-words) có thể cho bạn kết quả tìm kiếm tốt hơn

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.