Blog_24_Agustus_-_Berdamai_dengan_Merge_-_Conflict

Berdamai dengan Merge-Conflict

Sebagai seorang developer yang sedang mengembangkan sebuah project aplikasi pasti tidak asing lagi dengan layanan version control, seperti Git, GitHub, atau GitLab. Cek tulisan blog Perbedaan Git dan GitHub untuk memahami perbedaan antara keduanya. Nah, dalam proses pengembangan aplikasi pasti pernah dong melewati suka duka atau drama yang menyebalkan dan memusingkan, salah satu yang berkaitan dengan layanan version control, yaitu merge-conflict. Apakah kamu salah satu yang membenci conflict satu ini?

Tulisan ini akan membahas apa itu merge-conflict, bagaimana dan kapan kemunculannya, dan cara mengatasinya. Yuk, baca sampai habis.

Apa itu merge-conflict, kapan, dan bagaimana muncul?

Merge-conflict merupakan sebuah kasus di mana terdapat pertentangan (conflict) ketika proses integrasi (merge) antara dua source berbeda. Proses integrasi (merge) yang dimaksud bukan hanya melibatkan perubahan antar branch saja, melainkan selama perintah yang dieksekusi dapat men-trigger proses integrasi maka conflict dapat terjadi, misalnya sebagai berikut.

đź’» Mulai Belajar Pemrograman

Belajar pemrograman di Dicoding Academy dan mulai perjalanan Anda sebagai developer profesional.

Daftar Sekarang
  • Mengembalikan perubahan yang disimpan di git stash.
  • Mengambil perubahan dari remote branch dengan perintah git pull.
  • Menjalankan perintah git merge untuk menyatukan perubahan ke branch master.
  • Menjalankan perintah git rebase untuk mengintegrasikan perubahan pada current branch dengan branch master.
  • Memilih beberapa commit untuk dipindahkan ke branch lain dengan perintah git cherry-pick.

Meskipun begitu, setiap aksi di atas tidak selalu menghasilkan conflict karena Git dapat menentukan cara mengaplikasikan perubahan antara dua source yang berbeda.

Namun, pada situasi tertentu Git juga akan sulit untuk menentukan perubahan yang akan diterapkan, salah satunya contradictory changes (perubahan yang menimbulkan pertentangan) saat terdeteksi terdapat perubahan yang bertentangan pada suatu file atau komponen.

contoh merge-conflict

Gambar di atas merupakan contoh perbedaan baris kode yang terdapat conflict. File tersebut adalah sebuah Todo List berisi beberapa item di dalamnya. Kedua source 1 (theirs) dan source 2 (yours) melakukan editing dan penambahan item pada file yang sama, berikut ini penjelasannya,

  1. Source 2 menambahkan item “Call Mama” pada baris ke-4, Git tidak mendeteksi conflict atau pertentangan pada source 1 dan merge dapat dilakukan secara otomatis, baris ke-4 pada source 1 akan terisi item “Call Mama”.
  2. Kasus contradictory changes, perubahan di dalam box warna kuning seperti pada gambar di atas adalah contoh contradictory yang tidak dapat dieksekusi oleh Git secara otomatis, berikut ini penjabarannya,
    Perbedaan Source 1 Perbedaan Source 2
    Baris 6 -> 7 Dicentang dengan item berisikan “Writing a blog” Baris 7 Tidak dicentang dengan item berisikan “Writing a story”
    Baris 7 -> 8 Tidak dicentang Baris 8 Dicentang
    Baris 8 -> 9 Tidak dicentang Baris 9 Dicentang
  3. Bagaimana dengan kasus baris ke-10 pada source 2? Bukankah mirip dengan kriteria pada kasus pertama? Kenapa dianggap perubahan yang contradictory? Jawabannya simple karena letaknya cukup dekat dengan baris-baris yang terdeteksi contradictory pada kasus kedua.

Faktor lain yang memicu conflict adalah ketika terdapat perbedaan file akibat dihapus atau diubah. Pada saat itu Git akan kebingungan dalam menentukan perubahan yang kita inginkan.

Mengatasi conflicts

Mendeteksi adanya conflicts

Setelah terdeteksi adanya conflict, Git akan menunjukkan pesan error. Saat itu juga proses merging akan gagal dilakukan. Berikut contoh pesan error yang muncul setelah Git berusaha untuk melakukan merge antar-branch.

contoh error merge-conflict

Pastikan kamu mendapatkan informasi perubahan yang gagal di-merge. Kamu juga dapat menggunakan perintah git status untuk mendapatkan status kondisi branch saat itu. Dalam kasus ini, Git akan mengembalikan informasi perubahan yang gagal di-merge beserta lokasinya, contoh pada kasus ini adalah file todolist_140822.text.

