Menyelesaikan konflik

Menyelesaikan konflik: menyunting berkas, menstaging hasilnya, dan menuntaskan commit merge.

Daftar isi

Menyelesaikan konflik adalah proses tiga langkah yang tetap sama untuk setiap ukuran konflik: memutuskan isi akhir berkas, menandai keputusan itu dengan git add, dan menuntaskan commit merge. Topik ini membahas ketiganya, termasuk cara membatalkan merge yang kebetulan salah dimulai. Praktiknya dijalankan dua kali, sekali menuntaskan konflik dan sekali membatalkannya, agar kedua jalan keluar sama-sama terlatih.

Memutuskan isi akhir berkas#

Keputusan pada setiap area konflik berbentuk tiga pilihan, yaitu memilih sisi HEAD, memilih sisi branch yang digabungkan, atau menulis gabungan baru dari keduanya. Pilihan ketiga adalah yang paling sering benar, karena konflik biasanya berarti dua niat yang sama-sama bernilai. Penyuntingan dilakukan pada berkas konflik itu sendiri dengan menghapus penandanya dan menyusun isi akhirnya.

Ulangi konflik yang sama dari topik Anatomi konflik, lalu tuntaskan dengan menggabungkan kedua sisi menjadi satu kalimat yang utuh.

bash
# 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"
bash
rm -rf /tmp/lab-selesai
mkdir /tmp/lab-selesai
cd /tmp/lab-selesai
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-citra
text Keluaran
Initialized empty Git repository in /tmp/lab-selesai/.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.

Gabungan yang wajar untuk kasus ini adalah kalimat yang memuat sumber data sekaligus sifat metodenya.

bash
printf "Pengantar.\nMetode eksperimen dengan data survei.\n" > laporan.md
cat laporan.md
text Keluaran
Pengantar.
Metode eksperimen dengan data survei.

Tidak ada penanda konflik yang tersisa, dan kalimat hasilnya memuat kedua niat. Pada pekerjaan nyata langkah ini dilakukan di editor, dan pemeriksaan yang tak boleh dilupakan adalah mencari sisa penanda sebelum lanjut, misalnya melalui pencarian <<<<<<< pada seluruh berkas yang bertabrakan.

Menandai keputusan dan menuntaskan commit#

Berkas yang sudah diputuskan ditandai dengan git add, persis seperti menstaging perubahan biasa. Tanda ini sekaligus menyatakan kepada Git bahwa konflik berkas tersebut selesai.

bash
git add laporan.md
git status
text Keluaran
On branch main
All conflicts fixed but you are still merging.
  (use "git commit" to conclude merge)

Changes to be committed:
	modified:   laporan.md

Pesan All conflicts fixed but you are still merging menyatakan seluruh konflik sudah diputuskan dan tinggal satu langkah. Commit yang menuntaskannya dibuat tanpa opsi -m, karena Git sudah menyiapkan pesan merge bawaannya.

bash
git commit
git log --oneline --graph -5
text Keluaran
[main 609dd51] Merge branch 'fitur-citra'
*   609dd51 Merge branch 'fitur-citra'
|\
| * da1c318 Perkaya bab metode
* | daf6346 Ringkas bab metode
|/
* a8e75df Kerangka laporan

Seksi unmerged hilang dari status, commit merge terbentuk dengan dua induk, dan riwayat kembali berbentuk utuh. Pesan merge bawaan dapat diganti saat commit berlangsung apabila konteks keputusan perlu dicatat, misalnya alasan memilih gabungan tertentu, dan catatan itu sering menjadi hal pertama yang dibaca peninjau berikutnya.

Meninjau keputusan sebelum commit#

Penandai dengan git add tidak langsung membuat commit, sehingga masih ada kesempatan meninjau hasil keputusan sebagai satu kesatuan. Selama merge belum dituntaskan, git diff --staged membandingkan staging area terhadap commit HEAD, yaitu menampilkan seluruh keputusan konflik sebagaimana akan masuk ke commit merge.

Pada lab yang sama, hasil penggabungan kalimat metode dapat ditinjau sebelum commit penutup dijalankan.

