2012-10-31 26 views
5

Tôi đã thực hiện một loạt các bước câm với bản sao cục bộ của tôi của kho lưu trữ được chia sẻ của chúng tôi và tôi đang tìm cách để sửa chữa nó. Các bước thực hiện:Làm thế nào để đẩy, mà không cần tạo đầu mới, sau khi tạo chi nhánh nhiều nhánh, rebase và nhiều lần hợp nhất

  • tôi đã sử dụng bookmark để có nhiều người đứng đầu của một chi nhánh phát triển, mà những người khác sử dụng:

    -o---o---o-----o--- <- dev branch 
        \----1----1------ <- another head of the dev branch, 
             where I committed stuff 
    
  • Tôi tạo ra một chi nhánh mới, vẫn còn địa phương, một thời gian sau

    /---------------x <- new branch 
    -o---o---o-----o--- <- dev branch 
        \----1----1------ <- another head of the dev branch, 
             where I committed stuff 
    
  • cho một đầu, chỉ chứa mã của tôi, tôi đã thực hiện rebase trên một chi nhánh khác

        /-1'--1'-- <- rebase 
        /---------------x   <- new branch 
    -o---o---o-----o---   <- dev branch 
        \----1----1------   <- another head of the dev branch, 
                where I committed stuff 
    
  • sau đó, tôi sáp nhập rebase, và sau đó, một vài cam kết sau, tôi sáp nhập mặc định

        ----------d-\  <-default 
               \ 
            /-1'--1'\  \ 
        /---------------x--------x--x-x-x-- <- new branch 
    -o---o---o-----o---   
        \----1----1------   
    

Bây giờ, tôi muốn đẩy chi nhánh mới của tôi đến máy chủ (hg push --new-branch -b newBranch) , nhưng tôi nhận được abort: push creates new remote head, vì cam kết 1' thuộc về chi nhánh dev.

Điều phải làm là gì? Tôi muốn tránh tạo đầu bổ sung này.

Cập nhật:

Theo yêu cầu, đây là sản phẩm của hg heads:

changeset: 839:f2033d695fcd <- want to push this 
branch:  newBranch 
tag:   tip 
user:  me 
date:  Wed Oct 31 13:05:51 2012 +0100 

changeset: 826:7fde19d7f467 
branch:  devBranch 
user:  my-collegue 
date:  Tue Oct 23 14:59:42 2012 +0200 

changeset: 820:23853bbf68df <- the part after rebase that got merged 
branch:  devBranch 
user:  me 
date:  Mon Oct 22 15:36:26 2012 +0200 

changeset: 807:899344cfb145 <- obsolete (branch with 1's) 
branch:  devBranch 
parent:  711:454f29c03fb1 
user:  me 
date:  Mon Oct 22 15:36:26 2012 +0200 

changeset: 712:d5e8a62a7f5f <- default, needs to stay 
parent:  648:2bbcc01aa191 
user:  me 
date:  Wed Aug 22 16:21:09 2012 +0200 
+0

Không sử dụng "bản vẽ" miễn phí - bạn có các lệnh điều khiển và khả năng dán kết quả đầu ra theo câu hỏi ** được định dạng ** ('hg log' hoặc' hg glog' cho cây tại đây và tại http: // stackoverflow.com/questions/11982648/reassigning-local-commits-to-a-different-branch-in-mercurial, ví dụ). Bây giờ, xin vui lòng, thêm đầu ra của 'hg heads' với chú thích - đầu nào đã lỗi thời và không tồn tại (hoàn toàn hoặc chỉ trong push-target). Cũng đọc về tùy chọn -r trong lệnh push –

+0

Xin chào @LazyBadger, tôi không thể cung cấp cho bạn đầu ra của 'log' vì có nhiều cam kết hơn tôi đã mô tả và tôi cũng quên các lệnh chính xác mà tôi đã thực hiện để truy cập trạng thái này ... Câu hỏi được cập nhật để chứa đầu ra của đầu. Tôi không hiểu tham chiếu của bạn về tùy chọn '-r', làm thế nào/tại sao nó lại hữu ích? –

+0

lệnh chính xác không cần thiết trong trường hợp này - ** bạn ** (không phải tôi) phải xem cây của devBranch (từ cha mẹ chung của 807 và 820 đến 826), xác định * khả năng * (và * necessity *) của hợp nhất đầu của devBranch. Hoặc chỉ 'push -r f2033d695fcd' sẽ đủ –

Trả lời

1

tôi đã giải quyết được vấn đề, mà không đẩy đầu khác để repo và không cần hợp nhất 23853bbf68df vào newBranch. Đây có lẽ không phải là cách sạch nhất để làm điều đó, nhưng tôi sẽ để nó như là một tham chiếu. Tóm lại, tôi đã xây dựng lại toàn bộ nhánh bằng cách lấy tất cả các cam kết và áp dụng lại chúng.

Trước tiên, tôi đã giết chết 'es newBranch đầu 899344cfb145, bằng cách sử dụng dải về việc chỉnh phân kỳ đầu tiên tôi đã làm:

hg strip -r 646 

Sau đó, tôi được sản xuất các bản vá lỗi email (không thể chơi với mq) cho tất cả các cam kết có trong newBranch, vì nó ra đời:

hg export -g -r 797:808 -r 810 -r 815:822 -r 824:830 -o "%n-%m.patch" 
  • 797:808 là những bản vá lỗi trong newBranch mà là ở phần rebased của devBranch (1' cam kết từ hình gốc).
  • 810815:822 là các bản vá khác trong newBranch. 811:814 thuộc về một nhánh khác, vì vậy tôi phải loại trừ chúng.
  • 823 là cam kết hợp nhất với default, vì vậy tôi đã bỏ qua bước này.
  • 824:830 là tất cả các cam kết sau khi hợp nhất với default.

Bây giờ, tôi nhập khẩu các bản vá lỗi trên một lãnh đạo mới của newBranch:

hg up -r 796 
# there are 29 patches, applying till merge 
hg import --bypass {01..21}*.patch 
hg up tip 
hg merge default 
hg ci -m 'merging in default' 
hg import --bypass {22..28}*.patch 

Cuối cùng, tôi chỉ tước của người đứng đầu ban đầu của newBranch.

hg strip -r 797 

Điều này có thể không hoạt động trong mọi tình huống. Trong quá trình hợp nhất, tôi cũng phải giải quyết một số xung đột nhưng khá lành tính. Hy vọng điều này sẽ giúp một ai đó.

7

Bạn có thể đẩy chỉ có một đầu bạn quan tâm lanh lợi. Đối với bạn rằng sẽ có nghĩa là thực hiện:

hg push -r f2033d695fcd 

Nếu repo điểm đến đã được cập nhật bạn cần phải kéo, sáp nhập, và lại đẩy:

hg pull 
hg up -r <remote head> 
hg merge -r f2033d695fcd 
hg ci 
hg push 
+0

Cảm ơn bạn đã trả lời, nhưng như tôi đã đề cập, điều này tạo ra 'abort: push tạo ra đầu từ xa mới 23853bbf68df trên nhánh devBranch'. Như @LazyBadger gợi ý, tôi sẽ cố gắng sáp nhập cái đầu này, mặc dù đó là điều tôi muốn tránh. –

+0

Đó là một cái đầu khác với cái bạn đang thực sự cố đẩy. Nếu bạn chỉ định đầu bạn đang cố gắng đẩy bằng '-r' bạn sẽ không nhận được cái đầu này. –

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