tl; dr
Cú pháp chính xác để rebase B
trên đầu A
sử dụng git rebase --onto
trong trường hợp của bạn là:
git checkout B
git rebase --onto A B^
hoặc rebase B
trên đầu A
bắ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, F
và G
là các cam kết có thể truy cập từ branch
nhưng không phải từ HEAD
. Nói git rebase branch
sẽ 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ừ branch
nhưng không phải từ HEAD
đó G
.
Chính xác: git rebase --onto với 2 đối số
git rebase --onto
cho 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 HEAD
chính xác trên đầu F
bắt đầu từ E
. Chúng tôi chỉ quan tâm đến việc đưa F
vào chi nhánh hoạt động của mình, đồng thời, chúng tôi không muốn giữ D
vì 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ừ HEAD
cha mẹ của bạn là D
trên F
.
Nói cách khác, thay đổi cha mẹ của E
từ D
thành F
. Cú pháp của git rebase --onto
là 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ỏ C
và E
ra khỏi chuỗi bạn sẽ nói git rebase --onto B E
, hoặc rebase HEAD
trên đầu trang của B
cha mẹ cũ E
.
Bác sĩ phẫu thuật: git rebase --onto với 3 đối số
git rebase --onto
có 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 HEAD
hiệ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ẹ D
lên đến H
đỉnh F
.
Cú pháp git rebase --onto
vớ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 HEAD
sau khi quá trình rebase hoàn tất.