2012-03-07 32 views
97

Gần đây đã có một số câu hỏi về việc bỏ qua các thay đổi khi duy trì các nhánh phát hành trong Mercurial. Ví dụ:Hậu quả của việc sử dụng ghép trong Mercurial

Kể từ khi nó được giới thiệu vào 2.0, tôi đã băn khoăn về việc sử dụng graft để tránh vấn đề này. Với cây bản sửa đổi như thế này:

A---B---C---D---E---F---G---H---I---J 

Giả sử chúng ta cần tạo nhánh phát hành bỏ qua thay đổi Evil E.

hg update -r D 
hg graft "F::J" 

cho chúng tôi:

A---B---C---D---E---F---G---H---I---J 
      \ 
       --F'--G'--H'--I'--J' 
  • Q1: Chuyện gì vừa xảy ra ở đây? Tôi có thể hiểu rằng transplant có thể đã tạo các bản vá lỗi ra khỏi F::J và sau đó áp dụng chúng trên D, nhưng graft được cho là sử dụng kết hợp 3 chiều thay vì bản vá. Vậy làm thế nào mà làm việc? Tại sao nó tốt hơn?

Cho phép nói bây giờ tôi sửa lỗi E và hợp nhất vào nhánh phát hành của tôi.

    --E2----------------- 
       /     \ 
A---B---C---D---E---F---G---H---I---J---M1 
      \       \ 
       --F'--G'--H'--I'--J'---------M2-- 

M1 là hợp nhất thẳng; không có gì đặc biệt ở đó. M2 đang hợp nhất các chi nhánh có thay đổi "giống nhau" (hoặc ít nhất là tương đương).

  • Q2: Liệu merge này chỉ là một bình thường 3-way merge sử dụng D, J'M1?
  • Q3: Đã lưu trữ/sử dụng thông tin bổ sung về hoạt động ghép để giúp hợp nhất không?

Và cuối cùng ...

  • Q4: những vấn đề tiềm năng với một dòng chảy như thế này là gì?

Trả lời

118

Khi bạn cập nhật thành D và ghép F::J, Mercurial chạy một số lần hợp nhất.Nó sẽ bắt đầu với merge này:

M = three_way_merge(local=D, other=F, base=E) 

Nếu chúng ta viết +d cho vùng đồng bằng giữa các bang CD, sau đó chúng tôi bắt đầu với:

 +d  +e  +f 
---- C ---- D ---- E ---- F ---- 

Rẽ đồ thị 90 độ theo chiều kim đồng và trên ba hợp nhất-đường trông giống như sau:

-e 
    .---- D 
/
E 
\ 
    '---- F 
    +f 

Tức là, chúng tôi giả vờ rằng chúng tôi bắt đầu với E và áp dụng thứ e đối diện với số -e để đến D. Tôi nghĩ là bản vá ngược của +e. Bắt đầu từ E, chúng tôi cũng đã đến trạng thái F với delta bình thường +f. Không có gì lạ ở đây - chúng tôi có tất cả các tiểu bang (D, EF) trong kho lưu trữ rồi. Vì vậy, nhìn thấy như thế này, rõ ràng là chúng tôi có thể hợp nhất DF.

Việc hợp nhất là vấn đề "hoàn thành kim cương". Vì vậy, chúng ta thấy một trạng thái mới M đó là một kết hợp của DF và nơi sự khác biệt D-M cũng tương tự như +f và sự khác biệt F-M cũng tương tự như -e. Nó trông giống như thế này:

-e  +f' 
    .---- D ----. 
/   \ 
E    M 
\   /
    '---- F ----' 
    +f  -e' 

Đồng bằng +f trở thành +f' và vùng đồng bằng -e trở thành -e'. Đây chỉ là một cách hợp nhất ba chiều bình thường, nhưng hiệu quả là thú vị: chúng tôi đã áp dụng F lên D thay vì E!

Sau khi hợp nhất, công ty mẹ thứ hai của M-F được giảm:

-e  +f' 
    .---- D ----. 
/   \ 
E    M 
\ 
    '---- F 
    +f 

Để nhắc lại: Chúng tôi đã copy "hiệu ứng" của F vào D, có nghĩa là, chúng ta đã tìm thấy một đồng bằng (+f') áp dụng cho D có cùng tác dụng như khi +f được áp dụng cho E. Chúng ta có thể thẳng đồ thị một chút để có được:

 +f' 
--- D ---- M 
    \ 
     '---- E ---- F 
     +e  +f 

Kết quả là F được ghép vào D sử dụng máy móc thiết bị ba chiều đầy đủ.

  • Q1: gì vừa xảy ra ở đây? Vậy làm thế nào mà làm việc? Tại sao nó tốt hơn?

    A1: Sử dụng kết hợp tốt hơn bản vá vì máy móc hợp nhất có những thứ như đổi tên thành tài khoản.

  • Q2: Việc hợp nhất này có phải là sự hợp nhất 3 chiều bình thường sử dụng D, J 'và M1 không?

    A2: Có, ghép không làm thay đổi cấu trúc liên kết của biểu đồ.

  • Q3: Thông tin bổ sung được lưu trữ/sử dụng có liên quan đến hoạt động ghép để giúp hợp nhất không?

    A3: số

  • Q4: các vấn đề tiềm năng với một dòng chảy như thế này là gì?

    A4: Từ phối cảnh hợp nhất, nó sẽ hoạt động tốt. Nó sẽ lặp lại một số lịch sử có thể gây nhầm lẫn cho mọi người.

+4

Câu hỏi hay, câu trả lời tuyệt vời :). +1 cho cả hai! –

+0

Cảm ơn Martin. Đó là một số suy nghĩ khá sôi nổi bởi bất cứ ai đến với điều đó. Tôi đã có ý tưởng, nhưng cần phải tìm ra trường hợp chung. Tôi đoán nó giữ không có vấn đề con đường giữa các nút bạn ghép vào/từ? –

+3

@PaulS: Tôi nghĩ tất cả những gì bạn cần biết là ghép có thể sao chép các thay đổi xung quanh theo một cách mạnh mẽ hơn so với cấy ghép. Mạnh mẽ theo nghĩa là đổi tên được xử lý và bạn có thể giải quyết xung đột trong công cụ hợp nhất. Các chi tiết trong sự hợp nhất kỳ lạ, nhưng đó là hy vọng không cần thiết để hiểu cho việc sử dụng hàng ngày của ghép! :-) –

6

Q1: Nó giúp khi có xung đột. Bạn có thể sử dụng công cụ hợp nhất thông thường của bạn sau đó (đối với tôi đó là các dấu xung đột nội tuyến, mà tôi chỉnh sửa với chế độ smerge của Emacs).

Q2: Đây là sự hợp nhất bình thường.

Q3: số

Q4: Tôi nghĩ rằng thật xấu xí khi có hai nhánh gần như giống nhau.

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