2014-12-12 22 views
5

chi nhánh git của tôi trông như thế này:Làm thế nào để rebase qua đã rebased chi nhánh

master-*-*-*-*-*-*-implement_x 
\     \-*-further_foo_fixes_that_depend_on_x 
    \     \-*-*-further_bar_fixes_that_depend_on_x 
    \ 
    \-implement_x_rebased 

Nó đã kết thúc theo cách này, bởi vì tôi nghĩ rằng chi nhánh của tôi implement_x sẽ được sáp nhập ngược dòng như nó có, nhưng tôi đã được yêu cầu vắt ép mình với một cam kết đơn lẻ, như vậy implement_x_rebased. Tuy nhiên, tôi đã bắt đầu một số chi nhánh để tiếp tục sửa chữa và phát triển phụ thuộc vào công việc của tôi, trong khi chờ đợi cho các implement_x để có được sáp nhập.

Bây giờ tôi muốn rebase công việc tiếp theo trên implement_x_rebased. Tôi nghĩ rằng đây là một không-op, vì implement_ximplement_x_rebased ở trạng thái giống hệt nhau - sẽ không có xung đột hợp nhất, chỉ áp dụng các thay đổi giữa implement_xfurther_foo_fixes_that_depend_on_x v.v. trên đầu trang implement_x_rebased. Tuy nhiên, có vẻ như git không phải là thông minh, và nó cố gắng để rebase tất cả các cách từ cơ sở - giới thiệu xung đột hợp nhất không cần thiết.

Tôi nghĩ rằng cách dễ dàng ra là rebase & dẹp sửa thêm về implement_x và sau đó cất giấu chúng, và áp dụng các ẩn nấp để implement_x_rebased, nhưng tôi tò mò liệu có cách nào thích hợp để làm git nhận ra rằng implement_ximplement_x_rebased thực sự có cùng trạng thái không?

+0

Tôi không biết câu trả lời hoàn hảo cho câu hỏi này nhưng lựa chọn anh đào cũng là một trong các tùy chọn. – shirakia

+0

Ah. Cherry-chọn chắc chắn là dễ dàng hơn và tốt hơn so với bằng tay áp dụng một số khác biệt. Tôi vẫn đang chờ câu trả lời trực tiếp trả lời câu hỏi của tôi, nhưng nếu không có bất kỳ thời gian nào trong tôi, tôi sẽ chấp nhận rằng nếu bạn đăng câu hỏi đó. – GolDDranks

+0

Vui lòng kiểm tra 'git rev-parse implementation_x^{tree} implementation_x_rebased^{tree}' để xem liệu hai commit thực sự có nội dung giống nhau hay không. – jthill

Trả lời

8

Điều này có vẻ là một nhiệm vụ cho tùy chọn --onto của git rebase.

git rebase --onto implement_x_rebased implement_x further_bar_fixes_that_depend_on_x 

Bạn có thể muốn có cái nhìn tại các --onto ví dụ trong git rebase manual.

+0

Thật vậy, chính xác loại tình huống này là một trong những ví dụ ('git rebase --onto master next topic') trong' git help rebase', ngoại trừ thực tế là mục tiêu của rebase không chỉ là một commit trong ví dụ đó, nhưng điều đó không thực sự quan trọng đối với ví dụ. – twalberg

+0

Lịch sử của tôi chưa bao giờ trông đẹp như thế này! Lộng lẫy. – GolDDranks

-1

Một cách tiếp cận này sẽ được thực hiện implement_ximplement_x_rebased cùng đầu tiên, ví dụ .:

git checkout implement_x_rebased 
git merge implement_x 

sau đó hợp nhất trong hơn nữa các bản sửa lỗi của bạn theo cách thông thường.

Việc hợp nhất implement_x phải là NOOP từ điểm mã (xem git diff implement_x implement_x_rebased thực sự không tạo ra gì), nhưng bạn đang ghi thực tế cả hai được hợp nhất, điều này sẽ cho phép bạn kéo mọi thứ khác một cách dễ dàng.

Nếu chúng không hoàn toàn giống nhau, bạn có thể cần tùy chọn -s ours. Điều này ghi lại rằng hợp nhất đã được thực hiện mà không cần nhập mã. SỬ DỤNG VỚI THẬN TRỌNG EXTREME.

Nếu không, bạn có thể chỉ cần sử dụng git rebase để rebase các chi nhánh sau đó lên implement_x_rebased.

Đây là tốt hơn so với cherry-hái như a) bạn không cần phải đào chọn mỗi cá nhân cam kết, hãy nhớ để có được thứ tự đúng, vv b) ngữ nghĩa, cây git của bạn làm cho ý nghĩa hơn sau

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