Bencana Git Merge dengan Strategi 'Ours'
Beberapa waktu lalu, saya mengalami bencana ketika hendak memperbarui branch fitur yang sedang saya kerjakan berdasarkan master branch dengan menjalankan git merge master
. Ceritanya, saat itu terjadi konflik di beberapa berkas binary yang memang sudah saya ubah, sementara hampir semua berkas lainnya berhasil diperbarui. Memang, saat itu branch yang saya kerjakan cukup jauh tertinggal dari master branch.
Meskipun jumlah berkas yang terkena konflik masih dapat dihitung dengan jari, saya merasa harusnya ada cara yang lebih cepat untuk memberitahu Git supaya mengambil berkas-berkas yang ada di branch saya ketika terjadi konflik. Toh, saya sudah sepenuhnya yakin semua versi branch saya yang benar pada berkas-berkas yang terjerat konflik tersebut. Saya pun samar-samar ingat kata kunci ours
dalam resolusi konflik di Git, yang pernah saya pelajari dulu.
Tanpa basa-basi dan -yang lebih bodohnya- tanpa membaca dokumentasi, langsung saja saya jalankan:
git reset --hard HEAD~
git merge master -s ours
Sesuai ekspektasi, sekarang Git tidak lagi protes dan mengatakan ada konflik. Saya pun lanjut melakukan commit dan langsung mendorong commit saya ke repositori Github. Tidak lama kemudian, saat teman saya yang bertindak sebagai reviewer hendak memeriksa kode saya di Github, dia pun kaget dan langsung menoleh ke saya.
"Sal, ini kenapa ada 200 lebih files changed-nya ya?"
Hah? Sontak saya kaget. Bagaimana tidak, di branch itu harusnya yang saya ganti tidak sampai sepuluh berkas. Saya pun langsung mencoba menginvestigasi log dari branch tersebut. Ternyata dugaan saya benar, Git bukannya mengambil berkas yang konflik saja dari branch saya, tetapi semua berkas yang memiliki perbedaan dengan master branch, diambilnya dari branch saya.
Setelah bencana itu terjadi, barulah saya baca dokumentasi git merge
dengan lebih jeli. Ternyata memang perintah git merge master -s ours
yang saya masukkan itu didesain untuk mengambil semua berkas yang memiliki perbedaan dari branch yang sedang kita kerjakan (ours
). Untuk membuat Git mengambil hanya berkas yang konflik dari branch yang sedang dikerjakan, harusnya saya masukkan git merge master -s recursive -Xours
.
Akhirnya atas izin sang reviewer yang juga merangkap lead engineer di tim saya, saya melakukan hard reset terhadap branch saya untuk membatalkan merge commit yang bermasalah tadi. Kemudian saya harus melakukan git push --force
ke repositori Github fitur saya karena rollback yang saya lakukan merubah histori branch tersebut.
Pelajaran yang dipetik dari peristiwa ini:
git merge <branch> -s ours // merge lalu ambil semua perubahan dari branch kita
git merge <branch> -s recursive -Xours // merge lalu ambil hanya berkas yang konflik dari branch kita