Solusi Topik
Perintah yang benar untuk menjawab pertanyaan yang diposting dapat berupa salah satu dari yang berikut (dengan asumsi cabang topic
sudah diperiksa):
git rebase --onto B master
git rebase --onto master~1 master
git rebase --onto B A
git rebase --onto B C
git rebase --onto B
Jika topic
tidak dicentang, Anda cukup menambahkan topic
perintah (kecuali yang terakhir) seperti:
git rebase --onto B master topic
Atau, periksa cabang pertama dengan:
git checkout topic
Rebase Setiap String Komit ke Komit Target
Bentuk dasar dari perintah yang kita butuhkan, yang dikutip dari dokumentasi, adalah:
git rebase --onto <Target> [<Upstream> [<Branch>]]
<Branch>
bersifat opsional dan yang dilakukannya hanyalah memeriksa cabang yang ditentukan sebelum menjalankan sisa perintah. Jika Anda sudah memeriksa cabang yang ingin Anda rebase, maka Anda tidak perlu ini. Perhatikan bahwa Anda harus menentukan <Upstream>
untuk menentukan <Branch>
atau git akan berpikir Anda menentukan <Upstream>
.
<Target>
adalah komitmen yang akan kami lampirkan pada komitmen kami. Saat memberikan nama cabang, Anda cukup menentukan komit kepala cabang itu. <Target>
bisa berupa komit apa pun yang tidak akan dimuat dalam string komit yang dipindahkan. Sebagai contoh:
A --- B --- C --- D master
\
\-- X --- Y --- Z feature
Untuk memindahkan seluruh cabang fitur, Anda tidak dapat memilih X
, Y
, Z
, atau feature
sebagai <Target>
karena mereka semua komit dalam kelompok dipindahkan.
<Upstream>
istimewa karena dapat berarti dua hal yang berbeda. Jika itu adalah komit yang merupakan leluhur dari cabang yang diperiksa, maka itu berfungsi sebagai titik potong. Dalam contoh saya disediakan, ini akan menjadi sesuatu yang tidak C
, D
atau master
. Semua komit setelah <Upstream>
sampai kepala cabang yang diperiksa adalah yang akan dipindahkan.
Namun, jika <Upstream>
bukan leluhur, maka git mencadangkan rantai dari komit yang ditentukan sampai jika menemukan leluhur yang sama dengan cabang yang dicentang (dan batal jika tidak dapat menemukannya). Dalam kasus kami, seorang <Upstream>
dari B
, C
, D
, atau master
semua akan mengakibatkan berkomitmen B
melayani sebagai titik potong. <Upstream>
itu sendiri merupakan perintah opsional dan jika tidak ditentukan, maka git melihat induk dari cabang yang diperiksa yang setara dengan memasukkan master
.
Sekarang git telah memilih commit yang akan dipotong dan dipindahkan, ia menerapkannya untuk <Target>
, melompati semua yang sudah diterapkan pada target.
Contoh dan Hasil yang Menarik
Menggunakan titik awal ini:
A --- B --- C --- D --- E master
\
\-- X --- Y --- Z feature
git rebase --onto D A feature
Akan berlaku komit B
, C
, X
, Y
, Z
untuk melakukan D
dan berakhir melompat-lompat B
dan C
karena mereka sudah telah diterapkan.
git rebase --onto C X feature
Akan menerapkan komit Y
dan Z
berkomitmen C
, menghapus komit secara efektifX
git checkout B
sebelum menjalankangit rebase
?