Bagaimana Memahami dan Memecahkan Konflik di Git

Itu dia, kata yang tidak disukai oleh setiap pengembang: konflik. 😱 Tidak ada jalan keluar dari konflik penggabungan sewaktu bekerja dengan Git (atau sistem kontrol versi lain).

Namun saat berbicara dengan developer, saya sering mendengar bahwa ada rasa cemas atau tidak nyaman seputar topik konflik penggabungan.

Penanganan konflik sering kali tetap menjadi tempat yang gelap dan misterius: situasi di mana banyak hal rusak parah dan tidak jelas bagaimana cara keluar darinya (tanpa memperburuk keadaan).

Meskipun benar bahwa konflik penggabungan adalah bagian yang tidak dapat dihindari dari kehidupan pengembang, ketidaknyamanan dalam situasi ini sepenuhnya opsional.

Tujuan saya dengan artikel ini adalah untuk memperjelas topik ini: bagaimana dan kapan konflik biasanya terjadi, apa sebenarnya konflik itu, dan bagaimana menyelesaikan - atau membatalkan - konflik tersebut.

Jika Anda benar-benar memahami hal-hal ini, Anda akan mampu menangani konflik gabungan dengan cara yang jauh lebih santai dan percaya diri. 😍

Bagaimana dan Kapan Konflik Terjadi

Namanya sudah mengatakannya: "konflik gabungan" dapat terjadi dalam proses mengintegrasikan komit dari sumber yang berbeda.

Perlu diingat, bahwa "integrasi" tidak terbatas hanya pada "menggabungkan cabang". Ini juga bisa terjadi saat melakukan rebasing atau rebasing interaktif, saat melakukan cherry-pick atau pull, atau bahkan saat menerapkan kembali Stash.

Semua tindakan ini melakukan semacam integrasi - dan saat itulah konflik penggabungan dapat terjadi.

Tapi tentu saja, tindakan ini tidak menghasilkan gabungan konflik setiap kali (terima kasih Tuhan!). Idealnya, Anda jarang berada dalam situasi ini. Tapi kapan tepatnya konflik terjadi?

Sebenarnya, kemampuan penggabungan Git adalah salah satu keuntungan terbesarnya: penggabungan cabang bekerja dengan mudah di sebagian besar waktu, karena Git biasanya dapat menyelesaikannya sendiri.

Tetapi ada situasi di mana perubahan kontradiktif dibuat - dan di mana teknologi tidak dapat memutuskan apa yang benar atau salah. Situasi ini hanya membutuhkan keputusan dari manusia.

Klasik sebenarnya adalah ketika baris kode yang sama persis diubah dalam dua komit, pada dua cabang berbeda. Git tidak memiliki cara untuk mengetahui perubahan mana yang Anda sukai! πŸ€”

Ada beberapa situasi lain yang serupa - misalnya ketika file dimodifikasi di satu cabang dan dihapus di cabang lain - tetapi itu sedikit kurang umum.

The "Menara" Git GUI desktop , misalnya, memiliki bagus cara memvisualisasikan situasi semacam ini:

Bagaimana Mengetahui Saat Konflik Telah Terjadi

Jangan khawatir: Git akan memberi tahu Anda dengan sangat jelas saat konflik telah terjadi. πŸ˜‰  

Pertama, ini akan memberi tahu Anda segera dalam situasi tersebut , misalnya ketika penggabungan atau rebase gagal karena konflik:

$ git merge develop Auto-merging index.html CONFLICT (content): Merge conflict in index.html CONFLICT (modify/delete): error.html deleted in HEAD and modified in develop. Version develop of error.html left in tree. Automatic merge failed; fix conflicts and then commit the result.

Seperti yang Anda lihat dari contoh di atas, ketika saya mencoba melakukan penggabungan, saya membuat konflik penggabungan - dan Git mengkomunikasikan masalahnya dengan sangat jelas dan segera:

  • Terjadi konflik dalam file "index.html".
  • Konflik lain dalam file "error.html" terjadi.
  • Dan akhirnya, karena konflik tersebut, operasi penggabungan gagal.

Ini adalah situasi di mana kita harus menggali kode dan melihat apa yang harus dilakukan.

Jika Anda melewatkan pesan peringatan ini ketika konflik terjadi, Git juga memberi tahu Anda setiap kali Anda menjalankan git status:

$ git status On branch main You have unmerged paths. (fix conflicts and run "git commit") (use "git merge --abort" to abort the merge) Unmerged paths: (use "git add/rm ..." as appropriate to mark resolution) deleted by us: error.html both modified: index.html

