Di chuyển Mercurial thay đổi sang một chi nhánh mới


124

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 thúc đẩy. Vì một tính năng mất nhiều thời gian hơn dự kiến, tôi muốn trao đổi những thay đổi này thành một nhánh có tên trước khi tôi đẩy. Tôi có thể làm cái này như thế nào?


Câu trả lời:


153

Theo đề xuất của Mark, MqExtension là một giải pháp cho vấn đề của bạn. IMHO một quy trình công việc đơn giản hơn là sử dụng phần mở rộng rebase . 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 0là cơ sở mà bạn bắt đầu làm việc trên tính năng của mình. Bây giờ bạn muốn có bản sửa đổi 1-2trên một nhánh được đặt tên, giả sử my-feature. Cập nhật để sửa đổi 0và tạo 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 rebaselệnh để di chuyển sửa đổi 1-2vào sửa đổi 3:

$ hg rebase -s 1 -d 3

Kết quả này 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 các bình luận cho câu trả lời của Mark, di chuyển xung quanh các thay đổi đã được đẩy nói chung 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 mình.


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

9
@sschuberth: Tôi nghĩ rằng rõ ràng là một điều tốt ở đây. Nếu bộ thay đổi bổ sung là một vấn đề đối với bạn, hãy kết hợp nó với bộ tiếp theo (ví dụ: bằng cách sử dụng foldlệnh của tiện ích mở rộng histedit tích hợp sẵn ).
Oben Sonne

6
@AmirRachum: hg log -G( GraphlogExtension ). Tôi đã loại bỏ một số dòng thủ công, nhưng nó cũng có thể được hiển thị hoàn toàn tự động bằng cách sử dụng các kiểu nhật ký tùy chỉnh .
Oben Sonne

2
Bật tiện ích mở rộng rebase : mercurial.selenic.com/wiki/RebaseExtension#Configuration
56ka

1
@sschuberth Tôi đồng ý. Cách giải quyết của tôi là phản ứng lại các cam kết không giả của bạn lên cha mẹ của hình nộm bằng cờ --keepbranches, và sau đó hg tước cam kết giả của bạn. Đây là rất nhiều công việc để thay đổi một tên chi nhánh, nhưng đôi khi Mercurial bị câm như thế.
weberc2

30

Bạn có thể sử dụng MqExtension . Giả sử các thay đổi cần di chuyển là 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

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

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ừ một cái đầu. Nó biến những thay đổi thông thường bất biến thành các bản vá có thể thay đổi có thể được chỉnh sửa. Điều này thay đổi băm (ảnh hưởng đến tất cả trẻ em), vì vậy bạn không thể bỏ qua.
Đánh dấu Tolonen

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

1
Đừng chỉnh sửa các thay đổi đã được đẩy. Mq thay đổi băm để chúng sẽ là những thay đổi mới một cách hiệu quả. Chỉ chỉnh sửa lịch sử chưa được đẩy.
Đánh dấu Tolonen

Nếu bạn đã đẩy 65, thì bạn chắc chắn không nên di chuyển 63 và 64, và chỉ giải quyết cho việc di chuyển 66:68 (một lần nữa, chỉ khi bạn không đẩy chúng).
Matt

9

Tôi thích giải pháp vá mô tả ở đây bởi Mark Tolonen

Tôi có gì:

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

lệnh mercurials:

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

Đây là trạng thái của kho lưu trữ cục bộ 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 xóa các bản sửa đổi 1 2 và 3 khỏi nhánh mặc định của mình. 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 striploại bỏ các thay đổi và tất cả con cháu của nó khỏi kho lưu trữ.

Cho phép 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ờ hãy loại bỏ kho lưu trữ này trên phiên bản 1.

hg strip 1

và chúng ta ở đây

@  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 ý: thay đổi là khác nhau nhưng sửa đổi là như nhau


5

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

  1. Đi đến Tortoise Hg-> File-> Settingssau đó đánh dấu rebase.

nhập mô tả hình ảnh ở đây

  1. Khởi động lại giao diện người dùng rùa

  2. Tạo chi nhánh mới, nơi bạn sẽ 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.

nhập mô tả hình ảnh ở đây

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

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

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

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

nhập mô tả hình ảnh ở đây

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

  2. Đẩy thay đổi, tại thời điểm này tất cả các sửa đổi vẫn nên được draft.

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

nhập mô tả hình ảnh ở đây

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


Bạn đã làm rất tốt! sẽ thử điều này, chỉ một câu hỏi - tại sao lại thay đổi giai đoạn thành công khai? "Mọi thay đổi được thấy trong kho lưu trữ từ xa đều công khai" vì vậy khi bạn đẩy nó sẽ không được đặt thành công khai chứ?
Joshua Duxbury

@JoshLeeDucks Khi đẩy họ không thay đổi thành publictự động nữa (ít nhất là đối với tôi họ không làm thế).
Matas Vaitkevicius
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.