Konflik merge bukan kerusakan, melainkan pertanyaan Git yang meminta keputusan manusia. Git berhenti menggabungkan ketika kedua sisi mengubah baris yang sama sejak perpisahan keduanya, lalu menuliskan pertanyaan itu langsung ke dalam berkas berupa penanda konflik. Topik ini membahas anatomi penanda tersebut, cara membaca kedua sisi yang bertabrakan, dan keadaan repository pada saat itu, sedangkan penuntasannya sampai commit merge dibahas pada topik tentang penyelesaian konflik.
Kapan konflik terjadi#
Merge tiga arah membandingkan kedua sisi terhadap leluhur bersama keduanya. Apabila sisi A mengubah sebuah baris dan sisi B tidak, perubahan A diterima tanpa pertanyaan, dan sebaliknya. Konflik hanya muncul ketika kedua sisi mengubah baris yang sama dengan cara yang berbeda, karena Git tidak berhak memilih salah satu, apalagi menggabungkan keduanya tanpa memahami maksudnya.
Situasi ini bukan kegagalan alat, melainkan batas yang sehat. Dua orang yang mengubah kalimat yang sama menjadi dua versi berbeda menyimpan dua niat yang tidak dapat ditebak Git, sehingga keputusan harus datang dari orang yang memahami kedua niat itu. Konflik yang sering muncul biasanya merupakan gejala organisatoris, misalnya branch yang hidup terlalu lama atau dua orang yang bekerja pada area berkas yang sama.
Ragam jenis konflik#
Konflik isi (content conflict) yang diperlihatkan di atas adalah jenis yang paling sering, tetapi bukan satu-satunya. Konflik add/add terjadi ketika kedua sisi menambahkan berkas baru dengan nama yang sama tetapi isi yang berbeda, dan pesannya berbunyi CONFLICT (add/add): Merge conflict in berkas.txt dengan penanda yang bentuknya sama persis. Penyelesaiannya juga sama, yaitu menyusun isi akhir berkas baru tersebut.
Dua jenis lainnya tidak meninggalkan penanda pada berkas, sehingga pendekatannya berbeda. Konflik hapus-ubah (delete/modify) terjadi ketika satu sisi menghapus berkas sementara sisi lain mengubahnya, dan Git menyerahkan keputusannya ke status, yaitu mempertahankan berkas yang diubah atau mengikuti penghapusannya. Konflik pada berkas biner, misalnya gambar, tidak dapat digabungkan per baris, sehingga satu sisi harus dipilih utuh. Ketiganya ditangani melalui langkah yang sama pada topik Menyelesaikan konflik, hanya isinya yang berbeda, dan git status tetap menjadi peta yang menyebut berkas mana saja yang belum selesai.
Menimbulkan dan membaca konflik#
Buat dua sisi yang mengubah baris yang sama, lalu gabungkan.
# tanggal commit ditetapkan agar keluaran contoh dapat direproduksi secara persis
export GIT_AUTHOR_DATE="2026-11-01T09:00:00+07:00"
export GIT_COMMITTER_DATE="2026-11-01T09:00:00+07:00"rm -rf /tmp/lab-konflik
mkdir /tmp/lab-konflik
cd /tmp/lab-konflik
git init -b main
git config user.name "Budi"
git config user.email "[email protected]"
printf "Pengantar.\nMetode.\n" > laporan.md
git add laporan.md
git commit -m "Kerangka laporan"
git switch -c fitur-citra
printf "Pengantar.\nMetode dan sumber data.\n" > laporan.md
git commit -am "Perkaya bab metode"
git switch main
printf "Pengantar.\nMetode eksperimen.\n" > laporan.md
git commit -am "Ringkas bab metode"
git merge fitur-citraInitialized empty Git repository in /tmp/lab-konflik/.git/
[main (root-commit) a8e75df] Kerangka laporan
1 file changed, 2 insertions(+)
create mode 100644 laporan.md
Switched to a new branch 'fitur-citra'
[fitur-citra da1c318] Perkaya bab metode
1 file changed, 1 insertion(+), 1 deletion(-)
Switched to branch 'main'
[main daf6346] Ringkas bab metode
1 file changed, 1 insertion(+), 1 deletion(-)
Auto-merging laporan.md
CONFLICT (content): Merge conflict in laporan.md
Automatic merge failed; fix conflicts and then commit the result.Pesan CONFLICT (content) menyebut berkas yang bertabrakan, dan pesan terakhir menyatakan bahwa merge berhenti di tengah jalan. Keadaan ini disebut merge yang belum tuntas, dan repository berada di dalamnya sampai konflik diselesaikan atau merge dibatalkan. Isi berkasnya kini memuat penanda konflik.
cat laporan.mdPengantar.
<<<<<<< HEAD
Metode eksperimen.
=======
Metode dan sumber data.
>>>>>>> fitur-citraPenandanya terdiri atas tiga bagian. Baris <<<<<<< HEAD membuka sisi milik branch tujuan, yaitu main pada saat merge, sampai garis pemisah =======. Bagian setelahnya adalah sisi milik branch yang digabungkan, ditutup oleh >>>>>>> fitur-citra yang menyebut asal sisi tersebut. Keduanya adalah dua versi kalimat yang sama dari dua orang, dan Git meminta satu keputusan untuk area di antara kedua penanda itu.
Keadaan repository di tengah konflik#
Perintah git status pada keadaan ini memuat seksi khusus yang menandai jalan keluarnya.
git statusOn 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 <file>..." to mark resolution)
both modified: laporan.md
no changes added to commit (use "git add" and/or "git commit -a")Seksi Unmerged paths memuat both modified: laporan.md, yaitu status berkas yang memuat penanda konflik. Dua saran di bagian atasnya merangkum pilihan yang ada: menuntaskan merge dengan menyelesaikan konflik lalu menjalankan git commit, atau mundur seluruhnya melalui git merge --abort. Selama status ini belum tuntas, git log masih menampilkan riwayat lama, karena commit merge belum ada, dan git diff dapat dipakai untuk melihat perubahan kedua sisi satu per satu.
Ringkasan#
- Konflik muncul hanya ketika kedua sisi mengubah baris yang sama secara berbeda sejak leluhur bersama.
- Penanda konflik terdiri atas sisi
HEAD, garis pemisah, dan sisi branch yang digabungkan. git statusmenampilkan seksiUnmerged pathsbeserta dua jalur keluar, yaitu menuntaskan merge atau membatalkannya.- Merge yang berhenti di tengah jalan adalah keadaan repository, bukan error yang menghentikan pekerjaan.
Referensi#
- git-merge — Git Documentation — rujukan perilaku merge yang berhenti karena konflik.
- Git Branching - Basic Branching and Merging — Pro Git — bagian Basic Merge Conflicts pada Pro Git.