2012-08-30 32 views
29

Cho phép nói rằng chúng tôi có hai chi nhánh (BC) đã phân tách từ tổ tiên chung A. Sẽ hợp nhất từ ​​B đến C cho kết quả tương tự như hợp nhất từ ​​C đến B?Việc hợp nhất trong Git có đối xứng không?

A 
    | 
/\ 
B C 

Để làm rõ- Tôi giả định rằng mọi độ phân giải xung đột hợp nhất thủ công sẽ diễn ra theo cả hai hướng. Nhưng sẽ có sự kết hợp tự động nào xảy ra trong cùng một mã được chọn không? Đây là những gì tôi giả định, kể từ ngày cam kết là giống hệt nhau trong cả hai hướng.

Để làm rõ thêm - Tôi biết rằng kết quả hợp nhất thực tế trong "hình ảnh phản chiếu" của nhau dựa trên hướng. Tôi chỉ hỏi về các xung đột được giải quyết tự động.

+0

Trên một lưu ý liên quan, bạn có thể tìm thấy chuỗi ba năm nay từ danh sách gửi thư Git liên quan, liên quan đến cách thức Git ghi lại các kết hợp nhạy cảm với "hướng" của hợp nhất: http: // thread .gmane.org/gmane.comp.version-control.git/127361 – seh

Trả lời

20

Câu trả lời là có cho các lần hợp nhất mặc định. Một cách hợp nhất ba chiều tìm thấy một tổ tiên chung và sau đó áp dụng sự khác biệt từ cả hai bên, một thao tác không phụ thuộc vào thứ tự. Chủ đề hợp nhất đặt hàng và commutativity tạo ra một cuộc thảo luận hấp dẫn trên git list (nếu bạn đang vào loại điều đó, đó là). Lưu ý B into CC into B phải đối xứng, nhưng điều này không nhất thiết phải được nói cho (B into C) into A so với B into (C into A).


Để xây dựng hơn một chút, dựa trên nhận xét của Vince dưới đây và comment seh về câu hỏi, sẽ có hai sự khác biệt đáng chú ý giữa B into CC into B, không phải trong đó ảnh hưởng đến độ phân giải merge tự động tham chiếu trong câu hỏi.

Trước tiên, lịch sử sẽ khác. Cha mẹ của cam kết hợp nhất sẽ thay đổi tùy thuộc vào thứ tự hợp nhất. Đối với những ví dụ này, tôi sẽ sử dụng "first_branch" và "second_branch", vì vậy tôi có thể đặt trước các chữ cái để biểu diễn các cam kết.

git checkout first_branch && git merge second_branch 

E <- merge commit 
|\ 
| D <- second_branch's tip 
| | 
| C <- another commit on second_branch 
| | 
| B <- and another 
|/ 
A <- first_branch's tip before the merge 

Trong trường hợp này, "cha mẹ đầu tiên" của E, E^1, là mẹo đầu tiên trước khi hợp nhất. second_branch là "cha mẹ thứ hai" của cam kết hợp nhất, aka E^2. Bây giờ hãy xem xét điều ngược lại:

git checkout second_branch && git merge first_branch 

E <- merge commit 
|\ 
| D <- first_branch's tip 
| | 
| C <- another commit on first_branch 
| | 
| B <- and another 
|/ 
A <- second_branch's tip before the merge 

Cha mẹ bị đảo ngược. E^1 là mẹo của second_branch trước khi hợp nhất. E^2 là mẹo của first_branch.

Thứ hai, thứ tự hiển thị xung đột sẽ đảo ngược.Trong trường hợp đầu tiên, một cuộc xung đột có thể trông như thế này:

<<<<<<< HEAD 
This line was added from the first_branch branch. 
======= 
This line was added from the second_branch branch. 
>>>>>>> second_branch 

Trong trường hợp thứ hai, cuộc xung đột tương tự sẽ trông như thế này:

<<<<<<< HEAD 
This line was added from the second_branch branch. 
======= 
This line was added from the first_branch branch. 
>>>>>>> first_branch 

Cả những khác biệt này ảnh hưởng đến độ phân giải merge tự động, nhưng họ xuất hiện khi bạn đảo ngược thứ tự hợp nhất ba chiều.

+0

Bạn có nhớ cung cấp một ví dụ ngắn hay không, nếu bạn đã thử nghiệm nó. Tôi có nghĩa là tôi tò mò, nếu bạn chỉ cần hợp nhất mà không cung cấp bất kỳ chiến lược hợp nhất/tùy chọn nhưng buộc tự động hợp nhất (nếu có thể), nếu có một cuộc xung đột trên một dòng? bạn sẽ có: '<<<<<<< của bạn: sample.txt Giải quyết xung đột là khó khăn; chúng ta hãy đi mua sắm. ======= Git giúp giải quyết xung đột dễ dàng. >>>>>>> của họ: sample.txt'? hoặc bạn sẽ chọn một trong số họ và cái nào? – Vince

+0

@Vince Thứ tự quan trọng đối với lịch sử và cách thức những xung đột được trình bày, nhưng kết quả phân giải kết hợp tự động sẽ giống nhau. Tôi đã chỉnh sửa chi tiết hơn và một vài ví dụ. – Christopher

+0

Bài đăng của Hamano trong cuộc thảo luận liên quan đến trong câu trả lời này là phải đọc http://thread.gmane.org/gmane.comp.version-control.git/107737/focus=107895 - không chắc chắn nó cung cấp câu trả lời cho câu hỏi mặc dù –

0

không, tôi nghĩ nó sẽ không đối xứng. Trước tiên, bạn có thể đặt tùy chọn chiến lược hợp nhất, đặc biệt trong trường hợp của bạn là theirs hoặc ours xác định xem B hoặc C sẽ được chọn hay không. Trong các hợp nhất tự động, tôi nghĩ ví dụ nhánh từ xa có ưu tiên hơn các thay đổi của bạn nếu bạn đang hợp nhất vào các thay đổi của mình để có nghĩa là gọi git merge C từ B sẽ dẫn đến thay đổi C được chọn. Tôi không chắc chắn 100%, vì vậy bạn có thể tự mình thử và cho chúng tôi biết.

+0

lệnh để đặt tùy chọn chiến lược: 'git merge -s -X

+0

một số trang tham chiếu: http://www.kernel.org/ pub/software/scm/git/docs/git-merge.html – Vince

2

Điều đó tùy thuộc vào ý bạn của "kết quả tương tự". Từ một phối cảnh nội dung, giả định rằng không có xung đột hoặc tất cả các xung đột hiện có được giải quyết tỉ mỉ theo cùng một cách, nội dung của cam kết hợp nhất mới sẽ giống nhau.

Tuy nhiên, từ quan điểm tô pô lịch sử, hai điểm này rất khác nhau. Nếu bạn đang ở trên nhánh B và hợp nhất trong C, HEAD của B di chuyển để trỏ đến cam kết hợp nhất, nhưng C vẫn ở vị trí của nó. Ngược lại, nếu bạn đang ở trên C và hợp nhất trong B, C di chuyển HEAD, trong khi B vẫn ở đó. Vì vậy, cấu trúc liên kết cuối cùng là rất khác nhau, có ý nghĩa cho sự phát triển trong tương lai trên một trong hai nhánh, mặc dù nội dung của cam kết mới là giống nhau trong cả hai trường hợp.

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