2010-11-08 27 views
98

Wikipedia cho biết quá trình hợp nhất 3 chiều ít bị lỗi hơn so với hợp nhất 2 chiều và thường không cần sự can thiệp của người dùng. Tại sao điều này là trường hợp?Tại sao kết hợp 3 chiều thuận lợi hơn so với kết hợp 2 chiều?

Ví dụ trong đó hợp nhất 3 chiều thành công và kết hợp 2 chiều không thành công sẽ hữu ích.

+0

Liên kết đến trang wikipedia (hoặc vẫn còn tốt hơn, phần) được đề cập? – dmckee

Trả lời

154

Giả sử bạn và cả hai bạn đã kiểm tra tệp và thực hiện một số thay đổi đối với tệp đó. Bạn đã xóa một dòng ngay từ đầu và bạn của bạn đã thêm một dòng ở cuối. Sau đó, anh ấy đã cam kết tệp của mình và bạn cần hợp nhất các thay đổi của mình vào bản sao của bạn.

Nếu bạn đang thực hiện hợp nhất hai chiều (nói cách khác là khác), công cụ có thể so sánh hai tệp và thấy rằng dòng đầu tiên và cuối cùng khác nhau. Nhưng làm thế nào nó sẽ biết phải làm gì với sự khác biệt? Phiên bản đã hợp nhất có bao gồm dòng đầu tiên không? Nó có nên bao gồm dòng cuối cùng không?

Với hợp nhất ba chiều, nó có thể so sánh hai tệp, nhưng nó cũng có thể so sánh từng tệp với bản gốc (trước khi một trong hai bạn thay đổi). Vì vậy, nó có thể thấy rằng bạn đã loại bỏ dòng đầu tiên và bạn của bạn đã thêm dòng cuối cùng. Và nó có thể sử dụng thông tin đó để tạo ra phiên bản đã hợp nhất.

+0

khi đồng bộ hóa với repo từ xa trong nhật thực, tôi nhận được bó của dòng trong mã từ xa nhận được so với dòng trống duy nhất trong mã địa phương và do đó xung đột. Nhưng những dòng đó cũng hiện diện trong mã cục bộ của tôi. Không biết tại sao plugin eclipse lại so sánh nó với một dòng trống. Trong thực tế, có nhiều trường hợp như vậy trong nhiều tập tin. Tôi quay trở lại hai cách so sánh và mọi thứ bắt đầu tìm kiếm chính xác. Trước đó tôi chưa bao giờ thử hai cách so sánh. Đang đoán liệu tôi có nên giữ hai cách so sánh chế độ BẬT theo mặc định, bởi vì tôi vẫn thông qua mã trong khi giải quyết xung đột và thực hiện hợp nhất .. – Mahesha999

11

Kết hợp ba cách trong đó hai lần thay đổi thành một tệp cơ sở được hợp nhất khi chúng được áp dụng, thay vì áp dụng một, sau đó hợp nhất kết quả với nhau.

Ví dụ: có hai thay đổi trong đó một dòng được thêm vào cùng một vị trí có thể được hiểu là hai bổ sung, không thay đổi một dòng.

Ví dụ:

tệp đã được sửa đổi bởi hai người, thêm một con chuột, một con chuột thêm.

#File a 
    dog 
    cat 

#diff b, a 
    dog 
+++ mouse 
    cat 

#diff c, a 
    dog 
+++ moose 
    cat 

Bây giờ, nếu chúng ta kết hợp các changesets như chúng ta áp dụng chúng, chúng tôi sẽ nhận được (3-way merge)

#diff b and c, a 
    dog 
+++ mouse 
+++ moose 
    cat 

Nhưng nếu chúng ta áp dụng b, sau đó nhìn vào sự thay đổi từ b đến c có vẻ như chúng tôi chỉ thay đổi 'u' thành 'o' (hợp nhất 2 chiều)

