tl; dr
Cú pháp chính xác để rebase Btrên đầu Asử dụng git rebase --ontotrong trường hợp của bạn là:
git checkout B
git rebase --onto A B^
hoặc rebase Btrên đầu Abắt đầu từ cam kết là cha mẹ củaB tham chiếu với B^hoặc B~1.
Nếu bạn quan tâm đến sự khác biệt giữa git rebase <branch>và git rebase --onto <branch>đọc tiếp.
Nhanh: git rebase
git rebase <branch>sẽ rebase nhánh bạn hiện đã kiểm tra ra, tham chiếu bởi HEAD, trên đỉnh mới nhất cam kết rằng có thể truy cập từ <branch>nhưng không khỏi HEAD.
Đây là trường hợp phổ biến nhất của việc nổi loạn và được cho là trường hợp đòi hỏi ít kế hoạch trước.
Before After
A---B---C---F---G (branch) A---B---C---F---G (branch)
\ \
D---E (HEAD) D---E (HEAD)
Trong ví dụ này, Fvà Glà các cam kết có thể truy cập từ branchnhưng không phải từ HEAD. Nói git rebase branchsẽ mất D, đó là cam kết đầu tiên sau điểm phân nhánh và khởi động lại nó (tức là thay đổi cha mẹ của nó ) trên đầu trang của cam kết mới nhất có thể tiếp cận từ branchnhưng không phải từ HEADđó G.
Chính xác: git rebase --onto với 2 đối số
git rebase --ontocho phép bạn rebase bắt đầu từ một cam kết cụ thể . Nó cấp cho bạn quyền kiểm soát chính xác đối với những gì đang bị phản đối và ở đâu. Điều này là cho các kịch bản mà bạn cần phải chính xác.
Ví dụ, hãy tưởng tượng rằng chúng ta cần phải nổi loạn HEADchính xác trên đầu Fbắt đầu từ E. Chúng tôi chỉ quan tâm đến việc đưa Fvào chi nhánh hoạt động của mình, đồng thời, chúng tôi không muốn giữ Dvì nó chứa một số thay đổi không tương thích.
Before After
A---B---C---F---G (branch) A---B---C---F---G (branch)
\ \
D---E---H---I (HEAD) E---H---I (HEAD)
Trong trường hợp này, chúng tôi sẽ nói git rebase --onto F D. Điều này có nghĩa là:
Rebase cam kết có thể truy cập từ HEADcha mẹ của bạn là Dtrên F.
Nói cách khác, thay đổi cha mẹ của Etừ Dthành F. Cú pháp của git rebase --ontolà sau đó git rebase --onto <newparent> <oldparent>.
Một kịch bản khác mà điều này có ích là khi bạn muốn nhanh chóng loại bỏ một số cam kết khỏi nhánh hiện tại mà không phải thực hiện một rebase tương tác :
Before After
A---B---C---E---F (HEAD) A---B---F (HEAD)
Trong ví dụ này, để loại bỏ Cvà Era khỏi chuỗi bạn sẽ nói git rebase --onto B E, hoặc rebase HEADtrên đầu trang của Bcha mẹ cũ E.
Bác sĩ phẫu thuật: git rebase --onto với 3 đối số
git rebase --ontocó thể tiến thêm một bước về độ chính xác. Trong thực tế, nó cho phép bạn khởi động lại một loạt các cam kết tùy ý trên một phạm vi khác.
Đây là một ví dụ:
Before After
A---B---C---F---G (branch) A---B---C---F---G (branch)
\ \
D---E---H---I (HEAD) E---H (HEAD)
Trong trường hợp này, chúng tôi muốn đánh lại phạm vi chính xác E---Hở trên cùng F, bỏ qua nơi HEADhiện đang trỏ đến. Chúng ta có thể làm điều đó bằng cách nói git rebase --onto F D H, có nghĩa là:
Rebase phạm vi của các cam kết có cha mẹ Dlên đến Hđỉnh F.
Cú pháp git rebase --ontovới một loạt các cam kết sau đó trở thành git rebase --onto <newparent> <oldparent> <until>. Thủ thuật ở đây là nhớ rằng cam kết được tham chiếu bởi <until>được bao gồm trong phạm vi và sẽ trở thành mới HEADsau khi quá trình rebase hoàn tất.