Làm thế nào để đóng chính xác một nhánh tính năng trong Mercurial?


240

Tôi đã hoàn thành công việc trên một nhánh tính năng feature-x. Tôi muốn hợp nhất các kết quả trở lại defaultchi nhánh và đóng feature-xđể loại bỏ nó trong đầu ra của hg branches.

Tôi đã đưa ra kịch bản sau đây, nhưng nó có một số vấn đề:

$ hg up default
$ hg merge feature-x
$ hg ci -m merge
$ hg up feature-x
$ hg ci -m 'Closed branch feature-x' --close-branch

Vì vậy, feature-xnhánh (changests 40- 41) đã bị đóng, nhưng có một đầu mới , thay đổi nhánh đóng 44, sẽ được liệt kê hg headsmỗi lần:

$ hg log ...
o  44 Closed branch feature-x
|
| @  43 merge
|/|
| o  42 Changeset C
| |
o |  41 Changeset 2
| |
o |  40 Changeset 1
|/
o  39 Changeset B
|
o  38 Changeset A
|

Cập nhật : Dường như phiên bản 1.5 Mercurial không hiển thị phần đầu của các nhánh đóng trong đầu ra của hg headsnữa.

Có thể đóng một chi nhánh sáp nhập mà không để lại một đầu nữa không? Có cách nào chính xác hơn để đóng một nhánh tính năng?

Câu hỏi liên quan:


@Andrey: nhưng bài báo đã chỉ ra KHÔNG chỉ nói về "- chi nhánh". Nó cho thấy bốn cách để cắt tỉa chi nhánh của bạn. Nếu bạn thực sự không muốn nó nữa, bạn có thể sao chép như được giải thích trong bài viết. "Vấn đề" duy nhất là nếu vì bất kỳ lý do gì bạn muốn đóng nó, nhưng hãy giữ nó xung quanh.
Cú phápT3rr0r

1
@WizardOfOdds Vâng, tôi đã đọc toàn bộ bài viết về việc tỉa cành chết. Tôi muốn chi nhánh ở lại trong lịch sử sửa đổi, không phải vứt nó đi. Trước đây tôi chỉ hợp nhất các nhánh tính năng vào defaultmà không "đóng" chúng. Nó dẫn đến 0 đầu mới nhưng các nhánh như vậy có thể nhìn thấy hg branchesmãi mãi (như các nhánh không hoạt động).
Andrey Vlasovskikh

Để phát triển các tính năng, tôi có xu hướng sao chép toàn bộ kho lưu trữ và sau đó hợp nhất lại sau khi tính năng kết thúc. Tôi không muốn có phần còn lại của các chi nhánh (đóng) trong lịch sử.
DanMan

Câu trả lời:


218

Một cách là chỉ để các nhánh tính năng được hợp nhất mở (và không hoạt động):

$ hg up default
$ hg merge feature-x
$ hg ci -m merge

$ hg heads
    (1 head)

$ hg branches
default    43:...
feature-x  41:...
    (2 branches)

$ hg branches -a
default    43:...
    (1 branch)

Một cách khác là đóng một nhánh tính năng trước khi hợp nhất bằng một cam kết bổ sung:

$ hg up feature-x
$ hg ci -m 'Closed branch feature-x' --close-branch
$ hg up default
$ hg merge feature-x
$ hg ci -m merge

$ hg heads
    (1 head)

$ hg branches
default    43:...
    (1 branch)

Cái đầu tiên đơn giản hơn, nhưng nó để lại một nhánh mở. Cái thứ hai không để lại đầu / nhánh mở, nhưng nó đòi hỏi thêm một cam kết phụ trợ. Người ta có thể kết hợp cam kết thực tế cuối cùng với nhánh tính năng với cam kết bổ sung này bằng cách sử dụng --close-branch, nhưng người ta nên biết trước cam kết nào sẽ là cam kết cuối cùng.

Cập nhật : Vì Mercurial 1.5, bạn có thể đóng chi nhánh bất cứ lúc nào để nó không xuất hiện trong cả hai hg brancheshg headsnữa. Điều duy nhất có thể làm bạn khó chịu là về mặt kỹ thuật, biểu đồ sửa đổi vẫn sẽ có thêm một lần sửa đổi mà không có con.

