Sejak saat git cherry-pickbelajar untuk dapat menerapkan banyak komit, perbedaannya memang menjadi agak diperdebatkan, tetapi ini adalah sesuatu yang disebut evolusi konvergen ;-)
Perbedaan sebenarnya terletak pada niat asli untuk membuat kedua alat tersebut:
git rebaseTugasnya adalah meneruskan serangkaian perubahan yang dimiliki pengembang dalam repositori pribadinya, yang dibuat terhadap versi X dari beberapa cabang hulu, ke versi Y dari cabang yang sama (Y> X). Ini secara efektif mengubah dasar rangkaian komit tersebut, karenanya "rebasing".
(Ini juga memungkinkan pengembang untuk mentransplantasikan serangkaian komit ke komit sewenang-wenang, tetapi penggunaan ini kurang jelas.)
git cherry-pickadalah untuk membawa komitmen menarik dari satu lini pengembangan ke lini lain. Contoh klasik adalah mem-backport perbaikan keamanan yang dibuat pada cabang pengembangan yang tidak stabil ke cabang yang stabil (pemeliharaan), yang mergetidak masuk akal, karena akan membawa banyak perubahan yang tidak diinginkan.
Sejak kemunculannya yang pertama, git cherry-picktelah dapat memilih beberapa komit sekaligus, satu per satu.
Oleh karena itu, mungkin perbedaan paling mencolok antara kedua perintah ini adalah bagaimana mereka memperlakukan cabang tempat mereka bekerja: git cherry-pickbiasanya membawa komit dari tempat lain dan menerapkannya di atas cabang Anda saat ini, merekam komit baru , sambil git rebasemengambil cabang Anda saat ini dan menulis ulang serangkaian tipnya sendiri berlaku dalam satu atau lain cara. Ya, ini adalah deskripsi yang sangat bodoh tentang apa yang git rebasebisa dilakukan, tetapi disengaja, untuk mencoba membuat gagasan umum meresap.
Perbarui untuk lebih menjelaskan contoh penggunaan yang git rebasesedang dibahas.
Mengingat situasi ini,

Buku menyatakan:
Namun, ada cara lain: Anda dapat mengambil patch dari perubahan yang diperkenalkan di C3 dan menerapkannya kembali di atas C4. Di Git, ini disebut rebasing. Dengan perintah rebase, Anda dapat mengambil semua perubahan yang dilakukan pada satu cabang dan menerapkannya ke cabang lain.
Dalam contoh ini, Anda akan menjalankan yang berikut ini:
$ git checkout experiment
$ git rebase master
First, rewinding head to replay your work on top of it...
Applying: added staged command
"Tangkapan" di sini adalah bahwa dalam contoh ini, cabang "eksperimen" (subjek untuk rebasing) pada awalnya bercabang dari cabang "master", dan karenanya berbagi commit C0 hingga C2 dengannya - secara efektif, "eksperimen" adalah " master "hingga, dan termasuk, C2 plus commit C3 di atasnya. (Ini adalah kasus yang paling sederhana; tentu saja, "eksperimen" dapat berisi beberapa lusinan commit di atas basis aslinya.)
Sekarang git rebasediperintahkan untuk rebase "percobaan" ke saat ujung "master", dan git rebaseberjalan seperti ini:
- Berjalan
git merge-baseuntuk melihat komit terakhir yang dibagi oleh "eksperimen" dan "master" (apa tujuan pengalihan, dengan kata lain). Ini C2.
- Menghemat semua komitmen yang dibuat sejak titik pengalihan; dalam contoh mainan kami, hanya C3.
- Mundurkan HEAD (yang menunjuk ke ujung komit dari "eksperimen" sebelum operasi mulai dijalankan) untuk menunjuk ke ujung "master" - kami melakukan rebasing ke atasnya.
- Mencoba untuk menerapkan setiap komit yang disimpan (seolah-olah dengan
git apply) secara berurutan. Dalam contoh mainan kami itu hanya satu komit, C3. Katakanlah aplikasinya akan menghasilkan komit C3 '.
- Jika semua berjalan dengan baik, referensi "percobaan" diperbarui untuk menunjuk ke komit yang dihasilkan dari penerapan komit tersimpan terakhir (C3 'dalam kasus kami).
Sekarang kembali ke pertanyaan Anda. Seperti yang Anda lihat, di sini secara teknis git rebase memang mentransplantasikan serangkaian komit dari "eksperimen" ke ujung "master", sehingga Anda berhak mengetahui bahwa memang ada "cabang lain" dalam proses tersebut. Tapi intinya adalah bahwa tip komit dari "eksperimen" akhirnya menjadi komit tip baru dalam "eksperimen", itu baru saja mengubah dasarnya:

Sekali lagi, secara teknis Anda dapat mengatakan bahwa di git rebasesini menggabungkan komit tertentu dari "master", dan ini sepenuhnya benar.