bash
git diff --staged

Keluaran ini membandingkan keadaan main sebelum merge dengan isi berkas hasil keputusan, sehingga dampak keputusan terlihat berbaris per baris. Apabila keputusan yang sudah di-add ternyata keliru, berkas tersebut cukup disunting ulang dan di-add kembali, karena tidak ada yang terkunci sebelum commit dijalankan. Kebiasaan meninjau sebelum commit merge melindungi tim dari keputusan konflik yang tergesa masuk riwayat.

Merapikan pesan commit merge#

Commit merge dibuat dengan pesan bawaan yang menyebut branch yang digabungkan. Apabila konteks keputusan perlu dicatat, pesan tersebut dapat diganti pada saat commit penutup dijalankan, dan cara termudahnya adalah memberi -m pada git commit tadi atau menyunting pesannya di editor yang terbuka. Isi yang berguna untuk dicatat adalah alasan memilih gabungan tertentu, rujukan isu yang menjelaskan konteksnya, dan hal yang sengaja ditinggalkan dari salah satu sisi.

Apabila commit merge ternyata sudah terlanjur dibuat dengan pesan yang kurang, pesannya masih dapat dirapikan dengan git commit --amend selama merge belum dikirim ke tempat bersama, dan mekanika pengubahan commit ini dibahas lengkap pada modul pembatalan. Pesan merge yang informatif menjadi penanda unit pekerjaan yang dapat dikembalikan atau ditelusuri sebagai satu kesatuan.

Membatalkan merge yang belum tuntas#

Jalan keluar kedua dipakai ketika merge dimulai pada waktu yang salah, misalnya working directory masih berisi pekerjaan yang belum selesai. Perintah git merge --abort mengembalikan seluruh keadaan ke sebelum merge dimulai, termasuk berkas yang sudah sebagian tergabung.

bash
rm -rf /tmp/lab-abort
mkdir /tmp/lab-abort
cd /tmp/lab-abort
git init -b main
git config user.name "Budi"
git config user.email "[email protected]"
printf "Satu.\nDua.\n" > berkas.txt
git add berkas.txt
git commit -m "Dasar"
git switch -c cabang-lain
printf "Satu diganti di cabang.\nDua.\n" > berkas.txt
git commit -am "Ubah di cabang"
git switch main
printf "Satu diganti di main.\nDua.\n" > berkas.txt
git commit -am "Ubah di main"
git merge cabang-lain
git merge --abort
git status -s
text Keluaran
Initialized empty Git repository in /tmp/lab-abort/.git/
[main (root-commit) b6600d6] Dasar
 1 file changed, 2 insertions(+)
 create mode 100644 berkas.txt
Switched to a new branch 'cabang-lain'
[cabang-lain d287f20] Ubah di cabang
 1 file changed, 1 insertion(+), 1 deletion(-)
Switched to branch 'main'
[main 917ffdf] Ubah di main
 1 file changed, 1 insertion(+), 1 deletion(-)
Auto-merging berkas.txt
CONFLICT (content): Merge conflict in berkas.txt
Automatic merge failed; fix conflicts and then commit the result.

Status kosong setelah git merge --abort menyatakan keadaan kembali bersih persis seperti sebelum merge, dan isi berkas.txt kembali ke versi main. Membatalkan bukan kekalahan, melainkan pilihan yang sehat ketika konflik menuntut pemahaman yang belum siap, karena konflik yang sama dapat dibangkitkan lagi kapan pun setelah konteksnya dikumpulkan.

Ringkasan#

  • Penyelesaian konflik berjalan tiga langkah: memutuskan isi akhir, menandainya dengan git add, dan menuntaskan git commit merge.
  • Sisa penanda <<<<<<< wajib dicari sebelum menandai keputusan sebagai selesai.
  • Pesan All conflicts fixed but you are still merging menandakan tinggal commit penutup tersisa.
  • git merge --abort mengembalikan keadaan penuh ke sebelum merge dimulai, dan merupakan pilihan yang sah ketika konteks belum siap.

Referensi#