Tại sao hợp nhất 3 chiều có lợi hơn so với hợp nhất 2 chiều?


165

Wikipedia cho biết hợp nhất 3 chiều ít xảy ra 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?

Một ví dụ khi hợp nhất 3 chiều thành công và hợp nhất 2 chiều không thành công sẽ hữu ích.

Câu trả lời:


259

Giả sử bạn và bạn của bạn đều kiểm tra một 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 ở đầu và bạn của bạn đã thêm một dòng ở cuối. Sau đó, anh ấy đã cam kết tập tin của mình và bạn cần hợp nhất các thay đổi của anh ấy 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à diff), công cụ có thể so sánh hai tệp và thấy rằng dòng đầu tiên và dòng cuối cùng khác nhau. Nhưng làm thế nào nó biết phải làm gì với sự khác biệt? Phiên bản hợp nhất có nên bao gồm dòng đầu tiên? Có nên bao gồm dòng cuối cùng?

Với sự 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 sao gốc (trước khi một trong hai bạn thay đổi nó). Vì vậy, có thể thấy rằng bạn đã xóa 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 đó để sản xuất phiên bản hợp nhất.


"Nhưng làm thế nào nó biết phải làm gì với sự khác biệt?" Không có được nó. Nếu nó đã có thể thấy sự khác biệt giữa hai tệp (không tham chiếu đến bản gốc), tại sao nó không thể áp dụng cả hai thay đổi theo thứ tự tăng dần theo dấu thời gian của tệp? Đó là: Nó bắt đầu với bản sao đã cam kết của bạn tôi, coi nó là bản gốc (mới) (với phần bổ sung dòng ở trên cùng) và sau đó, trên đầu trang, áp dụng các thay đổi cục bộ của tôi (xóa dòng tại bippi).
Harry

7
@Harry Nói bản gốc có ba dòng (ABC). Nó bắt đầu với bản sao của bạn tôi (ABCD) và so sánh nó với bản sao của tôi (BC). Không nhìn thấy bản gốc, nó có thể nghĩ rằng tôi đã loại bỏ cả A và D, và kết quả cuối cùng sẽ là BC.
JW.

80

Slide này từ một bài thuyết trình về lực lượng rất thú vị:

hình ảnh trượt

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

  • So sánh các tệp cơ sở, nguồn và đích
  • Xác định "khối" trong tệp tệp nguồn và tệp đích:
    • Chun không phù hợp với cơ sở
    • Chun mà phù hợp với cơ sở
  • Sau đó, kết hợp một kết quả hợp nhất bao gồm:
    • Các khối khớp với nhau trong cả 3 tệp
    • Các khối không khớp với cơ sở trong nguồn hoặc trong mục tiêu nhưng không phải trong cả hai
    • Các khối không khớp với cơ sở nhưng khớp với nhau (nghĩa là chúng đã được thay đổi theo cùng một cách trong cả nguồn và đích)
    • Giữ chỗ cho các khối xung đột, được giải quyết bởi người dùng.

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 tệp có thể biểu diễn các dòng trong một tệp hoặc các nút trong cấu trúc phân cấp hoặc thậm chí các tệp 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 lợi thế của việc hợp nhất 3 chiều so với hợp nhất 2 chiều. Trên thực tế, không có thứ gọi là hợp nhất hai chiều, chỉ có các công cụ khác hai tệp và cho phép bạn "hợp nhất" bằng cách chọn các đoạn từ tệp này hay tệp kia.
Chỉ hợp nhất 3 chiều cung cấp cho bạn khả năng biết liệu một đoạn có phải là thay đổi từ nguồn gốc hay không và có thay đổi xung đột hay không.


"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, điều phổ biến ở Git là hợp nhất 4 chiều trong đó cơ sở thực sự không giống nhau. Vẫn là hợp nhất 3 chiều là tốt hơn và 2 chiều.
Wernight

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

@Pacerier Không phải tôi biết, nhưng đó là những gì đang thực sự xảy ra trong một lần git cherry-pick, hoặc rebase.
Wernight

Giải thích rất chi tiết và hữu ích
Kaneg

20

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


@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 tôi thực hiện hợp nhất ba cách, công cụ sẽ tự động áp dụng cả hai thay đổi. Nhưng điều gì xảy ra khi thay đổi của tôi thực sự mâu thuẫn với thay đổi của bạn (ví dụ: mỗi người trong chúng ta tạo ra một chức năng mới có cùng tên chức năng)? Làm thế nào để 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 thực sự có thể gây ra một cuộc 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ác nhà phát triển mà bạn mô tả. Tôi luôn lo sợ sự hợp nhất ba chiều.
racl101

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

Bài báo hay. Tôi đã từng thích sử dụng các bản vá để rebase khi bạn thấy nhiều ngữ cảnh hơn và có thể sử dụng trình soạn thảo và môi trường của bạn để kiểm tra mọi thứ, mặc dù vậy, có quá nhiều cách thủ công các công cụ dễ dàng theo cách đó. Thật xấu hổ vì không có cách nào hay để kết hợp những phần tốt của cả hai
JonnyRaa

20

Hợp nhất ba cách trong đó hai thay đổi cho một tệp cơ sở được hợp nhất khi chúng được áp dụng, trái ngược với áp dụng một, sau đó hợp nhất kết quả với tệp kia.

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 phải là thay đổi của một dòng.

Ví dụ

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

#File a
    dog
    cat

#diff b, a
    dog
+++ mouse
    cat

#diff c, a
    dog
+++ moose
    cat

Bây giờ, nếu chúng ta hợp nhất các thay đổi khi chúng ta áp dụng chúng, chúng ta sẽ nhận được (hợp nhất 3 chiều)

#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 sang c thì sẽ giống như chúng ta chỉ thay đổi một 'u' thành 'o' (hợp nhất 2 chiều)

    #diff b, c
    dog
--- mouse
+++ moose
    cat
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.