Merge Tiga Arah (Riwayat yang Bercabang)
Menggabungkan branch ketika main sudah berubah, memahami commit merge, dan opsi --no-ff.
Ketika main ikut berubah
Di dunia nyata, saat kamu mengerjakan fitur, rekanmu juga menggabungkan pekerjaannya ke main. Riwayat pun bercabang (diverged):
c1 <- c2 <- c4 (main)
\
c3 (fitur-profil)
Penunjuk main tidak bisa sekadar digeser maju, karena main punya commit (c4) yang tidak dimiliki fitur-profil. Git membuat commit merge baru yang memiliki dua induk:
c1 <- c2 <- c4 <- M (main)
\ /
c3 ------ (fitur-profil)
Cara Git menggabungkan: three-way merge
Git memakai tiga titik pembanding: (1) merge base — leluhur bersama terdekat (c2); (2) ujung main (c4); (3) ujung fitur-profil (c3). Untuk tiap berkas ia membandingkan perubahan kedua sisi terhadap base. Perubahan yang tidak bertabrakan digabung otomatis; yang bertabrakan di baris yang sama menjadi konflik (bab berikutnya).
Melakukan merge
git switch main
git merge fitur-profil -m "Gabungkan fitur-profil ke main"
Tanpa -m, Git asli membuka editor untuk pesan merge (default: Merge branch 'fitur-profil'). Di simulator, gunakan -m (atau --no-edit untuk pesan default).
Merge made by the 'ort' strategy.
profil.html | 1 +
1 file changed, 1 insertion(+)
ort adalah nama algoritma merge bawaan Git saat ini.
Membaca riwayat hasil merge
git log --oneline --graph --all
* 9a8b7c6 (HEAD -> main) Gabungkan fitur-profil ke main
|\
| * 3d2e1f0 (fitur-profil) Tambah halaman profil
* | b1c2d3e Tambah halaman kontak
|/
* a0b1c2d Tambah halaman utama
Di git log biasa, commit merge memiliki baris Merge: b1c2d3e 3d2e1f0 — dua induknya.
--no-ff: selalu catat penggabungan
Walau fast-forward memungkinkan, git merge --no-ff fitur memaksa pembuatan commit merge. Banyak tim memakainya agar riwayat memperlihatkan jelas "fitur X digabung di sini" dan agar seluruh fitur mudah di-revert dengan satu commit.
Merge vs rebase (pratinjau)
Merge mempertahankan riwayat apa adanya (dengan percabangan). Rebase (bab 19) menulis ulang commit agar riwayat linear. Keduanya valid; tim biasanya sepakat satu kebijakan.
Membatalkan merge yang baru saja dibuat
git reset --hard HEAD~1 # hanya bila belum di-push