tl; dr
Sintaks yang benar untuk rebase Bdi atas Amenggunakan git rebase --ontodalam kasus Anda adalah:
git checkout B
git rebase --onto A B^
atau rebase Bdi atas Amulai dari komit yang merupakan induk dariB direferensikan dengan B^atau B~1.
Jika Anda tertarik pada perbedaan antara git rebase <branch>dan git rebase --onto <branch>baca terus.
Quick: git rebase
git rebase <branch>akan rebase cabang saat ini Anda telah memeriksa, direferensikan oleh HEAD, di atas terbaru komit yang dicapai dari <branch>namun tidak dari HEAD.
Ini adalah kasus rebasing yang paling umum dan bisa dibilang salah satu yang membutuhkan perencanaan kurang di muka.
Before After
A---B---C---F---G (branch) A---B---C---F---G (branch)
\ \
D---E (HEAD) D---E (HEAD)
Dalam contoh ini, Fdan Gadalah komitmen yang dapat dijangkau branchtetapi tidak dari HEAD. Mengatakan git rebase branchakan mengambil D, itu adalah komit pertama setelah titik percabangan, dan rebase itu (yaitu mengubah induknya ) di atas komit terbaru yang dapat dicapai dari branchtetapi tidak dari HEAD, yaitu G.
Precise: git rebase --onto dengan 2 argumen
git rebase --ontomemungkinkan Anda melakukan rebase mulai dari komit tertentu . Ini memberi Anda kontrol tepat atas apa yang sedang direstrukturisasi dan di mana. Ini untuk skenario di mana Anda harus tepat.
Misalnya, mari kita bayangkan bahwa kita perlu rebase HEADtepat di atas Fmulai dari E. Kami hanya tertarik untuk membawa Fke cabang kerja kami sementara, pada saat yang sama, kami tidak ingin menyimpannya Dkarena mengandung beberapa perubahan yang tidak kompatibel.
Before After
A---B---C---F---G (branch) A---B---C---F---G (branch)
\ \
D---E---H---I (HEAD) E---H---I (HEAD)
Dalam hal ini, kami akan mengatakan git rebase --onto F D. Ini berarti:
Rebase komit yang dapat dijangkau dari HEADyang induknya ada Ddi atas F.
Dengan kata lain, ubah induk dari Edari Dmenjadi F. Sintaksnya git rebase --ontoadalah git rebase --onto <newparent> <oldparent>.
Skenario lain yang sangat berguna adalah ketika Anda ingin dengan cepat menghapus beberapa komit dari cabang saat ini tanpa harus melakukan rebase interaktif :
Before After
A---B---C---E---F (HEAD) A---B---F (HEAD)
Dalam contoh ini, untuk menghapus Cdan Edari urutan yang Anda katakan git rebase --onto B E, atau rebase HEADdi atas di Bmana orang tua yang lama berada E.
The Surgeon: git rebase --onto dengan 3 argumen
git rebase --ontobisa melangkah lebih jauh dalam hal presisi. Bahkan, ini memungkinkan Anda untuk rebase kisaran komit sewenang - wenang di atas yang lain.
Ini sebuah contoh:
Before After
A---B---C---F---G (branch) A---B---C---F---G (branch)
\ \
D---E---H---I (HEAD) E---H (HEAD)
Dalam hal ini, kami ingin mengubah rentang yang tepat E---Hdi atas F, mengabaikan ke mana HEADsaat ini menunjuk. Kita dapat melakukannya dengan mengatakan git rebase --onto F D H, yang berarti:
Rebase kisaran komit yang induknya adalah Dsampai dengan Hdi atas F.
Sintaksnya git rebase --ontodengan rentang komit kemudian menjadi git rebase --onto <newparent> <oldparent> <until>. Kuncinya di sini adalah mengingat bahwa komit direferensikan oleh <until>yang termasuk dalam jangkauan dan akan menjadi baru HEADsetelah rebase selesai.