Rebase nhánh tính năng lên một nhánh tính năng khác


305

Tôi có hai nhánh tính năng (riêng tư) mà tôi đang làm việc.

a -- b -- c                  <-- Master
     \     \
      \     d -- e           <-- Branch1
       \
        f -- g               <-- Branch2

Sau khi làm việc trên các chi nhánh này một chút, tôi phát hiện ra rằng tôi cần những thay đổi từ Chi nhánh 2 trong Chi nhánh1. Tôi muốn phản hồi các thay đổi trong Branch2 lên Branch1. Tôi muốn kết thúc với những điều sau đây:

a -- b -- c                  <-- Master
           \
            d -- e -- f -- g <-- Branch1

Tôi khá chắc chắn rằng tôi cần phải khởi động lại nhánh thứ hai lên nhất, nhưng tôi không hoàn toàn chắc chắn về cú pháp chính xác và nhánh nào tôi nên kiểm tra.

Lệnh này sẽ tạo ra kết quả mong muốn?

(Branch1)$ git rebase --onto Branch1 Branch2

11
Để trả lời câu hỏi của bạn, tôi sẽ tạo một kho lưu trữ thử nghiệm, tạo cấu trúc cam kết bạn đã hiển thị và thử lệnh bạn đã hiển thị. Nhưng tôi nghĩ bạn có thể tự làm điều đó, vì vậy tôi sẽ không làm điều đó :)
Daniel Hilgarth

3
Cảm ơn. Tôi đã rất muốn nhận được điều này ngay lần đầu tiên đến nỗi nó không xảy ra với tôi đến nỗi tôi có thể dễ dàng kiểm tra điều này :-)
Arjen

4
Tôi nghĩ vậy, đó là lý do tại sao tôi đăng bình luận đó :) Mỗi ​​khi tôi làm điều gì đó tôi không chắc nó sẽ làm những gì tôi nghĩ, tôi tạo một kho lưu trữ thử nghiệm và thực hiện các thử nghiệm của mình ở đó. Hoặc, tôi tạo một bản sao của kho lưu trữ thực sự của mình và thực hiện các thử nghiệm trên bản sao.
Daniel Hilgarth

Lưu ý: Git 2.0 sẽ giới thiệu một lối tắt cho loại rebase này : git rebase -. xem câu trả lời của tôi dưới đây
VonC

5
Lưu ý nhỏ: Các câu trả lời ở đây cung cấp cho nhánh2 là kết quả. OP muốn chi nhánh1. Hay tôi đã bỏ lỡ điều gì?
Josef.B

Câu trả lời:


353
  1. Chuyển sang Chi nhánh2

    git checkout Branch2
    
  2. Áp dụng các thay đổi hiện tại (Branch2) trên các thay đổi của Branch1, nằm trong Branch2:

    git rebase Branch1
    

Điều này sẽ để lại cho bạn kết quả mong muốn trong Chi nhánh 2:

a -- b -- c                      <-- Master
           \
            d -- e               <-- Branch1
           \
            d -- e -- f' -- g'   <-- Branch2

Bạn có thể xóa Branch1.


Cảm ơn! Khi xóa chi nhánh sau khi khởi động lại, tôi nhận được một thông báo rằng chi nhánh không được hợp nhất hoàn toàn. Tôi giả sử tôi có thể bỏ qua tin nhắn này một cách an toàn và buộc xóa?
Arjen

10
không phải anh ta muốn có tất cả những thay đổi trong Branch1 sao?
tomasz_kusmierchot

6
Điều này có vẻ như trái ngược với những gì anh ấy muốn, phải không?
1252748

1
Thật vậy, @tomasz_kusmierchot và @ 1252748, và tôi cũng bị lẫn lộn. Nhưng sau đó tôi nhận ra rằng việc thực hiện git rebasetrong khi ở trong Branch1 sẽ viết lại lịch sử của Branch1 để có những thay đổi của Branch1 trên những thay đổi được sao chép từ Branch2. Điều đó sẽ dẫn đến thứ tự cam kết sau đây , a - b - f - g - c' - d' - e'.
lươn ghEEz

1
@tomasz_kusmierchot và 1252748, đây không phải là điều trái ngược với những gì anh ấy muốn, đây chính xác là những gì anh ấy muốn. Tên chi nhánh không quan trọng, bạn luôn có thể thay đổi chúng.
a3y3

56

Lưu ý: nếu bạn đã bật Branch1, bạn sẽ với Git 2.0 (quý 2 năm 2014) có thể nhập:

git checkout Branch2
git rebase -

Xem cam kết 4f40740 của Brian Gesiakmodocache :

rebase: cho phép " -" viết tắt cho nhánh trước

Dạy rebase cùng tốc ký như checkoutmergeđặt tên nhánh cho rebasenhánh hiện tại trên; nghĩa là " -" có nghĩa là "nhánh chúng ta đã ở trước đây".


26
đẹp, nhưng cũng hơi nguy hiểm. đôi khi tính dài dòng chiến thắng. nhưng sau đó một lần nữa, tôi cũng thích Java ... (-:
sthzg

3

Tôi biết bạn đã yêu cầu Rebase, nhưng thay vào đó tôi sẽ chọn các cam kết mà tôi muốn chuyển từ Branch2 sang Branch1. Theo cách đó, tôi sẽ không cần quan tâm đến việc khi nào chi nhánh được tạo ra từ chủ và tôi có quyền kiểm soát nhiều hơn đối với việc sáp nhập.

a -- b -- c                  <-- Master
     \     \
      \     d -- e -- f -- g <-- Branch1 (Cherry-Pick f & g)
       \
        f -- g               <-- Branch2
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.