Cek status menggunakan git status

Conflict memang tidak dapat diabaikan sehingga tidak ada kata lain selain mengatasinya. Ada dua langkah yang dapat kamu lakukan untuk mengatasi conflict.

Melakukan undo dan memulai dari awal

Pada kasus tertentu, kamu dapat menggunakan parameter –abort. Misalnya, untuk kasus merge dan rebase menggunakan perintah git merge –abort dan git rebase –abort. Hal tersebut dapat mengembalikan kondisi sebelum conflict terjadi. Cara ini juga dapat dilakukan ketika kamu menemukan jalan buntu dalam proses perbaikan konflik (conflict).

Menyelesaikan konflik (resolve conflict)

Saat berpapasan dengan conflict maka keinginan yang terbesit adalah bagaimana agar perubahan yang kita lakukan masih dapat diterapkan berdampingan dengan perubahan dari source yang lain. Jika perubahan yang terjadi hanya pada file yang kamu buat sendiri, kamu dapat menyelesaikannya secara mandiri. Namun, lain ceritanya jika conflict terjadi karena perubahan lain berasal dari orang lain, pastinya kamu perlu persetujuan darinya sebelum menentukan perubahan yang ingin dipertahankan.

Proses resolve juga dapat dilakukan langsung pada IDE (Integrated Development Environment). Pada masa sekarang, IDE dapat terintegrasi dengan Git atau layanan Github dan sudah didukung visualisasi atau GUI (Graphical user interface) yang akan memudahkan kamu untuk mengetahui perubahan yang ditambahkan pada suatu source.

Contoh GUI untuk resolve merge conflict
Seperti pada gambar di atas ini, terdapat dua source yang menambahkan perubahan pada file yang sama. Selanjutnya, kamu dapat menentukan bagian mana yang ingin kamu pertahankan atau resolve sebelum melanjutkan proses rebase/merge. Pada umumnya, kamu akan mendapat empat pilihan dalam proses resolve ini. Mari kita gambarkan apabila kasus ini terjadi antara source milikmu dan temanmu. Untuk memudahkan pemahamanmu terkait hal tersebut, perhatikan penjelasan di bawah ini.

  • Keep yours (Hanya perubahan dari source milikmu yang akan diterapkan).
  • Keep theirs (Hanya perubahan dari source milik temanmu yang akan diterapkan).
  • Keep both (Perubahan dari kedua source milikmu dan temanmu akan diterapkan).
  • Remove both (Perubahan dari kedua source akan dihapus).

Memperkecil gangguan dari merge-conflict

Setiap masalah memiliki sebab dan penyelesaiannya, tetapi juga tidak mustahil apabila memiliki cara untuk menghindarinya. Berkaca dari pengalaman berurusan dengan conflict saat menggunakan version control, kami akan merangkum langkah yang dapat mengurangi kemungkinan terjadinya conflict.

  • Don’t panic
    Berurusan dengan kasus conflict kadang memang memusingkan, apalagi jika conflict terjadi dalam skala yang besar. Namun, jangan panik. Sangat disarankan untuk membaca dahulu pesan eror yang diberikan karena bisa jadi terdapat anjuran yang dapat menyelesaikan conflict tersebut. Kamu juga dapat meminta bantuan jika menemui kesulitan yang serupa melalui situs stackoverflow.com atau bertanya langsung kepada temanmu
  • Always keep branch sync with the main branch
    Selalu rebase perubahan dari branch utama (main/master) ke branch yang sedang kamu gunakan sebelum menambahkan perubahan yang baru.
  • Do pull before push
    Lakukan pull sebelum push pada branch origin untuk memastikan bahwa tidak ada lagi perubahan yang tertinggal sebelum menambahkan perubahan yang baru.
  • Keep the changes smaller as possible
    Semakin kecil perubahan yang dibuat, semakin kecil pula area yang berpotensi contradictory sehingga dapat meminimalisasi kemungkinan terjadinya conflict. Hal ini juga akan mempermudah kita dalam me-resolve area conflict karena cakupannya yang kecil.

Layaknya error atau bug yang sering kita temui. Walaupun terkesan menyebalkan, tetapi seiring waktu akan menjadi hal yang biasa karena kita tahu cara mengatasinya. Itu pula yang kita rasakan di merge-conflict yang awalnya menyebalkan akan menjadi hal yang biasa, bahkan dapat menjadikan kita lebih memahaminya.

Nah, apakah kamu adalah salah satu yang akan berdamai dengan conflict satu ini?

Referensi:


Belajar Pemrograman Gratis
Belajar pemrograman di Dicoding Academy dan mulai perjalanan Anda sebagai developer profesional.