Dengan kata lain: jangan khawatir tentang tidak memperhatikan konflik gabungan. Git memastikan Anda tidak bisa mengabaikannya.

Bagaimana Membatalkan Konflik di Git dan Memulai Kembali

Gabungkan konflik datang dengan suasana urgensi tertentu. Dan memang seharusnya demikian: Anda harus menghadapinya sebelum Anda dapat melanjutkan pekerjaan Anda.

Tetapi meskipun mengabaikannya bukanlah suatu pilihan, "menangani konflik gabungan" tidak selalu berarti Anda harus menyelesaikannya. Membatalkannya juga dimungkinkan!

Ini mungkin perlu diulang: Anda selalu memiliki opsi untuk mengurungkan konflik penggabungan dan kembali ke keadaan sebelumnya. Ini benar bahkan ketika Anda sudah mulai menyelesaikan file yang konflik dan menemukan diri Anda berada di jalan buntu.

Dalam situasi ini, sangat bagus untuk diingat bahwa Anda selalu dapat memulai kembali dan kembali ke keadaan bersih bahkan sebelum konflik terjadi.

Untuk tujuan ini, sebagian besar perintah dilengkapi dengan --abortopsi, misalnya git merge --abortdan git rebase --abort:

$ git merge --abort $ git status On branch main nothing to commit, working tree clean

Ini akan memberi Anda kepercayaan diri bahwa Anda benar-benar tidak bisa mengacaukan. Anda selalu dapat membatalkan, kembali ke keadaan bersih, dan memulai kembali.

Seperti Apa Sebenarnya Konflik di Git

Sekarang, aman dalam pengetahuan bahwa tidak ada yang bisa pecah, mari kita lihat seperti apa sebenarnya konflik di balik tenda. Ini akan mengungkap para pengacau kecil itu dan, pada saat yang sama, membantu Anda kehilangan rasa hormat terhadap mereka dan mendapatkan kepercayaan pada diri sendiri.

Sebagai contoh, mari kita lihat konten file "index.html" (yang saat ini berkonflik) di editor:

Git berbaik hati untuk menandai area masalah di file, memasukkannya ke dalam <<<<<<< HEADdan >>>>>>> [other/branch/name]. Konten yang muncul setelah penanda pertama berasal dari cabang kerja kami saat ini. Akhirnya, garis dengan =======karakter memisahkan dua perubahan yang saling bertentangan.

Cara Memecahkan Konflik di Git

Tugas kita sebagai pengembang sekarang adalah membersihkan baris-baris ini: setelah kita selesai, file harus terlihat persis seperti yang kita inginkan.

Mungkin perlu untuk berbicara dengan rekan satu tim yang menulis perubahan "lainnya" dan memutuskan kode mana yang benar. Mungkin ini milik kita, mungkin milik mereka - atau mungkin campuran antara keduanya.

This process - cleaning up the file and making sure it contains what we actually want - doesn't have to involve any magic. You can do this simply by opening your text editor or IDE and starting to making your changes.

Often, however, you'll find that this is not the most efficient way. That's when dedicated tools can save time and effort:

  • Git GUI Tools: Some of the graphical user interfaces for Git can be helpful when solving conflicts. The Tower Git GUI, for example, offers a dedicated "Conflict Wizard" that helps visualize and solve the situation:
  • Dedicated Merge Tools: For more complicated conflicts, it can be great to have a dedicated "Diff & Merge Tool" at hand. You can configure your tool of choice using the "git config" command. (Consult your tool's documentation for detailed instructions.) Then, in case of a conflict, you can invoke it by simply typing git mergetool. As an example, here's a screenshot of "Kaleidoscope" on macOS:

After cleaning up the file - either manually or in a Git GUI or Merge Tool - we have to commit this like any other change:

  • By using git add on the (previously) conflicted file, we inform Git that the conflict has been solved.
  • When all conflicts have been solved and added to the Staging Area, you need to complete the resolution by creating a regular commit.

How to Become More Confident and Productive

Many years ago, when I started using version control, merge conflicts regularly freaked me out: I was afraid that, finally, I had managed to break things for good. 😩

Only when I took the time to truly understand what was going on under the hood was I able to deal with conflicts confidently and efficiently.

The same was true, for example, when dealing with mistakes: only once I learned how to undo mistakes with Git was I able to become more confident and productive in my work.

I highly recommend taking a look at the free "First Aid Kit for Git", a collection of short videos about how to undo and recover from mistakes with Git.

Have fun becoming a better programmer!

About the Author

Tobias GΓΌnther is the CEO of Tower, the popular Git desktop client that helps more than 100,000 developers around the world to be more productive with Git.