2012-01-04 40 views
13

Tôi đang sử dụng mercurial với các nhánh có tên, và chú ý rằng khi tạo nhánh mới mặc định, mặc định được đánh dấu là nhánh không hoạt động. Ví dụ:Mercurial: giữ nhánh mặc định là "active"

C:\data\solutions\test-repo>hg branches 
default      0:aeec280e6310 

C:\data\solutions\test-repo>hg branch feature-branch 
marked working directory as branch feature-branch 

C:\data\solutions\test-repo>hg com -m "created new branch" 

C:\data\solutions\test-repo>hg branches 
feature-branch     1:1cb18d7fa554 
default      0:aeec280e6310 (inactive) 

Đây là vấn đề vì hệ thống triển khai của chúng tôi hiển thị các chi nhánh có tên đang hoạt động, có thể được triển khai từ đó.

Làm cách nào để giữ nhánh mặc định của tôi "hoạt động"?

Trả lời

22

Khái niệm về các nhánh "hoạt động" và "không hoạt động" là thứ mà chúng tôi đang di chuyển ra khỏi dự án Mercurial. Vấn đề đơn giản là các nhánh có thể lật qua lại giữa hai trạng thái nhiều hơn hoặc ít ngẫu nhiên hơn và vào những thời điểm bất tiện - như bạn vừa thấy.

Thay vào đó, chúng tôi hiện đang tập trung vào "mở" so với "đã đóng". Đây là một khái niệm rõ ràng: để đóng đầu chi nhánh, bạn phải

$ hg update feature-branch 
$ hg commit --close-branch -m "passes all tests, ready for merging" 

Điều đó sẽ thêm một changeset đặc biệt đánh dấu đầu nhánh khi đóng. Khi tất cả các đầu trên một chi nhánh được đóng lại, chính nhánh đó được coi là đóng và sẽ biến mất khỏi hg branches. Tôi khuyên bạn nên đóng trước khi kết hợp, vui lòng see my named branch guide for a longer example.

Vì vậy, tôi khuyên bạn nên thay đổi hệ thống triển khai của mình để hiển thị các nhánh đang mở (hg branches) thay vì các nhánh đang hoạt động (hg branches --active).

+1

Nhưng làm cách nào điều này giữ hoạt động mặc định? Như tôi thấy, bạn phải cập nhật mặc định sau khi tạo một nhánh có tên, và thực hiện cam kết "giả", nếu không nhánh mặc định sẽ được đánh dấu là không hoạt động. – mslot

+0

@mslot: Tôi đề xuất sử dụng đóng/mở thay vì hoạt động/không hoạt động.Quên tất cả mọi thứ về các nhánh không hoạt động và tập trung vào các nhánh kín. Để mở lại một chi nhánh, bạn cần phải thực hiện một cam kết sau khi changeset đánh dấu nó đóng - đây thường không phải là vấn đề vì bạn muốn mở lại một chi nhánh bởi vì bạn có một số thay đổi thực sự để cam kết trên nhánh đó. –

+0

Để được hướng dẫn sử dụng +1, vì nó rất hữu ích và mang tính mô tả. – glglgl

13

Chỉ hoạt động không có nghĩa là nó không có đầu.

Trong trường hợp của bạn đồ thị là như thế này:

default:  0 -\ 
feature-branch:  \- 1 --- * 

* có nghĩa là "làm việc dir

Khi bạn làm được nhiều hơn các bản sửa lỗi trong tính năng của bạn (như nút 2 và 3) đây sẽ là khía cạnh :

default:  0 -\ 
feature-branch:  \- 1 --- 2 --- 3 ---- * 

Khi bạn muốn tích hợp feature-branch vào default chỉ cập nhật đến default

default:  0 -\--------------------- * 
feature-branch:  \- 1 --- 2 --- 3 

và sau đó hợp nhất feature-branch vào default:

default:  0 -\-------------------/- * 
feature-branch:  \- 1 --- 2 --- 3 -/ 

Thực tế là nó xuất hiện "không hoạt động" không có nghĩa là bạn không thể làm việc với nó. Ví dụ: "tập lệnh triển khai" của bạn có thể có một hg update --clean default sẽ hoạt động hoàn hảo ngay cả khi nó xuất hiện dưới dạng "không hoạt động".

Không hoạt động có nghĩa là không có đầu. Không có gì khác. Sau khi hợp nhất nó sẽ trở thành hoạt động và nó sẽ là feature-branch sẽ trở thành "không hoạt động".

Đừng bận tâm trạng thái hoạt động/không hoạt động của nó, chỉ hoạt động bình thường.

+0

Mặc dù đây là một ví dụ điển hình cho thấy khi một chi nhánh được coi là không hoạt động, để nói 'không có đầu' bị đánh lừa là có * đầu *. Trong trường hợp này, người đứng đầu của feature-branch là 3: 'hg heads feature-branch' sẽ xác nhận điều này. Thay vào đó, nó là một quy tắc kinh doanh (* khác * từ 'không có đầu') mà theo đó 'hg branch' xác định trạng thái hoạt động [in]. – user2864740

+0

Các quy tắc là như thế này: khi * tất cả * con của * tất cả * người đứng đầu của một chi nhánh được đặt tên thuộc về một chi nhánh * khác có tên (như sau khi hợp nhất như được hiển thị) thì nó được coi là không hoạt động. Việc tạo một cái đầu mới trên cùng một nhánh có tên (như thêm một cam kết trên nhánh tên) sẽ ngay lập tức vi phạm quy tắc và nó sẽ trở thành, ít nhất là trong giây lát, hoạt động trở lại. – user2864740

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