Hậu quả của việc sử dụng ghép trong Mercurial


98

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ụ:

Kể từ khi nó được giới thiệu trong 2.0, tôi đã băn khoăn về việc sử dụng graftđể tránh vấn đề này. Đưa ra một cây 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 một nhánh phát hành bỏ qua thay đổi Ác ma 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 điều đó transplantsẽ tạo ra các bản vá lỗi F::Jvà sau đó áp dụng chúng vào D, nhưng graftđược cho là sử dụng hợp nhất 3 chiều chứ không phải các bản vá lỗi. Vậy làm thế nào mà làm việc? Tại sao nó tốt hơn?

Giả sử bây giờ tôi đã sửa Evà hợp nhất nó 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à một hợp nhất thẳng; không có gì đặc biệt ở đó. M2 đang hợp nhất các nhánh có cá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?
  • Câu hỏi 3: Thương mại có 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 với một dòng chảy như thế này là gì?

Câu trả lời:


119

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

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

Nếu chúng ta viết +dcho vùng đồng bằng giữa các tiểu bang CD, thì chúng ta bắt đầu với:

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

Xoay biểu đồ 90 độ theo chiều kim đồng hồ và hợp nhất ba chiều ở trên trông giống như sau:

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

Đó là, chúng tôi giả vờ rằng chúng tôi bắt đầu với Evà áp dụng ngược lại với -eđể đạt được D. Tôi nghĩ về như một bản vá ngược của +e. Bắt đầu từ Echúng tôi cũng đi đến tiểu bang Fvới vùng đồng bằng bình thường +f. Không có gì lạ ở đây - chúng tôi có tất cả các bang ( D, EF) trong kho rồi. Vì vậy, nhìn thấy như thế này, rõ ràng là chúng ta có thể hợp nhất DF.

Sáp nhập là vấn đề “hoàn kim”. Vì vậy, chúng tôi tìm thấy một trạng thái mới Mlà sự kết hợp của DFvà nơi mà sự khác biệt từ Dđến Mtương tự với +fvà sự khác biệt từ Fđến Mlà tương tự với -e. Nó trông như thế này:

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

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

Sau khi hợp nhất, cấp độ gốc thứ hai của Mto Fbị xóa:

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

Để nhắc lại: Chúng tôi đã sao chép "effect" của Fon D, tức là chúng tôi đã tìm thấy một delta ( +f') được áp dụng để Dcung cấp hiệu ứng giống như khi +fđược áp dụng cho E. Chúng ta có thể làm thẳng biểu đồ một chút để có:

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

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

  • Q1: Chuyện 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 hợp nhất tốt hơn các bản vá vì bộ máy hợp nhất tính đến những thứ như đổi tên.

  • Câu hỏi 2: Việc hợp nhất này chỉ là hợp nhất 3 chiều thông thường sử dụng D, J 'và M1?

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

  • Câu hỏi 3: Thương mại có 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?

    A3: Không.

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

    A4: Từ quan điểm hợp nhất, nó sẽ hoạt động ổn. Nó sẽ trùng lặp 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 hay :). +1 cho cả hai!
Laurens Holst

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

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 bộ thay đổi xung quanh một cách mạnh mẽ hơn so với ghép. Mạnh mẽ theo nghĩa là việc đổi tên được xử lý và bạn có thể giải quyết xung đột trong một công cụ hợp nhất. Các chi tiết nằm trong cách ghép kỳ lạ mà nó có, nhưng hy vọng điều đó không cần thiết để hiểu đối với việc sử dụng ghép hàng ngày! :-)
Martin Geisler

3
Không, nhưng tôi là một kẻ dở hơi vì cố gắng hiểu những thứ tôi không cần ;-) Tôi đã làm việc thông qua một ví dụ tổng quát hơn bằng cách sử dụng cái của bạn làm cơ sở.
Paul S

@PaulS Nếu vậy, tôi gần như ngại đề cập đến vấn đề này với bạn ... nhưng bạn có thể tra cứu Darcs và lý thuyết vá lỗi của nó. Mẹo ở trên về việc xoay biểu đồ 90 độ nhắc nhở tôi rất nhiều về cách họ nói về các bản vá lỗi đi làm khi hợp nhất. Khá thứ lông :-)
Martin Geisler

6

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

Câu hỏi 2: Đó là một hợp nhất bình thường.

Q3: Không.

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

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.