2012-02-06 35 views
6

Sau khi yêu cầu this question hôm qua về phân nhánh trong mercurial, tôi đã quyết định thử các dấu trang cho các nhánh ngắn (tính năng), như được hiển thị bên dưới.
Tuy nhiên bây giờ khi tôi đang cố gắng để kết hợp đầu đánh dấu của tôi lại với nhau thành các phiên bản phát triển, tôi nhận được dưới đây lỗi:Hợp nhất các dấu trang trong mercurial

hg update dev-1.1 
hg merge feature1 
abort: nothing to merge 

Tôi đang làm gì sai?

Đồ thị biểu diễn của repo của tôi:

o changeset: 5:fa2b19961b46 
| bookmark: feature1 
| description: Work on feature 1 finished. 
| 
| o changeset: 4:6ea0155d4d89 
| | bookmark: feature2 
| | description: Work on feature 2 started. 
| | 
o | changeset: 3:44e335b5426c 
| | bookmark: feature1 
|/ description: Work on feature#1 started. 
| 
@ changeset: 2:407b3b94624f 
| tag:   dev-1.1 
| description: Development for release 1.1 started. 

Trả lời

11

Giống như nó nói, không có gì để hợp nhất là - bạn nên sử dụng cập nhật thay vì:

$ hg update feature1 

Bạn chỉ có thể hợp nhất các phần khác nhau của lịch sử, và tại đây, dev-1.1 changeset đơn giản là tổ tiên của feature1 changeset. Mercurial 2.1 nói

$ hg merge feature1 
abort: nothing to merge 
(use 'hg update' or check 'hg heads') 

trong trường hợp này và chúng tôi hy vọng điều này sẽ làm cho lỗi rõ ràng hơn.

Nếu bạn đã đánh dấu sự dev-1.1 changeset (thay vì gắn thẻ nó), sau đó một đồng bằng

$ hg update 

sẽ bây giờ (với Mercurial 2.1) kết quả trong một cập nhật của dev-1.1 bookmark. Vì vậy, nếu bạn bắt đầu với

$ hg bookmarks 
* dev-1.1     0:b1163a24728f 
    feature1     3:c84f04513651 
    feature2     2:e60dd08af282 

và sau đó cập nhật:

$ hg update 
2 files updated, 0 files merged, 0 files removed, 0 files unresolved 
updating bookmark dev-1.1 

thì bookmark được cập nhật:

$ hg bookmarks 
* dev-1.1     3:c84f04513651 
    feature1     3:c84f04513651 
    feature2     2:e60dd08af282 

Với các phiên bản trước đó, bạn sẽ phải làm

$ hg update feature1 
$ hg bookmark -f dev-1.1 

Điều này vẫn áp dụng nếu đồng bằng hg update không đưa bạn đến đúng changeset, ví dụ: nếu bạn muốn "hợp nhất" với feature2 thay thế.


Ý tưởng của việc sử dụng merge khi lịch sử đã không thực sự tách ra xuất phát từ Git. Trong hệ thống đó, có khái niệm về việc hợp nhất nhanh chuyển tiếp, đó là điều chúng tôi gọi là cập nhật trong Mercurial.

+0

Oh.Vì vậy, tôi cần chạy 'hg update feature1 && hg merge feature2' và cứ thế cho mọi tính năng giảm dần từ' dev-1.1'-revision? – Industrial

+1

Việc hợp nhất 'feature1' và' feature2' là một vấn đề khác. Nhưng có, khi các tính năng được tạo song song (như trong trường hợp của bạn), thì bạn cần hợp nhất chúng thành bản nhạc 'dev-1.1' của bạn. Nếu bạn chỉ có 'feature1', thì không có sự phát triển song song nào xảy ra và do đó' hg update' là câu trả lời đúng. –

+0

Nó không giúp điều đó (ít nhất là trong mercurial 2.7), 'hg merge --preview feature1' sẽ liệt kê tất cả các changesets thích hợp ... nhưng sau đó sự hợp nhất thực tế sẽ vẫn cung cấp lỗi được thảo luận ở đây. –

3

Nếu changesets đã được công bố, bạn có thể buộc Mercurial để làm một hợp nhất nếu bạn muốn nhấn mạnh vào có mỗi tính năng như một merge trong kho:

$ hg update feature1 
$ hg debugsetparents dev-1.1 feature1 
$ hg commit -m 'Feature 1 reviewed by me.' 
$ hg bookmark -d feature1 

Nếu changesets đã không được thực hiện công khai, bạn có thể thu gọn các changesets thành một:

$ hg update feature1 
$ hg rebase --dest dev-1.1 --collapse 
$ hg bookmark -d feature1 
Các vấn đề liên quan