gitgithubmergeMenengah4 mnt baca

Merge PR: Merge, Squash, Rebase

Memilih strategi penggabungan PR dan menjaga riwayat main tetap bersih.

Tiga tombol hijau di GitHub

PR di-approve, checks hijau, saatnya merge. GitHub menawarkan tiga cara, dan pilihanmu membentuk riwayat main setahun ke depan:

  1. Create a merge commit: semua commit PR masuk apa adanya, plus 1 merge commit. Riwayatnya jujur, tapi bisa berisik kalau PR berisi 20 commit "wip", "fix typo", "coba lagi".
  2. Squash and merge: seluruh PR digabung jadi satu commit di main. Riwayat main super bersih: satu PR = satu commit dengan pesan yang rapi.
  3. Rebase and merge: commit-commit PR ditempel ulang di atas main tanpa merge commit. Linear dan rapi, tapi tiap commit harus lolos CI satu per satu.

Kenapa penting? git log di main adalah dokumentasi tim: satu commit bermakna per fitur mengalahkan ratusan "wip".

Contoh 1: melihat bedanya di git log

PR berisi 4 commit berantakan. Dengan merge commit biasa, log main jadi:

bash
git log --oneline -5
e4f5a6b Merge pull request #17 from kamu/fitur-notifikasi d4e5f6a coba lagi c3d2e1f fix typo b7a8c9d wip a1b2c3d Tambah notifikasi email

Semua sampah ikut masuk. Dengan squash, log main jadi:

bash
git log --oneline -2
f1a2b3c Tambah notifikasi email saat pesanan dibuat (#17) a1b2c3d Tambah validasi form login

Satu baris yang jelas. Itu kenapa squash jadi default favorit.

Contoh 2: squash merge dari terminal + beres-beres

Tidak harus klik tombol di browser; bisa dari terminal:

bash
gh pr merge 17 --squash
Merging pull request #17 (Tambah notifikasi email saat pesanan dibuat) into main with squash strategy ✓ Squashed and merged pull request #17

Setelah merge, branch sumber sudah tidak berguna. Hapus agar tidak menumpuk jadi sampah:

bash
git switch main
git pull
git branch -d fitur-notifikasi
Switched to branch 'main' Updating f1a2b3c..g4h5i6j Fast-forward Deleted branch fitur-notifikasi (was d4e5f6a).

GitHub juga menampilkan tombol "Delete branch" otomatis setelah merge; biasakan menekannya agar branch mati tidak menumpuk.

Kapan pakai yang mana?

  • Squash: default terbaik. PR berantakan masuk, satu commit rapi keluar.
  • Merge commit: kalau tiap commit PR memang bermakna dan layak dipertahankan.
  • Rebase: kalau tim menjaga riwayat linear ketat dan tiap commit harus atomic.

Banyak repo mengunci pilihan ini di Settings. Ikuti aturan repo.

Saat squash, GitHub memakai judul PR sebagai pesan commit yang hidup selamanya di git log. Inilah kenapa modul pr-buat menekankan judul spesifik.

Catatan teknis: squash dan rebase menulis ulang commit, jadi JANGAN dipakai di branch yang dishare tanpa koordinasi. Setelah squash-merge, hapus paksa branch lokalmu (git branch -D) lalu buat ulang dari main yang baru.

Kapan menekan tombol merge?

Hanya jika: checks hijau, approve tercapai, thread resolved, diff terakhir dibaca ulang. Merge itu murah; bug yang lolos karena review terburu-buru itu mahal.

Kesalahan umum pemula

SALAH: merge padahal checks masih merah.

bash
gh pr merge 17 --squash   # padahal CI gagal!

"Ah, test-nya kayaknya cuma flaky." Jangan. Checks merah berarti ada yang salah; tugasmu mencari tahu apa. Kode yang di-merge dengan CI merah adalah bom waktu.

BENAR: hijau dulu, baru merge.

Tunggu CI selesai dan hijau. Kalau merah, baca log-nya, perbaiki, push lagi, dan biarkan CI jalan ulang. Baru setelah hijau, merge.

Kesalahan kedua: lupa menghapus branch setelah merge. Jadikan kebiasaan: setiap selesai merge, langsung hapus branch-nya, lokal maupun remote.

Tantangan

Rasakan squash

Buat PR latihan berisi 3 commit kecil ('wip 1', 'wip 2', 'fix typo'). Merge dengan 'Squash and merge' dan tulis pesan commit yang rapi. Lalu git log --oneline -3 di main: pastikan hanya 1 commit rapi yang masuk, bukan 3 commit wip.