Cập nhật 2 : Vì dấu trang Mercurial 1.8 đã trở thành một tính năng cốt lõi của Mercurial. Dấu trang thuận tiện cho việc phân nhánh hơn các chi nhánh được đặt tên. Xem thêm câu hỏi này:


2
Nó không hẳn là đúng như vậy Bookmarks are more convenient for branching than named branches. Dấu trang Hg không giống với các nhánh Git. Chúng có rất nhiều trường hợp cạnh khiến chúng không phù hợp như các nhánh tính năng. Ví dụ: khi bạn sao chép một kho lưu trữ, bạn sẽ kết thúc với cam kết mới nhất trong defaultchi nhánh. Nếu bạn sử dụng dấu trang, bộ thay đổi này tương ứng với dấu trang ngẫu nhiên (không ổn định). Nếu bạn sử dụng các nhánh được đặt tên, bạn sẽ nhận được cam kết mới nhất trong nhánh ổn định / mặc định, thường là những gì bạn muốn. Dấu trang sẽ đến đó một ngày, nhưng chúng chưa ở đó.
Gili

Tôi sử dụng dấu trang làm thẻ riêng chỉ hiển thị trong kho lưu trữ cục bộ của mình. Chúng hoạt động như một lời nhắc nhở về những thay đổi mà tôi cần xem lại.
Gili

Tôi đã cố gắng làm theo phương pháp này, nhưng tôi vẫn gặp lỗi khi cố gắng đẩy : abort: push creates new remote branches:. Tôi có thể làm gì sai?
kasperd

79

Imho có hai trường hợp cho các chi nhánh đã quên đóng cửa

Trường hợp 1: chi nhánh không được hợp nhất thành mặc định

trong trường hợp này, tôi cập nhật lên chi nhánh và thực hiện một cam kết khác với --close-Branch, thật không may, điều này sẽ chọn chi nhánh để trở thành mẹo mới và do đó trước khi đẩy nó sang các bản sao khác, tôi chắc chắn rằng mẹo thực sự nhận được một số thay đổi khác và các thay đổi khác đừng nhầm lẫn về mẹo lạ đó.

hg up myBranch
hg commit --close-branch

Trường hợp 2: chi nhánh được sáp nhập vào mặc định

Trường hợp này không khác nhiều so với trường hợp 1 và nó có thể được giải quyết bằng cách sao chép các bước cho trường hợp 1 và hai bước bổ sung.

trong trường hợp này, tôi cập nhật lên bộ thay đổi chi nhánh, thực hiện một cam kết khác với --close-Branch và hợp nhất bộ thay đổi mới trở thành mẹo mặc định. thao tác cuối cùng tạo ra một mẹo mới nằm trong nhánh mặc định - HOORAY!

hg up myBranch
hg commit --close-branch
hg up default
hg merge myBranch

Hy vọng điều này sẽ giúp độc giả trong tương lai.


3
Câu trả lời rõ ràng tốt cho một người mới chơi Mercurial như tôi. Và cảm ơn bạn đã không sử dụng "ci" không được liệt kê là một trong những lệnh của hg trợ giúp, vì vậy tôi không biết ý nghĩa của nó :)
MB.

8
@MB.: Trong những trường hợp như vậy, hg help cisẽ giải thích cho bạn.
Chris Morgan

Tôi tin rằng lệnh 'hg merge' sẽ cho bạn biết, vẫn còn một cam kết khác ở cuối
Chip Grandits

11

EDIT ouch, quá muộn ... Tôi biết đọc bình luận của bạn nói rằng bạn muốn giữ các thay đổi tính năng-x, vì vậy phương pháp nhân bản ở đây không hiệu quả.

Tôi vẫn sẽ để câu trả lời ở đây vì nó có thể giúp đỡ người khác.

Nếu bạn muốn loại bỏ hoàn toàn "tính năng X", vì, chẳng hạn, nó không hoạt động, bạn có thể sao chép. Đây là một trong những phương pháp được giải thích trong bài viết và nó hoạt động, và nó nói cụ thể về người đứng đầu.

