2010-06-30 32 views
12

Có một kịch bản mà chúng tôi cố ý hợp nhất một chi nhánh có tên (ABC) vào chi nhánh default của chúng tôi.Mercurial Undo Merge

hg rollback không phải là một tùy chọn vì đã có một vài cam kết từ đó.

Có cách nào để hoàn tác tác vụ này không?

Trả lời

4

Nếu bạn chưa công bố công khai repo bạn có thể làm điều này

hg clone -r (parent1 of bad merge) -r (parent2 of bad merge) old new 

và xóa các repo cũ.

+0

Tác phẩm này ... cảm ơn! Bây giờ tôi có một vấn đề còn lại: làm thế nào để có được các changesets được áp dụng sau khi hợp nhất xấu vào kho lưu trữ mới được nhân bản của tôi? –

+0

@Steve Xem câu trả lời của tôi. Bạn sẽ phải "rebase" chúng trên đầu cũ. – tghw

+0

không thể hoàn tác quá trình hợp nhất. – tghw

8

Bạn sẽ cần phần mở rộng Mq. Nếu bạn chưa bật tính năng này, hãy làm như vậy bằng cách thêm số này vào tệp Mercurial.ini hoặc .hgrc của bạn.

[extensions] 
hgext.mq= 

Nếu bạn không quen với nó, Mq extension hãy để bạn thao tác lịch sử. Tin tốt là, điều này sẽ cho phép chúng tôi sửa lỗi repo của bạn. Tin xấu là bất cứ ai có một bản sao của repo lộn xộn sẽ phải sao chép nó một lần nữa, bởi vì chúng tôi sẽ thay đổi lịch sử.

Trước tiên, hãy tạo một bản sao khác của repo để làm việc, vì vậy chúng tôi không làm phiền bất cứ thứ gì.

Bây giờ, hãy tìm id bản sửa đổi của bộ thay đổi hợp nhất (đã hợp nhất default và chi nhánh được đặt tên của bạn). Viết nó xuống. Chúng tôi sẽ gọi nó là changesetM. Bây giờ tìm thấy id sửa đổi của changeset tiếp theo. Viết nó xuống. Chúng tôi sẽ gọi nó là changesetN.

Khi bạn có hai id sửa đổi này, hãy chuyển đến dấu nhắc lệnh và cd vào mã repo của bạn. Sau đó gõ ra những điều sau đây, thay thế changeset[M|N] với id sửa đổi thích hợp .:

$ hg qimport -r changesetN:tip 
    # This will add all of your changes since the merge to the queue 
$ hg qpop -a 
    # This pops them all out of your history. 
$ hg strip changesetM 
    # This removes the merge changeset. 
$ hg update -C default 
    # Make sure we're on the default branch 
$ hg qpush -a 
    # Take the changesets in the queue and push them back onto your history. 
$ hg qfinish -a 
    # Remove changesets from the queue and finalize them as normal changesets. 

Về cơ bản, bạn đang rebasing các changesets mới trên đầu trang của các chi nhánh mặc định, loại bỏ các changeset hợp nhất trong quá trình này. Khi bạn đã hoàn tất, bạn sẽ cần phải đẩy các thay đổi vào một kho lưu trữ mới trên máy chủ và để các đồng nghiệp của bạn sao chép các bản sao mới.

Cuối cùng, nếu bạn có bất kỳ câu hỏi Mercurial nào khác, hãy xem kiln.stackexchange.com.

CẬP NHẬT

tôi quên đề cập đến: Nếu ai đó đã dựa trên những thay đổi một cái gì đó mà chỉ tại các chi nhánh khác, nó có thể là hg qpush -a sẽ thất bại. Bạn sẽ thấy một tệp foo.txt.rejfoo.txt.orig đặt xung quanh. Thật không may, bạn sẽ phải tự sửa lỗi này. Để khắc phục, hãy mở tệp gốc, tệp .orig và tệp .rej và chọn các thay đổi phù hợp để hợp nhất, lưu chúng vào tệp gốc. Khi bạn đã hợp nhất, hãy sử dụng hg qrefresh để cập nhật bản vá đó lên bản vá mới, được hợp nhất. Từ họ, bạn sẽ có thể chạy lại hg qpush -a và tiếp tục. Nếu bạn gặp lại lỗi tương tự trên một bản vá khác, chỉ cần làm theo cùng một quy trình.

+0

Tôi đi với bạn cho đến khi hg qpush -a. Tôi nhận được những điều sau đây trong bảng điều khiển: áp dụng xxx.diff tập tin vá ----- Hunk # 1 FAILED at 806 1 trong số 1 hunks FAILED - saving rejects "..." patch failed, không thể tiếp tục ... lỗi khi áp dụng, vui lòng sửa và làm mới 310.diff –

+0

Xem phần cập nhật trong câu trả lời của tôi. – tghw

+0

Điều này phá hủy lịch sử, do đó, nó sẽ không hoạt động nếu sai lầm đã được tuyên truyền. Xem: http://stackoverflow.com/questions/265944/backing-out-a-backwards-merge-on-mercurial –

3

Tôi đã xem qua kịch bản sau đây hôm nay:

@ changeset: 1728:5d703e1051d3 
|\ parent:  1727:1a5f73b5edb4 
| | parent:  1720:65ddd0bde225 
| | user:  nn 
| | date:  Wed Feb 27 10:35:00 2013 +0100 
| | summary:  Merge with SomeBranch 
| | 
| o changeset: 1727:1a5f73b5edb4 
| | user:  nn 
| | date:  Wed Feb 27 10:34:30 2013 +0100 
| | summary:  lorem ipsum 
| | 
[some more changesets] 
| | 
o | changeset: 1720:65ddd0bde225 
| | branch:  SomeBranch 
| | user:  nn 
| | date:  Wed Feb 27 07:44:46 2013 +0100 
| | summary:  lorem ipsum 

đâu SomeBranch không nên đã được sáp nhập vào mặc định. Những gì chúng ta đã làm để giải quyết việc này, là sử dụng lệnh backout với các tùy chọn parent như vậy:

hg backout --rev=1728 --parent=1727 

Bằng cách này, bạn không undo hợp nhất bản thân: Nhìn vào đồ thị chi nhánh (hoặc với log graph hoặc trong TortoiseHg), bạn sẽ vẫn thấy SomeBranch đi vào mặc định tại r1728. Tuy nhiên, kết quả kết quả là của hợp nhất được hoàn tác, có nghĩa là changeset chứa bản sao lưu (r1729 trong trường hợp của tôi) giống hệt với r1727.

+0

Điều này cũng có quan tâm đến các cờ hợp nhất không? – elzapp