2011-01-12 30 views
117

Tôi có một số thay đổi mà tôi đã cam kết với kho lưu trữ cục bộ của mình, nhưng chưa được đẩy. Vì tính năng mất nhiều thời gian hơn dự kiến, tôi muốn hoán đổi những thay đổi này vào chi nhánh được đặt tên trước khi tôi đẩy. Tôi có thể làm cái này như thế nào?Thay đổi di chuyển bằng Mercurial đến chi nhánh mới

+2

bản sao có thể có của [Cách di chuyển một số thay đổi cho chi nhánh mới trong mercurial] (http://stackoverflow.com/questions/2219756/how-to-move-some-changeset-to-a-new-branch- in-mercurial) –

Trả lời

147

Theo đề nghị của Mark, các MqExtension là một giải pháp cho bạn vấn đề. IMHO một quy trình đơn giản hơn là sử dụng rebase extension. Giả sử bạn có một lịch sử như thế này:

@ changeset: 2:81b92083cb1d 
| tag:   tip 
| summary:  my new feature: edit file a 
| 
o changeset: 1:8bdc4508ac7b 
| summary:  my new feature: add file b 
| 
o changeset: 0:d554afd54164 
    summary:  initial 

Điều này có nghĩa, sửa đổi 0 là cơ sở mà trên đó bạn bắt đầu làm việc trên tính năng của bạn. Bây giờ bạn muốn có bản sửa đổi 1-2 trên một chi nhánh được đặt tên, giả sử my-feature. Update để sửa đổi 0 và tạo mà chi nhánh:

$ hg up 0 
$ hg branch my-feature 
$ hg ci -m "start new branch my-feature" 

Lịch sử bây giờ trông như thế này:

@ changeset: 3:b5939750b911 
| branch:  my-feature 
| tag:   tip 
| parent:  0:d554afd54164 
| summary:  start new branch my-feature 
| 
| o changeset: 2:81b92083cb1d 
| | summary:  my new feature: edit file a 
| | 
| o changeset: 1:8bdc4508ac7b 
|/ summary:  my new feature: add file b 
| 
o changeset: 0:d554afd54164 
    summary:  initial 

Sử dụng lệnh rebase để di chuyển các phiên bản 1-2 lên phiên bản 3:

$ hg rebase -s 1 -d 3 

này kết quả trong biểu đồ sau:

@ changeset: 3:88a90f9bbde7 
| branch:  my-feature 
| tag:   tip 
| summary:  my new feature: edit file a 
| 
o changeset: 2:38f5adf2cf4b 
| branch:  my-feature 
| summary:  my new feature: add file b 
| 
o changeset: 1:b5939750b911 
| branch:  my-feature 
| summary:  start new branch my-feature 
| 
o changeset: 0:d554afd54164 
    summary:  initial 

Đó là .. như đã đề cập trong phần bình luận cho câu trả lời của Mark, di chuyển xung quanh đã được thay đổi thường là một ý tưởng tồi, trừ khi bạn làm việc trong một nhóm nhỏ nơi bạn có thể giao tiếp và thực thi thao tác lịch sử của bạn.

+4

IMHO hạn chế của giải pháp này là nó giới thiệu một "bắt đầu chi nhánh mới tính năng của tôi" giả mạo cam kết (tức là một trong đó không thay đổi bất kỳ tập tin). – sschuberth

+7

@sschuberth: Tôi nghĩ rõ ràng là một điều tốt ở đây. Nếu thay đổi thêm là một vấn đề cho bạn, hãy kết hợp nó với thành công (ví dụ bằng cách sử dụng lệnh 'fold' của phần mở rộng [histedit] (http://mercurial.selenic.com/wiki/HisteditExtension)). –

+0

Làm thế nào để bạn in nhật ký bằng cây ASCII? –

30

Bạn có thể sử dụng MqExtension. Hãy nói rằng các changesets để di chuyển là các phiên bản 1-3:

hg qimport -r 1:3 # convert revisions to patches 
hg qpop -a   # remove all them from history 
hg branch new  # start a new branch 
hg qpush -a   # push them all back into history 
hg qfin -a   # finalize the patches 
+0

Tôi muốn nhập 63:64 và 66:68. Tôi nhận được bản sửa đổi 65 không phải là phụ huynh của 64 – Casebash

+0

Bạn muốn làm gì với 65? Mq chỉ có thể chuyển đổi các thay đổi liên tiếp từ đầu. Nó biến những thay đổi không thay đổi thường thành các bản vá có thể thay đổi có thể được chỉnh sửa. Điều này thay đổi các băm (ảnh hưởng đến tất cả trẻ em), vì vậy bạn không thể bỏ qua. –

+0

Tôi có một số thay đổi (bao gồm 65) mà tôi đã thực hiện trên nhánh chính và đẩy – Casebash

9

Tôi thích giải pháp vá mô tả here Mark Tolonen

Những gì tôi có:

hg log -G 

#default branch 
@ changeset: 3:cb292fcdbde1 
| 
o changeset: 2:e746dceba503 
| 
o changeset: 1:2d50c7ab6b8f 
| 
o changeset: 0:c22be856358b 

Những gì tôi muốn:

@ changeset: 3:0e85ae268e35 
    | branch:  feature/my_feature 
    | 
    o changeset: 2:1450cb9ec349 
    | branch:  feature/my_feature 
    | 
    o changeset: 1:7b9836f25f28 
    | branch:  feature/my_feature 
    | 
/
| 
o changeset: 0:c22be856358b 

mercurials lệnh:

hg export -o feature.diff 1 2 3 
hg update 0 
hg branch feature/my_feature 
hg import feature.diff 

Đây là tình trạng của kho địa phương của tôi

@ changeset: 6:0e85ae268e35 
| branch:  feature/my_feature 
| 
o changeset: 5:1450cb9ec349 
| branch:  feature/my_feature 
| 
o changeset: 4:7b9836f25f28 
| branch:  feature/my_feature 
| 
| o changeset: 3:cb292fcdbde1 
| | 
| o changeset: 2:e746dceba503 
| | 
| o changeset: 1:2d50c7ab6b8f 
|/ 
| 
o changeset: 0:c22be856358b 

Bây giờ tôi cần phải xóa các phiên bản 1 2 và 3 từ chi nhánh mặc định của tôi. Bạn có thể làm điều này với lệnh dải từ phần mở rộng của mq. hg strip xóa changeset và tất cả con cháu của nó khỏi kho lưu trữ.

Bật tiện ích mở rộng bằng cách thêm các dòng sau vào tệp cấu hình của bạn (.hgrc hoặc Mercurial.ini):

vim ~/.hgrc và thêm:

[extensions] 
mq = 

Và bây giờ dải kho này trên phiên bản 1.

hg strip 1 

và ở đây chúng tôi đang

@ changeset: 3:0e85ae268e35 
| branch:  feature/my_feature 
| 
o changeset: 2:1450cb9ec349 
| branch:  feature/my_feature 
| 
o changeset: 1:7b9836f25f28 
| branch:  feature/my_feature 
| 
o changeset: 0:c22be856358b 

lưu ý: changesets được khác nhau nhưng các bản sửa đổi giống nhau

5

Đối với những người có khuynh hướng sử dụng GUI

  1. Đến Tortoise Hg ->File ->Settings sau đó đánh dấu vào rebase.

enter image description here

  1. Restart rùa UI

  2. Tạo chi nhánh mới, nơi bạn sẽ được di chuyển thay đổi. Nhấp vào tên chi nhánh hiện tại -> chọn Open a new named branch -> chọn tên chi nhánh.

enter image description here

  1. Nếu thay đổi mà bạn muốn di chuyển đã không được thực hiện public (ví dụ draft) đi đến 5. (Nếu thay đổi đã được xuất bản và bạn không phải là một dev cao cấp, bạn nên nói chuyện với một người cao cấp (có được một vật tế thần) như bạn có thể vít những thứ lên thời gian lớn, tôi không chịu trách nhiệm :)).

Đến View ->Show Console (hoặc Ctrl +L) sau đó viết trong giao diện điều khiển hg phase -f -d 2 - nơi 2 là phiên bản thấp nhất, bạn sẽ được chuyển sang chi nhánh mới.

  1. Đến chi nhánh và sửa đổi (nên được sửa đổi trên cùng nếu bạn đang di chuyển thay đổi chi nhánh mới tạo ở bước 3.) Right Mouse ->Update

  2. Đến chi nhánh và revsion bạn sẽ được di chuyển thay đổi từ Right Mouse ->Modify History ->Rebase

enter image description here

  1. Nhấp vào Rebase và cầu nguyện không có xung đột, hợp nhất nếu bạn phải.

  2. Thay đổi đẩy, tại thời điểm này tất cả các bản chỉnh sửa vẫn phải là draft.

  3. Chuyển đến bản sửa đổi ở trên cùng trong nhánh bạn đang di chuyển thay đổi sang Right Mouse ->Change Phase to ->Public.

enter image description here

Hy vọng điều này giúp bạn tiết kiệm một chút thời gian.

+0

Công việc tuyệt vời! sẽ thử điều này, chỉ là một câu hỏi - tại sao thay đổi giai đoạn thành công khai ở cuối? "Bất kỳ changesets nhìn thấy trong một kho lưu trữ từ xa là công khai" vì vậy khi bạn đẩy nó sẽ không được thiết lập để công khai nào? –

+0

@JoshLeeDucks Khi đẩy chúng không thay đổi thành 'công khai' một cách tự động nữa (ít nhất là đối với tôi thì không). –

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