Solusi Topik
Perintah yang benar untuk menjawab pertanyaan yang diposting dapat berupa salah satu dari yang berikut (dengan asumsi cabang topicsudah 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 topictidak dicentang, Anda cukup menambahkan topicperintah (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 featuresebagai <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, Datau 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 mastersemua akan mengakibatkan berkomitmen Bmelayani 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, Zuntuk melakukan Ddan berakhir melompat-lompat Bdan Ckarena mereka sudah telah diterapkan.
git rebase --onto C X feature
Akan menerapkan komit Ydan Zberkomitmen C, menghapus komit secara efektifX
git checkout Bsebelum menjalankangit rebase?