Saat ini, di tempat saya sekarang dipercaya untuk jadi maintainer salah satu project dengan git history yang sudah lama. Mengurus deployment ke training server untuk test fitur-fitur atau fix atau improvement, dan melakukan deployment ke live server.
Masalah datang ketika branch master (live server) dan branch dev (training server) ini sudah tidak sejalan, jika melakukan branching dari dev lalu merge ke branch master, merge conflict-nya ini terlalu banyak untuk di solve 1-1
Mungkin ini hanya terjadi di tempat saya sekarang, atau mungkin issue ini sudah jadi issue umum ketika maintenance project lama dengan codebase yang besar, entahlah.
dan pertanyaan 2 miliar-nya adalah, bagaimana untuk solve case seperti ini?
Please welcome git cherry-pick
Simplenya, siapkan dulu commit-commit dari changes yang mau di-apply, bisa di save dulu ke note mungkin. Lalu buat branch baru dari branch staging, checkout ke branch baru ini, dan git cherry-pick <commit-hash> nya 1-1 dari commit paling awal (terlama sampai terbaru) sambil diliat tiap-tiap cherry-picknya ini jika ada conflict.
Penjelasan panjangnya, git cherry-pick biasa ini digunakan untuk mengambil commit-commit tertentu, jadi
- Siapkan commit-commit yang akan diambil dari branch dev, misal untuk mengambil fitur A, siapkan commit-commitnya dari ketika pertama fitur A dibuat
- Buat branch baru dari branch staging, pastikan sudah melakukan git pullsebelum melakukan branching
- git checkoutke branch baru hasil branching dari staging
- git cherry-picksatu per satu commit yang sudah disiapkan tadi dari commit paling awal sampai terbaru. cherry-pick satu per satu ini agar bisa cek juga ketika ada conflict
- Jika semua commit sudah ter-apply, saatnya cek dengan git diff <branch dev> -- folder/file yang diubah
- Hasil pada poin 5 ini akan kosoong jika branch file yang dibandingkan ini dengan file dari branch dev sudah sama, berarti process cherry-pick untuk apply commit-commit-nya ini sudah sesuai. Atau jika ada output, bisa di cek sekaligus jika perbedaannya itu karena ada commit yang kurang, atau tidak berhubungan dengan fitur A ini.
- Setelah dipastikan aman, saatnya create Merge Request dari branch ini ke branch staging, harus-nya sudah tidak ada merge conflict lagi. Setelah review aman, merge MR ini, dan buat merge request baru daristagingke branchmaster
Note:
- Mungkin ada yang bingung kenapa sampai ada 3 branch utama
master,staging, dandev, branchstagingdi tempat saya sekarang digunakan untuk menampung dulu hasil cherry-pick dari branchdev, lalu setelah semua aman, baru di merge ke branchmaster, jadi branchstagingini akan selalu sama dengan branchmasterdan bisa langsung di merge tanpa ada conflict. Berbeda dengan branchdev, biasanya banyak fitur yang telah dikembangkan tidak jadi digunakan di live, dan traffic branchdevini akan selalu ramai untuk testing, karena itu tidak bisa merge langsung daridevkestagingataumastertanpa conflict.- Adanya branch
stagingini juga mempermudah proses revert commit jika misal deployment saat itu ada fatal error, dan harus melakukan rollback seluruh changes pada deployment saat itu.