2010-07-09 23 views
8

Mercurial có luôn sử dụng các công cụ hợp nhất bên ngoài khi hai nhánh đang hợp nhất có thay đổi cho cùng một tệp không?Công cụ Mercurial và merge?

Hoặc trước tiên liệu đầu tiên có xem liệu nó có thể hợp nhất chính tệp đó và chỉ punting với công cụ bên ngoài nếu nó không thể?

Lý do tôi hỏi là tôi (một lần nữa) đọc lại tutorial written by Joel Spolsky on Mercurial và có một điều ông nói, khi so sánh như thế nào Subversion và Mercurial được sáp nhập là:

Ngược lại, trong khi chúng tôi đã làm việc riêng biệt trong Mercurial, Mercurial bận rộn giữ một loạt các changesets. Và vì vậy, khi chúng tôi muốn kết hợp mã của chúng tôi với nhau, Mercurial thực sự có nhiều thông tin hơn: nó biết những gì mỗi chúng ta thay đổi và có thể áp dụng lại những thay đổi đó, thay vì chỉ nhìn vào sản phẩm cuối cùng và cố gắng đoán cách đặt cùng với nhau.

Chỉ, trải nghiệm của tôi cho tôi biết rằng dường như nó liên quan đến công cụ hợp nhất bên ngoài khi hai chi nhánh có thay đổi đối với cùng một tệp. Và do đó, không phải là làm cho đối số trên không chính xác?

Hoặc tôi nên giải thích điều này như sau:

  • Subversion chỉ kết hợp các trạng thái cuối cùng của hai chi nhánh, và có nhiều việc phải làm trong một đơn vị duy nhất
  • Mercurial kết hợp mỗi changeset cá nhân, cho phép nó hoạt động với các đơn vị thay đổi nhỏ hơn, với cơ hội hợp nhất thành công cao hơn

Ai đó có thể làm sáng tỏ điều này?


Sửa: Hãy để tôi đưa ra một ví dụ:

@echo off 

setlocal 

if exist repo rd /s /q repo 

md repo 
cd repo 
hg init . 

rem --- version 0 --- 
echo 1 >test.txt 
echo 2 >>test.txt 
echo 3 >>test.txt 
echo 4 >>test.txt 
echo 5 >>test.txt 
hg add test.txt 
hg commit -m "v0" 

rem --- version 1 --- 
echo 1 >test.txt 
echo 2 v1 >>test.txt 
echo 3 >>test.txt 
echo 4 >>test.txt 
echo 5 >>test.txt 
hg commit -m "v1" 

rem --- version 2 --- 
hg update 0 
echo 1 >test.txt 
echo 2 >>test.txt 
echo 3 >>test.txt 
echo 4 v2 >>test.txt 
echo 5 >>test.txt 
hg commit -m "v2" 

rem --- merge --- 
hg update 1 
hg merge 2 

đầu tiên này tạo ra một tập tin với nội dung sau:

1 
2 
3 
4 
5 

Sau đó, nó thay đổi nó để:

1 
2 v1 
3 
4 
5 

Sau đó, nó quay trở lại phiên bản ban đầu (changeset), và thay đổi nó thành:

1 
2 
3 
4 v2 
5 

Sau đó, nó cố gắng hợp nhất hai.

Bây giờ, theo câu trả lời duy nhất (hiện tại), điều này không nên đặt ra vấn đề, vì những thay đổi không xung đột.

Tuy nhiên, tại thời điểm này, Ngoài So sánh (công cụ hợp nhất bên ngoài của tôi) được gọi.

Trả lời

3

Bộ công cụ được gọi chỉ trong trường hợp có xung đột cần được giải quyết. Các thay đổi đối với cùng một tệp trong các nhánh khác nhau cấu thành một xung đột như vậy.

Ngoài ra, thuật toán hợp nhất thực tế không thay đổi dựa trên, nó dựa trên tệp để cho phép kết quả hợp nhất tốt nhất. Xem Mercurial Wiki để biết thêm chi tiết.

Mercurial lá hợp nhất của bạn uncomitted, vì vậy bạn có cơ hội để kiểm tra mã của bạn trước khi comitting các changeset hợp nhất.

+0

Vui lòng xem câu hỏi đã chỉnh sửa của tôi –

+0

Xin lỗi, tôi đã chỉnh sửa trong khi bạn cũng vậy. Nên rõ ràng hơn bây giờ. Các tiêu chí cho lời gọi mergetool là những thay đổi đối với cùng một tệp, điều này hoàn toàn hợp lý. –

6

Sự khác biệt lớn giữa sáp nhập và sáp nhập svn là thuật toán hợp nhất mercurial có quyền truy cập vào tổ tiên chung cuối cùng giữa hai sửa đổi được sáp nhập. Nếu lịch sử của bạn trông giống như

A--B 
\-C 

svn sẽ biến công cụ hợp nhất của bạn bị mất trên B và C. Mercurial sẽ khởi chạy công cụ của bạn với A, B và C và một số công cụ làm tốt hơn.

Mercurial thực hiện hợp nhất nội bộ của riêng mình trước khi khởi chạy công cụ của bạn, nơi nó sử dụng A, B và C để tạo một số lựa chọn hiển nhiên. Bạn có thể tắt tính năng này bằng cách thay đổi cài đặt premerge cho một công cụ.

Thử nghiệm của bạn không mang lại kết quả tuyệt vời vì bạn đang hợp nhất 2 với tổ tiên của riêng nó. Nếu thay vào đó bạn làm một hg update 0 trước khi tạo changeset 2, vì vậy bạn có một lịch sử phân nhánh thực tế như thế này:

@ changeset: 2:790856e061f4 
| tag:   tip 
| parent:  0:bfba1d8f77af 
| user:  Ry4an Brase 
| date:  Fri Jul 09 16:50:34 2010 -0500 
| summary:  added v2 
| 
| @ changeset: 1:7a9c581561b6 
|/ user:  Ry4an Brase 
| date:  Fri Jul 09 16:50:16 2010 -0500 
| summary:  added v1 
| 
o changeset: 0:bfba1d8f77af 
    user:  Ry4an Brase 
    date:  Fri Jul 09 16:49:29 2010 -0500 
    summary:  first 

sau đó khi bạn hg merge bạn sẽ nhận được:

1 
2 v1 
3 
4 v2 
5 

mà không ra mắt công cụ hợp nhất của bạn.

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