Bagaimana cara saya menggabungkan komit tertentu dari satu cabang ke cabang lain di Git?

159

Saya memiliki BranchA113 komitmen di depan BranchB.

Tetapi saya hanya ingin 10 atau lebih yang terakhir dilakukan dari BranchAdigabung menjadi BranchB.

Apakah ada cara untuk melakukan ini?

NullVoxPopuli
sumber
6
kemungkinan rangkap dari Bagaimana cara menggabungkan komit tertentu di git
chharvey

Jawaban:

233

The git cherry-pick <commit>perintah memungkinkan Anda untuk mengambil satu komit (dari cabang apa pun) dan, pada dasarnya, rebase di cabang kerja Anda.

Bab 5 dari buku Pro Git menjelaskannya lebih baik daripada yang saya bisa , lengkap dengan diagram dan semacamnya. ( Bab tentang Rebasing juga bacaan yang baik.)

Terakhir, ada beberapa komentar bagus tentang cherry-picking vs merger vs rebasing dalam pertanyaan SO lainnya .

ewall
sumber
1
Pertanyaan: katakanlah komit Aadalah bercabang dari masterdan Anda melakukan beberapa pekerjaan di atasnya, menciptakan komit anak Bmelalui E. Katakanlah Ehanya memiliki 1 baris yang ditambahkan D. Jika Anda git cherry-pick Eke master, apakah itu berlaku semua perubahan dari Amelalui Eke mastercabang, atau apakah itu hanya berlaku perubahan dari Dke E, yaitu, ia menambahkan hanya itu 1 line untuk master? Jika kasusnya adalah yang pertama, bagaimana saya mencapai yang terakhir? (selain dari menyalin dan menempel secara manual)
chharvey
7
git cherry-pick -n <commit> Jika Anda tidak ingin cherry pick berkomitmen otomatis.
Ben Flynn
6

Jika BranchA belum didorong ke remote maka Anda dapat menyusun ulang komit menggunakan rebasedan kemudian cukup merge. Lebih baik menggunakan mergelebih dari rebasemungkin jika tidak membuat duplikat komit.

git checkout BranchA
git rebase -i HEAD~113
... reorder the commits so the 10 you want are first ...
git checkout BranchB
git merge [the 10th commit]
Seth Reno
sumber
2

SUMBER: https://git-scm.com/book/en/v2/Distributed-Git-Maintaining-a-Project#Integrating-Contributed-Work

Cara lain untuk memindahkan karya yang diperkenalkan dari satu cabang ke cabang lainnya adalah dengan memetiknya. Pilih-ceri di Git seperti rebase untuk komit tunggal. Dibutuhkan tambalan yang diperkenalkan di komit dan mencoba untuk menerapkannya kembali di cabang Anda saat ini. Ini berguna jika Anda memiliki sejumlah komit pada cabang topik dan Anda ingin mengintegrasikan hanya satu dari mereka, atau jika Anda hanya memiliki satu komit pada cabang topik dan Anda lebih memilih untuk memilih-ceri daripada menjalankan rebase. Misalnya, Anda memiliki proyek yang terlihat seperti ini:

masukkan deskripsi gambar di sini

Jika Anda ingin menarik komit e43a6 ke cabang master Anda, Anda bisa menjalankan

$ git cherry-pick e43a6
Finished one cherry-pick.
[master]: created a0a41a9: "More friendly message when locking the index fails."
 3 files changed, 17 insertions(+), 3 deletions(-)

Ini menarik perubahan yang sama yang diperkenalkan pada e43a6, tetapi Anda mendapatkan nilai SHA-1 komit baru, karena tanggal yang diterapkan berbeda. Sekarang riwayat Anda terlihat seperti ini:

masukkan deskripsi gambar di sini

Sekarang Anda dapat menghapus cabang topik Anda dan menjatuhkan komit yang tidak ingin Anda tarik.

artamonovdev
sumber