Sunday, January 12, 2025

Trik Untuk Cherry-Picking Fitur Dari Cabang Tertentu

 
Terkadang, kita butuh melakukan pindah base untuk cabang fitur. Misalnya, tadinya kita membuat fitur dari base dev tetapi kemudian diputuskan semua fitur harus dimulai dari base main. Maka mau tak mau kita harus melakukan cherry-pick atas fitur-fitur itu dari base dev dan dipindah ke base main.


Pertama, project manager atau developer harus selalu mencatat / melacak cabang-cabang dan commit-commit terkait fitur tersebut;


Kedua,  dari git log, lacak saat cabang fitur digabung (merge) dengan branch.

git log --first-parent


Saya biasanya lebih suka menyimpannya dalam bentuk file.

git --no-pager --first-parent > nama_git_log_sesuka_hati.log 


Ketiga, catat commit-commit saat merge dan catat pula merge sebelumnya.


Keempat, buat salinan direktori project untuk referensi. Karena terkadang saat cherry-picking, ada konflik di mana kita terpaksa melihat referensi perbedaan antara commit merge dengan commit sebelumnya.


Kelima, buat cabang baru dari base baru yang akan dijadikan cabang fitur.

Misalnya, untuk bikin branch baru dengan main sebagai base:

git checkout main

git checkout -b feature/new-feature



Kelima, lakukan cherry-pick

git cherry-pick -m 1 <nomor commit>

Umumnya, kita cherry-pick dari parent pertama sehingga biasanya parameter -m selalu 1.


Keenam, jika terjadi konflik, lakukan merge dengan teliti. Saya biasanya pakai tools meld ( https://meldmerge.org/ ).

git mergetool -t meld


Jika ragu, lihat referensi dari  salinan direktori yang kita buat di langkah keempat.

cd copy-project
git difftool -t meld <commit merge> <commit sebelumnya> -- <nama file>


Ketujuh, coba compile dan jalankan semua unit test untuk memastikan semua berjalan baik-baik saja.


Kedelapan, jika ada file yang kurang, lacak dari branch merge mana file tersebut ditambahkan.

Kesembilan, jika yakin, silakan commit untuk menuntaskan cherry-pick.

git commit

jika tak yakin, silakan abort

git cherry-pick --abort


Selamat mencoba.




0 comments: