Saya telah bercabang cabang dari repositori di GitHub dan melakukan sesuatu yang spesifik untuk saya. Sekarang saya menemukan repositori asli memiliki fitur bagus yang ada di HEAD
.
Saya ingin menggabungkannya hanya tanpa komitmen sebelumnya. Apa yang harus saya lakukan? Saya tahu cara menggabungkan semua komitmen:
git branch -b a-good-feature
git pull repository master
git checkout master
git merge a-good-feature
git commit -a
git push
Jawaban:
'
git cherry-pick
' harus menjadi jawaban Anda di sini.Jangan lupa membaca jawaban bdonlan tentang konsekuensi memetik ceri di pos ini:
"Tarik semua komit dari cabang, tekan komit yang ditentukan ke yang lain" , di mana:
menjadi:
sumber
Anda dapat menggunakan git cherry-pick untuk menerapkan satu komit dengan sendirinya ke cabang Anda saat ini.
Contoh:
git cherry-pick d42c389f
sumber
git cherry-pick d42c
ataugit cherry-pick d42c3
akan berhasil. Git pintar. ;)d42c389f
. Mungkin OP tidak peduli tentang membuat penggabungan per se, tetapi perbedaannya terkadang penting.Mari kita coba mengambil contoh dan memahami:
Saya memiliki cabang, katakan master , menunjuk ke X <commit-id>, dan saya memiliki cabang baru yang menunjuk ke Y <sha1>.
Di mana Y <commit-id> = <master> cabang melakukan - sedikit komitmen
Sekarang katakanlah untuk cabang Y saya harus menutup-menutup komit antara cabang master dan cabang baru. Di bawah ini adalah prosedur yang bisa kita ikuti:
Langkah 1:
di mana lokal adalah nama cabang. Nama apa pun bisa diberikan.
Langkah 2:
Gabungkan komit dari cabang master ke cabang baru dan juga buat komit gabung dari pesan log dengan deskripsi satu-baris dari paling banyak <n> komit aktual yang sedang digabung.
Untuk informasi lebih lanjut dan parameter tentang penggabungan Git, silakan merujuk ke:
Juga jika Anda perlu menggabungkan komit tertentu, maka Anda dapat menggunakan:
sumber
Y
dalam kalimat 3d Anda? "Saya punya cabang baru yang menunjuk ke Y" vs "Sekarang katakan untuk cabang Y", sepertinya Y dulu komit dan kemudian menjadi cabangDalam kasus penggunaan saya, kami memiliki kebutuhan yang sama untuk CD CI. Kami menggunakan aliran git dengan mengembangkan dan menguasai cabang. Pengembang bebas untuk menggabungkan perubahan di sana secara langsung untuk mengembangkan atau melalui permintaan tarik dari cabang fitur. Namun untuk menguasai, kami hanya menggabungkan komit stabil dari cabang pengembangan dengan cara otomatis melalui Jenkins.
Dalam hal ini melakukan cherry-pick bukanlah pilihan yang baik. Namun kami membuat cabang lokal dari commit-id kemudian menggabungkan cabang lokal tersebut untuk dikuasai dan melakukan verifikasi mvn clean (kami menggunakan maven). Jika berhasil maka lepaskan artefak versi produksi ke nexus menggunakan plugin rilis pakar dengan localCheckout = opsi benar dan pushChanges = false. Akhirnya ketika semuanya berhasil maka dorong perubahan dan tag ke asal.
Cuplikan kode contoh:
Anggap saja Anda master jika dilakukan secara manual. Namun pada jenkins, ketika Anda checkout repo Anda akan berada di cabang default (master jika dikonfigurasi).
Ini akan memberi Anda kontrol penuh dengan merger atau konflik neraka tanpa rasa takut.
Jangan sungkan untuk memberi saran jika ada opsi yang lebih baik.
sumber
Jawaban utama menjelaskan bagaimana menerapkan perubahan dari komit tertentu ke cabang saat ini. Jika itu yang Anda maksud dengan "cara menggabungkan", maka gunakan saja cherry-pick seperti yang disarankan.
Tetapi jika Anda benar-benar menginginkan penggabungan , yaitu Anda ingin komit baru dengan dua orang tua - komit yang ada di cabang saat ini, dan komit yang ingin Anda terapkan perubahannya - maka pemilihan ceri tidak akan mencapai itu.
Memiliki riwayat gabungan yang sebenarnya mungkin diinginkan, misalnya, jika proses build Anda memanfaatkan git keturunan untuk secara otomatis mengatur string versi berdasarkan tag terbaru (menggunakan
git describe
).Alih-alih memilih ceri, Anda dapat melakukan yang sebenarnya
git merge --no-commit
, dan kemudian secara manual menyesuaikan indeks untuk menghapus perubahan yang tidak Anda inginkan.Misalkan Anda berada di cabang
A
dan Anda ingin menggabungkan komit di ujung cabangB
:Sekarang Anda siap membuat komit dengan dua orang tua, tip saat ini adalah dari
A
danB
. Namun Anda mungkin memiliki lebih banyak perubahan yang diterapkan daripada yang Anda inginkan, termasuk perubahan dari komit sebelumnya pada cabang B. Anda harus membatalkan perubahan yang tidak diinginkan ini, lalu komit.(Mungkin ada cara mudah untuk mengatur status direktori kerja dan indeks kembali ke keadaan sebelum penggabungan, sehingga Anda memiliki papan tulis yang bersih untuk memilih komit yang Anda inginkan di tempat pertama. Tapi Saya tidak tahu cara mencapai yang bersih,
git checkout HEAD
dangit reset HEAD
keduanya akan menghapus status gabungan, mengalahkan tujuan metode ini.)Jadi secara manual batalkan perubahan yang tidak diinginkan. Misalnya, Anda bisa
untuk setiap komit yang tidak diinginkan
012ea56
.Setelah selesai menyesuaikan hal-hal, buat komit Anda:
Sekarang Anda hanya memiliki perubahan yang Anda inginkan, dan pohon keturunan menunjukkan bahwa Anda secara teknis bergabung dari B.
sumber