Menguasai format commit type, scope, dan subject beserta sepuluh type yang umum dipakai. Termasuk cara menandai breaking change agar rilis major terdeteksi, dilengkapi contoh commit yang benar dan salah.

Di episode 2 kita membedah arsitektur semantic-release: commit analyzer membaca riwayat commit dan menentukan jenis rilis. Sekarang kita belajar bahasa yang dibacanya — karena commit analyzer hanya sepintar format pesan commit yang kalian tulis. Commit yang berantakan sama saja dengan memberi mesin teks bahasa asing yang tidak bisa diurai.
Conventional Commits adalah spesifikasi ringan yang mengubah pesan commit menjadi format yang bisa diparse: type(scope): subject. Spesifikasi ini populer karena mudah dipelajari manusia dan mudah dibaca mesin — persis kombinasi yang dibutuhkan otomatisasi release. Tidak perlu menulis esai; cukup satu baris yang jujur tentang jenis perubahan.
Format intinya hanya satu baris:
type(scope): subject
feat(auth): tambahkan halaman login
fix(validator): perbaiki validasi emailfeat atau fix.auth, validator, api.Subjek yang baik menjawab pertanyaan: "commit ini mengubah apa?" Secara visual: feat(auth): tambahkan halaman login berarti "di bagian auth, ada fitur baru berupa halaman login."
| Type | Arti | Contoh Subject |
|---|---|---|
feat | Fitur baru | tambahkan halaman login |
fix | Perbaikan bug | perbaiki validasi email |
perf | Peningkatan performa | percepat render daftar |
refactor | Perubahan internal, bukan bug | rapikan modul auth |
docs | Perubahan dokumentasi | perbaiki panduan setup |
test | Penambahan atau ubah test | tambah test login flow |
chore | Tugas rutin non-fungsional | update dependensi keamanan |
build | Perubahan build system | update config bundler |
ci | Perubahan konfigurasi CI | pindah ke setup-node v4 |
revert | Membatalkan commit | kembalikan commit 3f2a1b0 |
Commit analyzer memetakan type ke jenis rilis. Dengan preset default, hanya feat dan fix yang memicu rilis; sisanya perlu diatur lewat releaseRules seperti yang dipakai repo ini.
| Type | Dampak Rilis |
|---|---|
feat | minor |
fix, hotfix | patch |
perf, refactor, chore, revert | patch |
docs, test, ci, style | tidak ada rilis |
| Breaking change | major |
Note
Default preset Angular hanya mengenali feat menaikkan minor dan fix menaikkan patch. Mapping tambahan seperti perf dan refactor menaikkan patch, atau chore memicu rilis, adalah hasil kustomisasi releaseRules — bukan perilaku bawaan. Kita akan menyusunnya sendiri di episode 5.
Perubahan yang merusak kompatibilitas ditandai dengan footer BREAKING CHANGE: atau tanda seru ! setelah type atau scope. Keduanya memicu rilis major.
feat(auth): pindah ke token berbasis JWT
BREAKING CHANGE: format token lama tidak lagi didukung
feat!: drop dukungan Node 16Catatan penting: kata kunci BREAKING CHANGE harus ada di footer, terpisah satu baris kosong dari subject. Repo ini bahkan mendaftarkan BREAKING CHANGE dan BREAKING CHANGES di parserOpts.noteKeywords agar kedua bentuk terbaca.
fix(auth): perbaiki login gagal saat email huruf kapital # benar
feat: tambahkan halaman dashboard # benar
update validasi email # salah
fix bug # salahKesalahan yang paling umum: tidak memakai type sama sekali, atau subject yang terlalu samar seperti fix bug — apa yang diperbaiki? di bagian mana? Mesin tidak bisa menebak, dan changelog yang dihasilkan akan tidak berguna.
Warning
fix bug dan update tidak bisa diparse sebagai fix. Akibatnya commit itu tidak memicu rilis, dan perbaikannya tidak pernah sampai ke user sampai commit lain yang berformat benar datang. Pesan commit yang malas adalah biaya tersembunyi: changelog ikut korup dan rilis tertunda.
"tambahkan halaman login" # imperatif
"tambah halaman login" # tanpa titik
"menambahkan halaman login" # bukan imperatif, hindariPada episode 3 ini kalian telah memahami:
type(scope): subject dengan type wajib dan scope opsional.feat, fix, perf, refactor, docs, test, chore, build, ci, revert.feat minor, fix patch, breaking major.BREAKING CHANGE: atau tanda seru !.Di episode 4 kita akan melihat di mana commit-commit itu hidup: strategi branching Git Flow dengan staging sebagai release candidate dan main sebagai branch stable. Sampai jumpa di episode 4!