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:
- 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".
- Squash and merge: seluruh PR digabung jadi satu commit di main. Riwayat main super bersih: satu PR = satu commit dengan pesan yang rapi.
- 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:
git log --oneline -5e4f5a6b 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:
git log --oneline -2f1a2b3c 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:
gh pr merge 17 --squashMerging 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:
git switch main
git pull
git branch -d fitur-notifikasiSwitched 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.
Menulis pesan squash yang baik
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.
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.