2012-08-22 32 views
9

Tôi đã gặp khó khăn trong công việc (như được trình bày trong bản phác thảo đơn giản dưới đây). Trong quá trình tạo nhánh, mặc định vì một lý do nào đó đã bị mắc kẹt với tư cách là cha mẹ với một nhánh, nhưng vẫn giữ một nhánh mặc định riêng biệt (đó là nhánh mặc định mà chúng ta đang sử dụng trong tương lai). Điều này đã để lại cho chúng tôi hai nhánh mặc định.Bị kẹt với hai nhánh mặc định trong Mercurial sau khi chi nhánh bị hỏng cam kết

Ai đó nhầm lẫn cách thực hiện thay đổi trước khi phân nhánh, vì vậy, chúng tôi đã kết hợp các thay đổi được thực hiện trong branch1 vào branch2.

Tôi đã xem xét Mercurial: the definitive guide để xem đây có phải là sự cố có thể giải quyết hay không, nhưng không thể tìm ra lệnh nào liên quan đến việc hoàn tác hoặc đóng sẽ giúp ích. Cách dễ nhất là nếu nó bằng cách nào đó có thể đổi tên nhánh mặc định còn lại.

Cách tốt nhất và/hoặc dễ nhất để giải quyết vấn đề này là gì?

Tôi đang chuẩn bị hợp nhất các chi nhánh phát triển vào nhánh mặc định chính xác và muốn khắc phục vấn đề này trước khi bắt đầu bất kỳ sự hợp nhất nào có thể gây khó khăn hơn trong việc khắc phục điều này trong tương lai.

branch problems

Trả lời

7

Hãy nhớ rằng tên chi nhánh chỉ là nhãn đặt trên các cam kết - không có gì thực sự phá vỡ về đồ thị của bạn là. Tên chi nhánh không ảnh hưởng đến những gì xảy ra khi bạn hợp nhất, chỉ nội dung tệp quan trọng khi hợp nhất.

Điều đó đang được nói, bạn có thể đóng đầu thêm vào default, là dưới branch1:

$ hg update "min(heads(branch(default)))" 
$ hg commit --close-branch -m "closing this head" 

Đó sẽ để lại một changeset gần lơ lửng trong đồ thị của bạn, mà là tốt. Thay đổi gần sẽ ẩn đầu từ hg heads và các lệnh như hg merge sau đó sẽ không còn đề xuất hợp nhất với đầu này nữa.

+0

Tôi nghĩ nó đã được sắp xếp. Bạn có kinh nghiệm với 'hg rebase' và/hoặc' hg strip'? Điều gì là tốt đẹp là có branch1 và branch2 là một nhánh. branch2 về cơ bản là những thay đổi được thực hiện trong branch1 nhưng không có sự bao gồm của nhánh mặc định. – Patrick

+0

Tôi thấy bây giờ, sau khi đọc tài liệu về rebase và dải, rằng những người thường chỉ được sử dụng trên các cam kết không được đẩy hoặc chia sẻ với kho lưu trữ. – Patrick

+0

@ Patrick: bạn chính xác về việc rebase và strip: nếu bạn đã đẩy các thay đổi ở một nơi khác, thì cả hai lệnh sẽ không hiệu quả. Không có gì sẽ phá vỡ, nhưng bạn sẽ thấy rằng bạn nhận được các changesets ban đầu khi bạn kéo từ máy chủ. Điều đó phủ nhận hiệu ứng của lệnh (đối với 'hg strip') hoặc trông lộn xộn (đối với' hg rebase'). –

2

Câu hỏi cũ, nhưng tôi cho rằng điều này có thể hữu ích đối với một người nào đó.

.. điều này xảy ra khi một nhánh tách ra, thường là khi ai đó thực hiện hg push -f thay vì kéo và cập nhật. Trong trường hợp của bạn, cái đầu bị ép cũng xảy ra trên một nhánh khác, nhưng điều này cũng có thể xảy ra trên một nhánh đơn. Giải pháp của tôi là để cho nó ngồi cho đến khi các nhánh được sát nhập - ít nhất, nếu có một kế hoạch hợp nhất chúng tại một số điểm. Giải pháp này là sạch hơn so với đóng đầu sai lầm, theo ý kiến ​​của tôi.

Tuy nhiên, thực hiện hg update default sẽ đưa bạn đến cam kết mới nhất với tên 'mặc định'. Mặc dù tôi nghĩ ý tưởng này là đúng trong trường hợp của bạn, điều này là do "mặc định" mà bạn thực sự muốn là cam kết mới nhất với tên nhánh "mặc định", vì vậy sẽ không có vấn đề gì. Tuy nhiên, nếu đầu sai lầm mới hơn, hg update default sẽ đưa mọi người đến đầu sai lầm, điều này có thể khá khó hiểu.

Trong cả hai trường hợp, điều này sẽ giải quyết vấn đề:

hg update <revision number of correct 'default' head> 
hg merge <branch the erroneous 'default' head is on> 

Vì vậy, trong trường hợp này, hg update default sẽ cập nhật để người đứng đầu sai lầm:

1-2(default) 
\ 
    3(default)-4(branch1) 

Bạn sẽ cần phải làm:

hg update 2 
hg merge branch1 
# results in this graph: 
# 1-2---5(default) 
# \ /
# 3-4(branch1) 

trong khi bên dưới, hg update default sẽ cập nhật thành hành động bạn thực hiện ually muốn anyways:

1-2------------5(default) 
\ 
    3(default)-4(branch1) 

..và bạn chỉ có thể bỏ qua mặc định sai, vì nó sẽ không ảnh hưởng đến bất kỳ ai. .. sau đó, một khi ai đó làm một hg update default; hg merge branch1, đầu sai lầm sẽ âm thầm biến mất, bởi vì tại thời điểm đó nó là tổ tiên của 'mặc định' sai. đồi khế, đồi sẽ cho kết quả trong một cái gì đó như thế này:

1-2-5----------11(default) 
\   /
    3-4-[...]-10(branch1) 

..you cũng có thể làm một vô dụng cam kết về mặc định mong muốn của bạn, và sau đó nó sẽ là mới nhất, và nó sẽ là một trong những người nhận được khi họ làm hg update default, nhưng tôi không thực sự thích có các cam kết rác trong lịch sử.

+0

Tôi đã tự hỏi tại sao tôi có 2 nhánh mặc định và thực sự trả lời câu hỏi của tôi. Tôi đã phải hợp nhất nhưng nó không phải là một lựa chọn dễ dàng vì người ép buộc cam kết, tránh nó, và những thay đổi của tôi bị ghi đè –

+0

Vâng, tình trạng này gần như chắc chắn là do ai đó không muốn tích hợp với công việc của người khác. Ép buộc là đẩy công việc lên người khác. –

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