Itu dia, kata yang dibenci oleh setiap pembangun: konflik. ? Tidak ada cara untuk mengatasi konflik penggabungan sesekali ketika bekerja dengan Git (atau sistem kawalan versi lain).
Tetapi ketika bercakap dengan pembangun, saya sering mendengar bahawa ada perasaan cemas atau tidak selesa mengenai topik konflik gabungan.
Mengendalikan konflik sering menjadi tempat yang gelap dan penuh misteri: keadaan di mana keadaan rosak teruk dan tidak jelas bagaimana untuk keluar dari situ (tanpa memburukkan keadaan)
Walaupun benar bahawa konflik penggabungan adalah bahagian yang tidak dapat dielakkan dalam kehidupan pemaju, ketidakselesaan dalam situasi ini adalah pilihan sepenuhnya.
Tujuan saya dengan artikel ini adalah untuk memberi penjelasan mengenai topik ini: bagaimana dan kapan konflik biasanya berlaku, apa sebenarnya, dan bagaimana menyelesaikan - atau membatalkannya.
Apabila anda memahami perkara ini dengan betul, anda akan dapat mengatasi konflik penggabungan dengan cara yang lebih santai dan yakin. ?
Bagaimana dan Bilakah Konflik Berlaku
Nama itu menyebutnya: "gabungan konflik" boleh berlaku dalam proses penyatuan komit dari sumber yang berbeza.
Namun, perlu diingat bahawa "integrasi" tidak hanya terbatas pada "penggabungan cabang". Ini juga dapat terjadi ketika rebasing atau reasing interaktif, ketika melakukan pick-pick atau tarik, atau bahkan ketika menerapkan kembali Stash.
Semua tindakan ini melakukan semacam integrasi - dan ketika itulah konflik penggabungan boleh berlaku.

Tetapi tentu saja, tindakan ini tidak menghasilkan konflik penggabungan setiap saat (terima kasih Tuhan!). Sebaik-baiknya, anda jarang berada dalam situasi seperti ini. Tetapi bilakah sebenarnya konflik berlaku?
Sebenarnya, keupayaan penggabungan Git adalah salah satu kelebihan terbesarnya: penggabungan cawangan berfungsi dengan mudah sepanjang masa, kerana Git biasanya dapat mengetahui sendiri.
Tetapi ada situasi di mana perubahan bertentangan dibuat - dan di mana teknologi tidak dapat memutuskan apa yang betul atau salah. Situasi ini hanya memerlukan keputusan daripada manusia.
Klasik yang sebenarnya adalah apabila garis kod yang sama diubah dalam dua komit, di dua cabang yang berbeza. Git tidak mempunyai cara untuk mengetahui perubahan yang anda sukai! ?
Terdapat beberapa situasi lain yang serupa - misalnya apabila fail diubah suai di satu cabang dan dihapuskan di cabang yang lain - tetapi fail tersebut agak kurang biasa.
The "Tower" Git desktop GUI , sebagai contoh, mempunyai cara yang baik untuk menggambarkan jenis-jenis keadaan:

Cara Mengetahui Bila Berlaku Konflik
Jangan bimbang: Git akan memberitahu anda dengan jelas apabila konflik telah berlaku. ?
Pertama, ini akan memberitahu anda dengan segera dalam situasi tersebut , misalnya apabila penggabungan atau pelunasan gagal kerana 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 cuba melakukan penggabungan, saya membuat konflik penggabungan - dan Git menyampaikan masalah dengan sangat jelas dan segera:
- Terjadi konflik dalam fail "index.html".
- Berlaku konflik lain dalam fail "error.html".
- Dan akhirnya, kerana konflik, operasi penggabungan gagal.
Ini adalah situasi di mana kita harus menggali kod dan melihat apa yang harus dilakukan.
Sekiranya anda tidak memperhatikan mesej amaran ini ketika konflik berlaku, Git juga memberitahu 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 risau untuk tidak memerhatikan konflik gabungan. Git memastikan anda tidak dapat mengabaikannya.
Cara Mengurangkan Konflik di Git dan Mula Berulang
Gabungan konflik datang dengan keadaan mendesak tertentu. Dan memang betul: anda harus berurusan dengan mereka sebelum anda dapat meneruskan pekerjaan anda.
Tetapi walaupun mengabaikannya bukanlah pilihan, "menangani konflik penggabungan" tidak semestinya anda harus menyelesaikannya. Membatalkannya juga mungkin!
Perkara ini mungkin perlu diulang: anda selalu mempunyai pilihan untuk mengurungkan konflik penggabungan dan kembali ke keadaan sebelumnya. Ini berlaku walaupun anda sudah mula menyelesaikan fail yang bertentangan dan menemui jalan buntu.
Dalam situasi seperti ini, sangat baik untuk diingat bahawa anda selalu boleh memulakan dan kembali ke keadaan bersih sebelum konflik berlaku.
Untuk tujuan ini, kebanyakan perintah dilengkapi dengan --abort
pilihan, misalnya git merge --abort
dan git rebase --abort
:
$ git merge --abort $ git status On branch main nothing to commit, working tree clean
Ini akan memberi anda keyakinan bahawa anda tidak boleh mengacaukan. Anda selalu boleh batalkan, kembali ke keadaan bersih, dan mulakan dari awal.
Apa Konflik Yang Betul Seperti di Git
Sekarang, setelah mengetahui bahawa tidak ada yang boleh pecah, mari kita lihat seperti apa konflik yang sebenarnya berlaku . Ini akan mengetepikan buggers kecil itu dan, pada masa yang sama, membantu anda kehilangan rasa hormat terhadap mereka dan mendapat keyakinan pada diri sendiri.
Sebagai contoh, mari kita lihat kandungan fail "index.html" (yang sedang bertentangan) dalam editor:

Git was kind enough to mark the problem area in the file, enclosing it in <<<<<<< HEAD
and >>>>>>> [other/branch/name]
. The content that comes after the first marker originates from our current working branch. Finally, a line with =======
characters separates the two conflicting changes.
How to Solve a Conflict in Git
Our job as developers now is to clean up these lines: after we're finished, the file has to look exactly as we want it to look.
It might be necessary to talk to the teammate who wrote the "other" changes and decide which code is actually correct. Maybe it's ours, maybe it's theirs - or maybe a mixture between the two.
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.