Dua chapter sebelumnya menempatkan konflik sebagai risiko teknis: branch menua, selisih menumpuk, lalu Git menyerahkan keputusan kepada manusia. Namun begitu yang bertabrakan adalah pekerjaan dua orang — bukan dua branch di satu laptop — konflik berubah wujud menjadi urusan sosial: dua niat baik menulis dua isi berbeda pada baris yang sama, dan Git sama sekali tidak tahu siapa yang benar. Penolakan push, penanda konflik, dan merge commit hanya alatnya; keputusannya lahir dari percakapan. Chapter ini memainkan skenario lengkapnya dengan dua clone sungguhan — dari push yang ditolak sampai penyatuan akhir — lalu menutupnya dengan kebiasaan yang mencegah kejadian serupa.
Panggung: Dua Meja, Satu Berkas Promo #
Budi menyiapkan repo toko dengan satu berkas promo, mendorongnya ke bare pusat, lalu Siti mengambil salinannya — panggung shared repository yang sudah dikenal dari Workflow Kolaborasi :
mkdir budi && cd budi
git init -b main
git config user.name "Budi Santoso"
git config user.email "[email protected]"
printf 'diskon 10%%\n' > promo.txt
git add promo.txt
GIT_AUTHOR_DATE="2026-10-22T09:00:00+07:00" GIT_COMMITTER_DATE="2026-10-22T09:00:00+07:00" \
git commit -m "Umumkan promo pembukaan"
git init --bare ../toko-konflik.git
git remote add origin ../toko-konflik.git
git push -u origin mainOutput yang Dihasilkan (dua perintah terakhir):
[main (root-commit) ca5fcce] Umumkan promo pembukaan
1 file changed, 1 insertion(+)
create mode 100644 promo.txtTo ../toko-konflik.git
* [new branch] main -> main
branch 'main' set up to track 'origin/main'.cd ..
git clone toko-konflik.git siti
cd siti
git config user.name "Siti Rahma"
git config user.email "[email protected]"Keduanya kini memegang promo.txt berisi diskon 10% — dan keduanya akan mengubah baris itu hari ini juga.
Push Pertama Menang, Push Kedua Ditolak #
Budi duluan: diskon dinaikkan ke 20 persen, dikirim ke pusat:
cd ../budi
printf 'diskon 20%%\n' > promo.txt
git add promo.txt
GIT_AUTHOR_DATE="2026-10-22T11:00:00+07:00" GIT_COMMITTER_DATE="2026-10-22T11:00:00+07:00" \
git commit -m "Naikkan diskon menjadi 20 persen"
git push origin mainOutput yang Dihasilkan (dua perintah terakhir):
[main 5f664fa] Naikkan diskon menjadi 20 persen
1 file changed, 1 insertion(+), 1 deletion(-)To ../toko-konflik.git
ca5fcce..5f664fa main -> mainSiti menulis versinya tanpa menarik perkembangan Budi — diskon 30 persen — dan baru mengetahui dunia sudah berubah saat push-nya membentur server:
cd ../siti
printf 'diskon 30%%\n' > promo.txt
git add promo.txt
GIT_AUTHOR_DATE="2026-10-22T11:30:00+07:00" GIT_COMMITTER_DATE="2026-10-22T11:30:00+07:00" \
git commit -m "Naikkan diskon menjadi 30 persen"
git push origin mainOutput yang Dihasilkan (perintah terakhir):
To ../toko-konflik.git
! [rejected] main -> main (fetch first)
error: failed to push some refs to '../toko-konflik.git'
hint: Updates were rejected because the remote contains work that you do not
hint: have locally. This is usually caused by another repository pushing to
hint: the same ref. If you want to integrate the remote changes, use
hint: 'git pull' before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.Penolakan ini bukan konflik — ini pengaman. Mekanisme fast-forward yang dibedah di Push Rejected
menolak menimpa commit 5f664fa milik Budi; tidak satu byte pekerjaan siapa pun yang hilang. Server hanya berkata: satukan dulu, baru kirim.
Pull yang Berujung Konflik #
Siti menarik perkembangan pusat dengan jalur merge eksplisit — git pull polos menolak menebak arah rekonsiliasi branch yang menyimpang, perilaku yang dibedah di git pull
:
git pull --no-rebaseOutput yang Dihasilkan:
From ../toko-konflik
ca5fcce..5f664fa main -> origin/main
Auto-merging promo.txt
CONFLICT (content): Merge conflict in promo.txt
Automatic merge failed; fix conflicts and then commit the result.Inilah momen tabrakan. git status memetakan medannya:
git statusOutput yang Dihasilkan:
On branch main
Your branch and 'origin/main' have diverged,
and have 1 and 1 different commits each, respectively.
(use "git pull" if you want to integrate the remote branch with yours)
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: promo.txt
no changes added to commit (use "git add" and/or "git commit -a")Berkasnya memuat kedua versi berdampingan:
cat promo.txtOutput yang Dihasilkan:
<<<<<<< HEAD
diskon 30%
=======
diskon 20%
>>>>>>> 5f664faaf6b42d0d83c07e577d2bbc2f7f599976Tiga penanda itu dibedah tuntas di Merge Conflicts
: sisi HEAD adalah niat Siti (30%), sisi bawah commit 5f664fa adalah niat Budi (20%). Git menolak memilih — dan sebenarnya itu keputusan yang tepat, karena pilihan terbaiknya bukan urusan sintaks.
Prosedur: Komunikasi Dulu, Baru Keyboard #
Urutan kejadian dan posisi setiap langkahnya dapat dipetakan seperti ini:
Prosedurnya berjalan dalam empat langkah berurutan. Pertama, komunikasi sebelum menyentuh berkas — Siti bertanya, Budi menjawab: promo 20 persen sudah diumumkan di media sosial pagi ini, jadi 20 dipertahankan dan 30 menyusul pekan depan. Keputusan seperti “siapa menyerah” atau “bagaimana dua perubahan digabung” tidak pernah bisa dibaca dari penanda konflik; ia hanya hidup di percakapan. Kedua, penyelesaian terjadi di clone penarik — bukan di server: main di bare tetap sehat di 5f664fa sepanjang proses, dan bila Siti bingung di tengah jalan, git merge --abort mengembalikan kondisi awal seperti dibedah di Membatalkan Merge
. Ketiga, hasil disepakati ditulis, ditandai selesai, disatukan, dikirim:
printf 'diskon 20%%\n' > promo.txt
git add promo.txt
GIT_AUTHOR_DATE="2026-10-22T12:00:00+07:00" GIT_COMMITTER_DATE="2026-10-22T12:00:00+07:00" \
git commit --no-edit
git push origin mainOutput yang Dihasilkan (dua perintah terakhir):
[main 3f83bc0] Merge branch 'main' of ../toko-konflikTo ../toko-konflik.git
5f664fa..3f83bc0 main -> main--no-edit menerima pesan merge bawaan tanpa membuka editor. Keempat, kabari rekan: Budi menarik hasilnya:
cd ../budi
git pull
cat promo.txtOutput yang Dihasilkan (dua perintah):
From ../toko-konflik
5f664fa..3f83bc0 main -> origin/main
Updating 5f664fa..3f83bc0
Fast-forwarddiskon 20%Tarikan Budi maju cepat tanpa satu baris pun berubah di berkasnya — salinan promo.txt miliknya sudah berisi 20 persen sejak commitnya sendiri; yang datang hanyalah riwayat pengesahannya. Graf akhir di meja Siti merangkum seluruh kisahnya:
cd ../siti
git log --oneline --graph --all --decorateOutput yang Dihasilkan:
* 3f83bc0 (HEAD -> main, origin/main, origin/HEAD) Merge branch 'main' of ../toko-konflik
|\
| * 5f664fa Naikkan diskon menjadi 20 persen
* | 9e10243 Naikkan diskon menjadi 30 persen
|/
* ca5fcce Umumkan promo pembukaanCommit “Naikkan diskon menjadi 30 persen” tetap tercatat — keputusan Siti tidak dihapus dari sejarah, hanya kalah dalam isi berkas. Siapa pun yang membaca graf ini tahun depan bisa menelusuri kapan dua niat bertemu dan kapan disepakati. Hash di mesin pembaca berbeda; bentuk ceritanya tidak.
Mencegah Sebelum Terjadi #
Konflik selesai lebih cepat bila tidak terjadi. Tiga kebiasaan menekan kemungkinannya:
- Pecah berkas raksasa — satu berkas ribuan baris adalah magnet tabrakan: siapa pun yang bekerja pasti menyentuh area sama. Memecahnya per modul menyebar pegangan ke berkas-berkas berbeda.
- Integrasi rutin dari
main— disiplin chapter Menjaga Branch Tetap Sinkron membuat selisih selalu kecil; konflik kecil mudah didamaikan. - Konvensi kepemilikan berkas — tim yang sehat menetapkan siapa pemilik wilayah: siapa pun boleh mengusulkan perubahan, tetapi pemilik wilayah selalu ikut menilai. Platform memformalkannya lewat berkas
CODEOWNERS: tiap baris memetakan pola berkas ke pemiliknya (misalnya/promo.txt @budi), dan setiap pull request yang menyentuh pola itu otomatis menuntut persetujuan pemiliknya sebelum bisa digabung — mekanismenya dibahas sebagai fitur di Protected Branches .
Konflik terselesaikan lewat komunikasi dan prosedur — dua hal yang juga menopang kebiasaan kolaborasi lain yang jauh lebih sunyi: keseragaman pesan commit. Ketika seluruh tim menulis riwayat dengan satu gaya, riwayat menjadi bisa dibaca cepat, diringkas otomatis, dan ditagih pertanggungjawabannya. Chapter berikutnya menuliskan kesepakatan itu.