#diff b, c 
    dog 
--- mouse 
+++ moose 
    cat 
47

This slide từ một bài thuyết trình cực chẳng đả là thú vị:

alt text

Logic cơ bản của một công cụ hợp nhất ba chiều rất đơn giản:

  • Hãy so sánh cơ sở, nguồn, và các tập tin mục tiêu
  • Xác định "khối" trong tệp nguồn và tệp đích:
    • Chunks rằng không phù hợp với cơ sở
    • Chunks rằng làm phù hợp với cơ sở
  • Sau đó, đặt cùng một kết quả sáp nhập bao gồm:
    • Các khối phù hợp với nhau trong tất cả 3 tệp
    • Các đoạn không khớp với cơ sở trong nguồn hoặc trong mục tiêu nhưng không nằm trong cả hai hình:
    • Các đoạn không khớp với phần gốc nhưng khớp với nhau cô ấy (tức là, họ đã được thay đổi theo cùng một cách trong cả nguồn và mục tiêu)
    • Trình giữ chỗ cho các phần xung đột, sẽ được người dùng giải quyết.

Lưu ý rằng "khối" trong hình minh họa này hoàn toàn mang tính biểu tượng. Mỗi có thể đại diện cho các dòng trong một tập tin, hoặc các nút trong một hệ thống phân cấp, hoặc thậm chí các tập tin trong một thư mục. Tất cả phụ thuộc vào những gì một công cụ hợp nhất cụ thể có khả năng.

Bạn có thể hỏi những lợi thế mà hợp nhất 3 chiều cung cấp qua kết hợp 2 chiều. Trên thực tế, không có những thứ như một sự hợp nhất hai chiều, chỉ có các công cụ khác biệt hai tệp và cho phép bạn "hợp nhất" bằng cách chọn các khối từ một tệp hoặc tệp kia.
Chỉ hợp nhất 3 chiều cho bạn khả năng biết một đoạn có phải là sự thay đổi so với nguồn gốc hay không và có thay đổi xung đột hay không.

+0

"có hay không thay đổi xung đột". - không hợp nhất 2 chiều (diff) cũng cho thấy xung đột (mặc dù thông tin bị mất do nguồn gốc của xung đột)/ – Vlad

+1

Tuy nhiên nó phổ biến trong Git để có sự hợp nhất 4 chiều nơi mà cơ sở thực sự không giống nhau. Vẫn còn một cách hợp nhất 3 chiều là tốt hơn và 2 chiều. – Wernight

+0

@Wernight, Có hợp nhất 5 chiều không? – Pacerier

14

Tôi đã viết very detailed post about it. Về cơ bản bạn không thể theo dõi xóa/thêm với hai chiều, rất, rất không hiệu quả.

+0

@pablo, Nếu tôi thêm một hàm trước X và bạn thêm một hàm khác sau X và chúng ta thực hiện một cách hợp nhất ba, công cụ sẽ ** tự động ** áp dụng cả hai thay đổi. Nhưng điều gì sẽ xảy ra khi thay đổi của tôi thực sự xung đột với thay đổi của bạn (ví dụ: mỗi người trong chúng ta tạo một hàm mới có cùng tên hàm)? Việc sáp nhập tự động được cho là biết rằng một số hợp nhất "dễ dàng nhàm chán" của chúng tôi có thể thực sự gây ra xung đột **? – Pacerier

+1

Chỉ cần đọc hướng dẫn của bạn và nó thực sự hữu ích cho tôi. Tôi cảm thấy giống như cách các nhà phát triển mà bạn mô tả. Tôi luôn sợ sự hợp nhất ba chiều. – racl101

+0

Tôi khuyên bạn nên sao chép và dán các phần của bài viết của mình. Tôi nghĩ rằng điều này sẽ giúp bạn đạt được upvotes và sẽ phù hợp hơn với triết lý của stackoverflow. – Samuel

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