Theo như tôi hiểu thì bạn có điều này và muốn thoát khỏi cái đầu "Feature-x" một lần và mãi mãi:

@    changeset:   7:00a7f69c8335
|\   tag:         tip
| |  parent:      4:31b6f976956b
| |  parent:      2:0a834fa43688
| |  summary:     merge
| |
| | o  changeset:   5:013a3e954cfd
| |/   summary:     Closed branch feature-x
| |
| o  changeset:   4:31b6f976956b
| |  summary:     Changeset2
| |
| o  changeset:   3:5cb34be9e777
| |  parent:      1:1cc843e7f4b5
| |  summary:     Changeset 1
| |
o |  changeset:   2:0a834fa43688
|/   summary:     Changeset C
|
o  changeset:   1:1cc843e7f4b5
|  summary:     Changeset B
|
o  changeset:   0:a9afb25eaede
   summary:     Changeset A

Vì vậy, bạn làm điều này:

hg clone . ../cleanedrepo --rev 7

Và bạn sẽ có những điều sau đây, và bạn sẽ thấy tính năng-x thực sự đã biến mất:

@    changeset:   5:00a7f69c8335
|\   tag:         tip
| |  parent:      4:31b6f976956b
| |  parent:      2:0a834fa43688
| |  summary:     merge
| |
| o  changeset:   4:31b6f976956b
| |  summary:     Changeset2
| |
| o  changeset:   3:5cb34be9e777
| |  parent:      1:1cc843e7f4b5
| |  summary:     Changeset 1
| |
o |  changeset:   2:0a834fa43688
|/   summary:     Changeset C
|
o  changeset:   1:1cc843e7f4b5
|  summary:     Changeset B
|
o  changeset:   0:a9afb25eaede
   summary:     Changeset A

Tôi có thể đã hiểu nhầm những gì bạn muốn nhưng xin đừng sửa đổi, tôi đã mất thời gian sao chép trường hợp sử dụng của bạn :)


7

Điều kỳ lạ là chưa có ai đề xuất cách đóng các nhánh tính năng mạnh mẽ nhất ... Bạn chỉ có thể kết hợp cam kết hợp nhất với cờ --close-Branch (tức là cam kết các tệp đã sửa đổi và đóng nhánh đồng thời):

hg up feature-x
hg merge default
hg ci -m "Merge feature-x and close branch" --close-branch
hg branch default -f

Vì vậy, đó là tất cả. Không có thêm một đầu trên revgraph. Không có cam kết thêm.


Tôi đã đề cập đến nó trong câu trả lời của mình: "" "Người ta có thể kết hợp cam kết thực tế cuối cùng với nhánh tính năng với cam kết bổ sung này bằng cách sử dụng --close-Branch, nhưng người ta nên biết trước cam kết nào sẽ là cam kết cuối cùng." " "
Andrey Vlasovskikh 7/03/2015

Ok, tôi hiểu rồi. Tôi hoàn toàn không hiểu phần cuối của câu ("nhưng người ta nên biết ..."), vì vậy tôi nghĩ nó có nghĩa khác. Ngoài ra, tôi muốn lưu ý rằng phương pháp này không được hỗ trợ bởi hầu hết các công cụ GUI (TortoiseHG, SourceTree, v.v.).
tav

@AndreyVlasovskikh Điểm của câu trả lời này là đóng chi nhánh trong hợp nhất chứ không phải trong cam kết cuối cùng của nhánh tính năng.
kasperd

@tav Trước khi ban hành mergelệnh, có thể nên sử dụng hg branchđể xác minh rằng tên chi nhánh của hợp nhất là tên mà bạn muốn tiếp tục mở.
kasperd

2
Nhìn gần hơn, có vẻ như sự hợp nhất sẽ luôn nằm trên nhánh đóng. Kết quả mong muốn sẽ là trên nhánh của một trong những cha mẹ của nó và đóng chi nhánh của cha mẹ khác của nó. Điều đó dường như là không thể. Vì vậy, đây không giống như một giải pháp khả thi. Quá tệ, tôi thực sự muốn sử dụng hợp nhất làm điểm kết thúc của một nhánh.
kasperd
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.