2015-01-20 18 views
23

Một vài lần trong quá khứ, chúng tôi đã gặp sự cố khi nhà phát triển (hoặc rõ ràng hoặc hiệu quả) thực hiện git merge -s ours khi họ không có, cam kết đã bị mất và chúng tôi chỉ phát hiện ra điều này sau khi dọn dẹp phức tạp và tốn thời gian hơn nhiều. Các thử nghiệm đã không thất bại vì các cam kết rất bổ sung các bài kiểm tra được âm thầm hoàn nguyên cùng với mã họ đang thử nghiệm.Làm cách nào để tóm tắt hợp nhất để phát hiện lỗi `git merge -s ours`?

Những gì tôi muốn làm là tìm hoặc tạo một công cụ mà tóm tắt một hợp nhất, tạo ra một cái gì đó đầu ra như sau với một kết hợp bình thường:

Lines    Left(2b3c4d) Right(3c4d5e) 
Common with base 970   930 
Unique wrt base 20   50 
Unique wrt other 15   45 
Unique wrt merge 15   45 
Common with merge 995   985 

Nhưng trong trường hợp một hợp nhất đã được thực hiện không đúng cách , quay trở ra nhiều thay đổi, hoặc trong trường hợp một git merge -s ours được thực hiện, nó có thể dẫn đến một cái gì đó báo cáo như:

Lines    Left(2b3c4d) Right(3c4d5e) 
Common with base 970   930 
Unique wrt base 20   50 
Unique wrt other 15   45 
Unique wrt merge 15    0 !! 
Common with merge 990   935 
Warning: 100% of changes from 3c4d5e are missing from merge commit! 

Nếu báo cáo này được chạy cho mỗi cam kết, chúng tôi có thể cờ lên (thông qua một công việc Jenkins) bất cứ khi nào một hợp nhất là một chút trên mặt có mùi.

Cho đến nay tôi đã chơi với git diff --stat, git diff --name-statusgit diff --summary nhưng cho đến nay không có gì cho tôi một cách tuyệt đối những gì tôi muốn.

Điều tốt nhất tôi có thể làm cho đến nay sẽ cho kết quả giống như sau cho việc kết hợp bình thường:

   base..left base..right left..merge right..merge 
       f67c4..a9eb4 f67c4..5b592 a9eb4..cb209 5b592..cb209 
a |     1 +   1 +   
b |  1 +         1 + 
base |  1 +   1 +   1 +   1 + 
changed  2   2   2   2 
insertions(+) 2   2   2   2 
deletions(-) 0   0   0   0 

và cho một ours merge:

   base..left base..right left..merge right..merge 
       f67c4..a9eb4 f67c4..5b592 a9eb4..95637 5b592..95637 
a |     1 +      1 - 
b |  1 +         1 + 
base |  1 +   1 +      2 +- 
changed  2   2   0   3 
insertions(+) 2   2   0   2 
deletions(-) 0   0   0   2 

Lưu ý rằng tôi không chỉ muốn phát hiện sự hợp nhất -s ours, tôi cũng muốn nắm bắt tình huống mà một số nhưng không phải tất cả các thay đổi đều nằm trong kết quả hợp nhất. Đây là trường hợp tổng quát hơn về việc phát hiện các hợp nhất sai lệch hơn là chỉ kiểm tra một nguyên nhân cụ thể là bị mất thay đổi.

Ngoài ra, điều này dường như chỉ xảy ra khi có xung đột trong hợp nhất, do đó, bất kỳ phương thức nào yêu cầu chạy hợp nhất lại tự động cũng sẽ cần phải giải quyết các xung đột đó tự động.

Cuối cùng, tôi muốn có thể chạy tiện ích tóm tắt này trên một repo bẩn, mà không stashing tất cả các thay đổi của tôi trước tiên, do đó các thử nghiệm hiện tại của tôi với git diff.

Bất kỳ đề xuất nào về cách tôi có thể nhận được loại thông tin này trực tiếp hơn so với tập lệnh có nhiều phân tích cú pháp và định dạng lại sẽ được đánh giá cao.

Các câu hỏi hiện gần nhất tôi có thể tìm thấy điều này là: Detect a merge made by '-s ours' (nhưng câu trả lời chỉ có không giúp) và “git merge -s ours” and how to show difference (nhưng không có câu trả lời nào cả có).

+2

Cách dễ dàng để phát hiện quá trình hợp nhất '-s ours' là bằng cách chạy khác biệt với cả cha lẫn mẹ của cam kết hợp nhất. Nếu một khác biệt là ** trống ** và cha mẹ khác biệt, đó là dấu hiệu chắc chắn rằng '-s ours' (hoặc tương đương) đã được thực hiện. Ví dụ, bạn có thể lặp qua '$ (git show --pretty =% P $ commit)' và cảnh báo 'if! git diff -s --exit-code $ parent .. $ commit'. – user4815162342

+0

Cách tốt nhất để xem điều gì đã xảy ra trong IMO hợp nhất là tự làm lại việc hợp nhất, sau đó phân biệt kết quả với hợp nhất thực tế. Vì vậy, 'git checkout ; git merge ; git diff ' –

+0

Cảm ơn @ user4815162342, đó là khá nhiều những gì tôi đang làm ở trên, sử dụng' git diff --stat' trên 'base..left',' base..right', 'left..merge' &' right..merge'. Ngoài ra, tôi không muốn giả định một 's ours' hợp nhất btw, tôi cũng muốn nắm bắt tình hình mà một số nhưng không phải tất cả các thay đổi trong hợp nhất kết quả. Tôi đã cập nhật câu hỏi của mình để làm rõ hơn cả. –

Trả lời

1

Tôi đã gặp sự cố chính xác này và đã kết thúc bằng cách viết công cụ để phát hiện các loại hợp nhất này. Trong khi tôi không thể chia sẻ mã thực tế (nó thuộc sở hữu về mặt kỹ thuật của chủ nhân của tôi), thuật toán rất đơn giản: hãy để S1 là tập hợp tất cả các tệp có thay đổi giữa kết hợp và phụ huynh thứ hai của hợp nhất. Cho S2 là tập hợp tất cả các tệp có thay đổi giữa hợp nhất và cơ sở hợp nhất. Trừ S2 từ S1 và bạn còn lại với tập hợp các tệp có thể đã mất các thay đổi do hợp nhất.

Điều này sẽ không chỉ phát hiện các lần hợp nhất được thực hiện với -s ours, nó cũng sẽ phát hiện các lần hợp nhất bị thất bại ở đó số, nhưng không phải tất cả, thay đổi trong phụ huynh thứ hai.

Các vấn đề liên quan