Ini kesepakatannya, saya telah bergabung dengan perusahaan baru dan telah diminta untuk menyelesaikan pekerjaan di cabang yang belum tersentuh selama hampir setahun. Sementara itu, cabang utama telah tumbuh dengan kecepatan tetap. Idealnya saya ingin menggabungkan semua perubahan dari cabang master ke cabang fitur dan melanjutkan pekerjaan dari sana, tapi saya tidak terlalu yakin bagaimana cara mendekati ini.
Bagaimana cara saya melakukan penggabungan ini dengan aman sambil mempertahankan perubahan penting di kedua sisi cabang?
version-control
git
gitflow
Vlad Spreys
sumber
sumber
git cherry-pick
sini?Jawaban:
Pada intinya, cara menggabungkan dua (mungkin tidak kompatibel) kode adalah masalah pengembangan , bukan masalah kontrol versi . Perintah Git merge dapat membantu dalam proses ini, tetapi itu tergantung pada bentuk masalah.
Membandingkan kedua versi dengan basis lebih masuk akal. Ini akan memberi Anda gambaran tentang strategi terbaik untuk meneruskan ini. Pendekatan Anda mungkin berbeda berdasarkan sifat dan tumpang tindih dari perubahan di setiap cabang.
Bayangkan skenario yang ideal: Anda akan menemukan bahwa cabang utama dan cabang fitur masing-masing hanya memodifikasi bagian-bagian kode yang saling eksklusif, sehingga Anda bisa melakukan semua perubahan dan menjadi baik untuk dilakukan.
Tentu saja, itu hampir pasti tidak akan menjadi masalah, tetapi pertanyaannya adalah: seberapa jauh hal itu akan dihapus dari skenario ideal ini? yaitu seberapa berbaurnya perubahan?
Juga, seberapa dewasa cabang fitur lama? Apakah itu dalam kondisi kerja yang baik, atau tidak (atau tidak diketahui)? Berapa banyak fitur yang selesai?
Jika kode yang relevan di cabang utama telah banyak berubah dalam satu tahun terakhir, atau fitur tidak dalam keadaan yang sangat matang, saya mungkin mempertimbangkan untuk membuat garpu baru dari yang terbaru dan secara manual memasukkan fitur lama lagi. Ini akan memungkinkan Anda untuk mengambil pendekatan tambahan untuk membuatnya bekerja.
Jika Anda melakukan banyak gabungan kode yang berantakan dan tidak berfungsi, itu akan sangat sulit untuk di-debug. Jika cabang utama telah banyak berubah selama setahun terakhir, perubahan desain utama mungkin diperlukan untuk fitur agar bisa berfungsi. Tidak akan tepat untuk melakukan perubahan ini melalui "menyelesaikan konflik", karena ini akan membutuhkan membuat semua perubahan sekaligus dan berharap itu berfungsi. Masalah ini akan diperparah oleh kemungkinan bug di cabang yang sudah jadi sebagian.
sumber
Dalam pengalaman git terbatas saya, saya bisa mengatakan bahwa kadang-kadang lebih cepat untuk me-restart cabang fitur lagi jika master sudah terlalu jauh dari titik lepas.
Menggabungkan dua cabang tanpa mengetahui sejarah di balik kode (mengingat bahwa Anda baru saja bergabung dengan proyek) benar-benar sulit, dan saya bertaruh bahwa bahkan pengembang yang mengikuti proyek dari awal kemungkinan akan membuat beberapa kesalahan dalam penggabungan.
Ini tentu saja masuk akal jika cabang fitur tidak besar, tetapi Anda bisa tetap membuka cabang fitur lama , cabang lagi dari master dan secara manual memperkenalkan kembali perubahan yang menyusun fitur itu. Saya tahu ini pendekatan yang paling manual, tetapi memungkinkan Anda untuk memegang kendali penuh seandainya ada kode yang hilang atau dipindahkan.
Pairing programming dengan senior dalam hal ini akan menjadi skenario terbaik, membantu Anda untuk mengenal kode lebih baik.
Bahkan bisa berubah menjadi lebih cepat juga, jika Anda memperhitungkan konflik penggabungan akun dan waktu pengujian!
Saya agak berasumsi bahwa setidaknya mencoba melakukan penggabungan jelas merupakan hal terbaik untuk dilakukan. Jika itu gagal atau ternyata terlalu sulit, maka coba memetik ceri, jika itu salah pergi secara manual.
sumber
git-imerge dirancang persis untuk tujuan ini. Ini adalah alat git yang menyediakan metode untuk penggabungan inkremental . Dengan menggabungkan secara bertahap, Anda hanya perlu berurusan dengan tabrakan antara dua versi, tidak pernah lagi. Selain itu, jumlah penggabungan yang jauh lebih besar dapat dilakukan secara otomatis karena perubahan individu lebih kecil.
sumber
Mencoba untuk menggabungkan kepala utama ke cabang basi setahun bisa menjadi latihan frustrasi dan memperdalam penyok di atas meja dengan dahi Anda.
Jalur utama tidak sampai ke tempatnya dalam satu bulan selama berbulan-bulan. Itu juga memiliki pengembangan dan rilis. Mencoba untuk memperbaruinya dalam satu penggabungan monolitik bisa sangat luar biasa.
Sebagai gantinya, mulailah dengan menggabungkan dari fitur pertama bergabung kembali ke garis utama setelah cabang basi terpecah. Dapatkan bahwa penggabungan kerja. Kemudian fitur selanjutnya bergabung. Dan seterusnya. Banyak dari gabungan fitur tersebut akan bergabung tanpa konflik. Masih penting untuk memastikan bahwa fungsi basi cabang saat ini tetap kompatibel dengan arah yang telah ditempuh jalur utama.
Anda mungkin ingin cabang dari kepala cabang basi untuk peran penggabungan dalam perubahan lainnya. Ini lebih lanjut tentang memastikan bahwa komitmen dan sejarah ketika seseorang melihat kembali jelas dan mengkomunikasikan apa peran dan kebijakan masing-masing cabang. Cabang basi adalah cabang fitur. Cabang tempat Anda bekerja adalah cabang akumulasi dan rekonsiliasi.
Sebagian besar ini akan lebih mudah jika fitur lama atau cabang rilis masih ada di luar sana dan mudah diakses (beberapa tempat memiliki kebijakan untuk membersihkan nama-nama cabang yang lebih tua dari beberapa tanggal sehingga daftar cabang tidak berlebihan) ).
Yang penting dalam semua ini adalah untuk memastikan bahwa Anda menguji dan memperbaiki setelah berhasil menggabungkan setiap bagian dari sejarah arus utama ke tempatnya. Meskipun sesuatu dapat bergabung tanpa konflik, itu berarti kode tersebut tidak bertentangan. Jika cara fitur basi diakses sudah usang atau dihapus, mungkin perlu ada perbaikan setelah penggabungan yang berhasil.
Selain itu, ini juga berfungsi untuk sistem kontrol versi lain. Saya kadang-kadang harus menggabungkan grup svn commit tertentu menjadi cabang (memetik ceri) untuk satu fitur, memperbaiki cabang untuk bekerja dengan fitur itu, dan kemudian menggabungkan grup svn commit berikutnya daripada hanya melakukan svn grosir menggabungkan.
Meskipun seseorang dapat melakukan git cherry-pick di sini, dan memungkinkan melakukan komitmen tertentu , ini memiliki beberapa kelemahan yang dapat mempersulit proses. Pilihan ceri tidak akan menampilkan informasi tentang komit yang Anda pilih (Anda dapat menambahkannya ke pesan komit). Hal ini membuat pelacakan komitmen dalam sejarah menjadi lebih sulit.
Selain itu, itu berarti bahwa Anda tidak akan memutar ulang master secara efektif ke cabang basi - Anda akan memilih fitur yang mungkin tidak lengkap - dan fitur-fitur tersebut mungkin dimainkan secara tidak berurutan.
Alasan utama seseorang harus bergabung dari komitmen historis untuk dikuasai ke cabang basi adalah untuk dapat mempertahankannya, sebut saja "sejarah masa depan" cabang basi dalam keadaan yang dapat Anda alasankan. Anda dapat dengan jelas melihat penggabungan dari sejarah ke cabang basi dan perbaikan untuk mengintegrasikan kembali fungsi. Fitur sedang ditambahkan dalam urutan yang sama seperti yang akan mereka kuasai. Dan ketika Anda selesai, dan akhirnya melakukan penggabungan dari kepala master ke cabang basi, Anda tahu bahwa semuanya telah digabung dan Anda tidak kehilangan komitmen.
sumber
Langkah 1. Pelajari tentang kode, analisis arsitekturnya, dan perubahan yang telah dilakukan pada kedua cabang sejak leluhur bersama terbaru.
Langkah 2. Jika fitur ini muncul secara independen dan menyentuh sebagian besar area kode, menggabungkan, memperbaiki konflik, menguji, memperbaiki dll. Ini adalah jalan yang menyenangkan, Anda cukup baik untuk melakukannya. Kalau tidak, lanjutkan ke Langkah 3
Langkah 3. Analisis wilayah konflik, pahami dampak fungsional dan alasannya secara rinci. Mungkin ada konflik dalam persyaratan bisnis yang muncul di sini. Diskusikan dengan BA, pengembang lain yang sesuai. Dapatkan kerumitan yang terlibat dengan menyelesaikan gangguan.
Langkah 4. Sehubungan dengan hal di atas, putuskan apakah akan menggabungkan / memetik-ceri / bahkan memotong-paste hanya bagian-bagian yang tidak bertentangan dan menulis ulang bagian yang bertentangan, ATAU apakah akan menulis ulang seluruh fitur dari awal .
sumber
1. Beralih ke cabang yang digunakan sebagai cabang pengembang / rilis utama.
Ini adalah cabang yang berisi perubahan terbaru ke sistem. Bisa
master
,core
,dev
, itu tergantung pada perusahaan. Dalam kasus Anda itu mungkinmaster
langsung.Tarik untuk memastikan Anda memiliki versi terbaru dari cabang pengembangan utama yang diperoleh.
2. Periksa dan tarik cabang yang berisi pekerjaan yang seharusnya Anda selesaikan.
Anda menarik untuk memastikan Anda memang memiliki isi cabang terbaru. Dengan memeriksanya secara langsung, tanpa membuatnya secara lokal terlebih dahulu, Anda memastikan untuk tidak memiliki konten baru dari
master
(atau cabang dev utama masing-masing) di dalamnya.3. Gabungkan cabang pengembangan utama ke cabang usang.
The
git merge
perintah akan mencoba untuk menggabungkan isi dari cabang tertentu, dalam hal inimaster
, untuk cabang Anda saat ini di.Penekanan pada akan mencoba . Mungkin ada konflik gabungan, yang perlu diselesaikan oleh Anda dan Anda saja.
4. Perbaiki gabungan konflik, komit, dan dorong perbaikan konflik
Setelah memperbaiki konflik gabungan di semua file di mana ada, panggung, komit, dan dorong resolusi konflik ke
origin
.Anda biasanya dapat menelepon
git add .
untuk menampilkan semua file untuk dikomit. Saat menangani penggabungan konflik, Anda ingin semua file yang diperlukan diperbarui.Catatan tambahan
Menyelesaikan konflik gabungan bisa menjadi pekerjaan yang membosankan. Apalagi jika Anda baru di sebuah perusahaan. Anda mungkin belum memiliki pengetahuan yang tepat untuk menyelesaikan semua konflik penggabungan saja.
Luangkan waktu Anda untuk memeriksa dengan cermat semua konflik yang telah terjadi dan memperbaikinya dengan tepat, sebelum melanjutkan pekerjaan Anda.
Itu bisa terjadi begitu, Anda mulai bekerja pada cabang berumur satu tahun, menggabungkan keadaan perkembangan saat ini ke dalamnya dan tidak akan memiliki konflik penggabungan sama sekali.
Ini terjadi ketika meskipun sistem telah banyak berubah di tahun ini, tidak ada yang menyentuh file yang sebenarnya diubah di cabang berumur satu tahun.
sumber