tl; dr
Sintaks yang benar untuk rebase B
di atas A
menggunakan git rebase --onto
dalam kasus Anda adalah:
git checkout B
git rebase --onto A B^
atau rebase B
di atas A
mulai 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, F
dan G
adalah komitmen yang dapat dijangkau branch
tetapi tidak dari HEAD
. Mengatakan git rebase branch
akan mengambil D
, itu adalah komit pertama setelah titik percabangan, dan rebase itu (yaitu mengubah induknya ) di atas komit terbaru yang dapat dicapai dari branch
tetapi tidak dari HEAD
, yaitu G
.
Precise: git rebase --onto dengan 2 argumen
git rebase --onto
memungkinkan 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 HEAD
tepat di atas F
mulai dari E
. Kami hanya tertarik untuk membawa F
ke cabang kerja kami sementara, pada saat yang sama, kami tidak ingin menyimpannya D
karena 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 HEAD
yang induknya ada D
di atas F
.
Dengan kata lain, ubah induk dari E
dari D
menjadi F
. Sintaksnya git rebase --onto
adalah 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 C
dan E
dari urutan yang Anda katakan git rebase --onto B E
, atau rebase HEAD
di atas di B
mana orang tua yang lama berada E
.
The Surgeon: git rebase --onto dengan 3 argumen
git rebase --onto
bisa 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---H
di atas F
, mengabaikan ke mana HEAD
saat ini menunjuk. Kita dapat melakukannya dengan mengatakan git rebase --onto F D H
, yang berarti:
Rebase kisaran komit yang induknya adalah D
sampai dengan H
di atas F
.
Sintaksnya git rebase --onto
dengan 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 HEAD
setelah rebase selesai.