Setelah bekerja di branch terpisah, saatnya menggabungkan kembali perubahan ke branch utama. Di sinilah git merge berperan. Sebagian besar merge berjalan mulus secara otomatis, tapi kadang Git tidak bisa menentukan sendiri bagaimana menggabungkan perubahan yang bertabrakan — inilah yang disebut merge conflict. Kemampuan menyelesaikan konflik dengan percaya diri adalah keterampilan yang membedakan developer pemula dari yang berpengalaman.
Cara Kerja Git Merge
git merge menggabungkan histori dua branch menjadi satu. Kamu selalu menjalankan merge dari branch tujuan (branch yang akan menerima perubahan).
# Pastikan kamu di branch tujuan
git switch main
# Merge branch feature ke main
git merge feature/user-profile
Dua Jenis Merge
1. Fast-Forward Merge
Terjadi ketika branch yang di-merge adalah lanjutan langsung dari branch tujuan — tidak ada commit baru di branch tujuan sejak branch dibuat.
Sebelum:
main: A ── B
\
feature: C ── D
Setelah fast-forward merge:
main: A ── B ── C ── D
↑
HEAD
Git cukup memajukan pointer main ke commit D. Tidak ada commit merge baru yang dibuat.
git switch main
git merge feature/login
# Output: Fast-forward
2. Three-Way Merge (Merge Commit)
Terjadi ketika kedua branch punya commit baru sejak titik percabangan. Git membuat commit merge baru yang menggabungkan keduanya.
Sebelum:
main: A ── B ── E ── F
\
feature: C ── D
Setelah three-way merge:
main: A ── B ── E ── F ── M
\ /
feature: C ── D ────
M adalah merge commit — commit dengan dua parent.
git switch main
git merge feature/login
# Output: Merge made by the 'ort' strategy.
Memaksa Merge Commit (No Fast-Forward)
Untuk menjaga histori branch terlihat jelas di log, gunakan --no-ff:
git merge --no-ff feature/login -m "Merge branch 'feature/login'"
Ini adalah praktik yang dianjurkan untuk tim karena membuat histori lebih mudah dibaca.
Merge Conflict: Kapan Terjadi?
Merge conflict terjadi ketika dua branch mengubah bagian yang sama dari file yang sama dengan cara berbeda, dan Git tidak bisa memutuskan versi mana yang benar.
main mengubah baris 5: "return user.email"
feature mengubah baris 5: "return user.email.toLowerCase()"
Git: Saya tidak tahu mana yang benar. Tolong putuskan sendiri.
Menyelesaikan Merge Conflict
Langkah 1: Cek Status Konflik
git merge feature/login
# Auto-merging src/auth.js
# CONFLICT (content): Merge conflict in src/auth.js
# Automatic merge failed; fix conflicts and then commit the result.
git status
# both modified: src/auth.js
Langkah 2: Buka File yang Konflik
Git menandai area konflik di dalam file dengan marker khusus:
function getEmail(user) {
<<<<<<< HEAD
return user.email;
=======
return user.email.toLowerCase();
>>>>>>> feature/login
}
<<<<<<< HEAD— awal bagian dari branch saat ini (main)=======— pemisah antara dua versi>>>>>>> feature/login— akhir bagian dari branch yang di-merge
Langkah 3: Edit dan Pilih Versi yang Benar
Hapus semua marker konflik (<<<<<<<, =======, >>>>>>>) dan pilih versi yang benar — bisa salah satu, atau kombinasi keduanya:
// Pilih satu versi
function getEmail(user) {
return user.email.toLowerCase();
}
// Atau gabungkan keduanya
function getEmail(user) {
// Normalisasi email sebelum return
return user.email.trim().toLowerCase();
}
Langkah 4: Tandai Sebagai Resolved dan Commit
# Tandai file sudah diselesaikan
git add src/auth.js
# Commit merge
git commit
# Git otomatis mengisi pesan merge commit
# Atau dengan pesan kustom
git commit -m "Merge feature/login: gunakan toLowerCase untuk email"
Tools untuk Menyelesaikan Konflik
VS Code
VS Code menampilkan UI visual untuk konflik dengan tombol:
- Accept Current Change — pakai versi HEAD (main)
- Accept Incoming Change — pakai versi branch yang di-merge
- Accept Both Changes — pakai keduanya
- Compare Changes — lihat diff side-by-side
git mergetool
# Buka tool mergetool yang dikonfigurasi
git mergetool
# Konfigurasi tool pilihan
git config --global merge.tool vimdiff
git config --global merge.tool vscode
Membatalkan Merge
# Batalkan merge yang sedang berlangsung (sebelum commit)
git merge --abort
# Undo merge yang sudah di-commit (buat revert commit)
git revert -m 1 HEAD
# -m 1 berarti kembalikan ke parent pertama (branch utama)
Tips Menghindari Konflik Besar
- Merge sering — semakin sering merge dari main ke feature branch, semakin kecil kemungkinan konflik besar
- Bagi tugas dengan baik — hindari dua orang mengerjakan file yang sama secara bersamaan
- Komunikasi di tim — beri tahu anggota tim jika akan mengubah file yang banyak dipakai
- Branch berumur pendek — branch yang hidup berhari-hari lebih rentan konflik dari branch yang hidup berjam-jam
Kesimpulan
Merge conflict bukan hal yang menakutkan — ini hanya Git yang meminta bantuan kamu untuk membuat keputusan yang tidak bisa dia buat sendiri. Dengan pemahaman yang baik tentang format marker konflik dan workflow penyelesaiannya, kamu bisa menanganinya dengan tenang.
Di artikel berikutnya, kita bahas alternatif dari merge yang sering menjadi perdebatan di komunitas Git: git rebase.
Kiki/🎮🍉⌨️🍩💻