Conventional Commits 1.0.0
Ringkasan
Conventional Commits adalah konvensi ringan untuk menulis pesan commit. Tujuannya agar riwayat commit lebih jelas, konsisten, dan mudah dipakai oleh alat otomatis seperti generator changelog atau otomatisasi versi.
Konvensi ini selaras dengan SemVer karena membedakan commit fitur baru, perbaikan bug, dan perubahan yang bersifat breaking.
Format commit:
<type>[optional scope]: <description>
[optional body]
[optional footer(s)]Elemen struktural utama:
fix: commit ini memperbaiki bug (setaraPATCHpada SemVer).feat: commit ini menambahkan fitur baru (setaraMINORpada SemVer).BREAKING CHANGE: perubahan yang memutus kompatibilitas API (setaraMAJORpada SemVer). Bisa ditulis di footer atau ditandai dengan!pada prefix.- Tipe selain
fixdanfeattetap boleh digunakan, misalnyabuild,chore,ci,docs,style,refactor,perf,test, dan lainnya. - Footer selain
BREAKING CHANGEjuga boleh digunakan mengikuti pola miripgit trailer.
Tipe tambahan tidak diwajibkan oleh spesifikasi dan tidak otomatis memengaruhi SemVer, kecuali jika mengandung breaking change.
scope bersifat opsional dan dipakai untuk konteks area kode, misalnya:
feat(parser): tambah kemampuan parse arrayContoh
1) Commit dengan deskripsi dan footer breaking change
feat: izinkan objek config mewarisi config lain
BREAKING CHANGE: key `extends` sekarang dipakai untuk mewarisi file config lain2) Commit dengan ! untuk menandai breaking change
feat!: kirim email ke pelanggan saat produk dikirim3) Commit dengan scope dan !
feat(api)!: kirim email ke pelanggan saat produk dikirim4) Commit dengan ! dan footer BREAKING CHANGE
feat!: hentikan dukungan Node 6
BREAKING CHANGE: sekarang memakai fitur JavaScript yang tidak tersedia di Node 65) Commit tanpa body
docs: perbaiki ejaan pada CHANGELOG6) Commit dengan scope
feat(lang): tambah bahasa Polandia7) Commit dengan body multi-paragraf dan banyak footer
fix: cegah race condition pada request
Tambahkan request id dan referensi ke request terbaru.
Abaikan response yang bukan berasal dari request terbaru.
Hapus timeout lama yang sebelumnya dipakai untuk mitigasi race condition
karena sekarang sudah tidak diperlukan.
Reviewed-by: Z
Refs: #123Spesifikasi
Kata kunci RFC 2119 seperti MUST, SHOULD, MAY, dan lainnya berlaku pada bagian ini.
- Commit harus diawali
type, diikutiscopeopsional,!opsional, lalu:dan spasi. featharus dipakai untuk fitur baru.fixharus dipakai untuk perbaikan bug.scopeboleh ditambahkan setelah type dan harus berupa kata benda dalam tanda kurung, misalnyafix(parser):.descriptionharus langsung setelah:dan spasi, berisi ringkasan singkat perubahan.bodyboleh ditambahkan satu baris kosong setelah deskripsi.bodybersifat bebas dan boleh terdiri dari banyak paragraf.- Satu atau lebih
footerboleh ditambahkan satu baris kosong setelah body. - Setiap footer terdiri dari token, pemisah (
:<space>atau<space>#), dan nilai string. - Token footer harus menggunakan
-untuk mengganti spasi (mis.Acked-by), kecualiBREAKING CHANGE. - Nilai footer boleh berisi spasi dan baris baru.
- Breaking change harus ditandai di prefix (
!) atau footer. - Jika memakai footer, formatnya harus:
BREAKING CHANGE: <deskripsi>. - Jika memakai
!, footerBREAKING CHANGEboleh dihilangkan. - Tipe selain
featdanfixtetap boleh digunakan. - Implementasi parser tidak boleh menganggap unit informasi sebagai case-sensitive, kecuali token
BREAKING CHANGEyang harus uppercase. BREAKING-CHANGEdianggap sinonim denganBREAKING CHANGEsaat dipakai sebagai token footer.
Kenapa Menggunakan Conventional Commits?
- Membuat changelog otomatis.
- Menentukan kenaikan versi SemVer secara otomatis.
- Mengkomunikasikan sifat perubahan ke tim dan stakeholder.
- Memicu proses build/publish.
- Memudahkan kontribusi karena histori commit lebih terstruktur.
FAQ
Bagaimana menulis commit saat proyek masih fase awal?
Tulis seolah produk sudah dirilis. Biasanya sudah ada pengguna (minimal rekan tim) yang perlu tahu apa yang diperbaiki, ditambah, atau diubah secara breaking.
Type commit sebaiknya huruf besar atau kecil?
Bebas, tetapi sebaiknya konsisten. Praktik umum: huruf kecil.
Bagaimana jika satu commit cocok ke lebih dari satu type?
Pisahkan menjadi beberapa commit jika memungkinkan. Manfaat utama Conventional Commits adalah mendorong commit yang lebih rapi dan terorganisir.
Apakah ini menghambat pengembangan cepat?
Tidak. Konvensi ini mengurangi kekacauan, sehingga tim bisa bergerak cepat secara berkelanjutan.
Apakah developer jadi terlalu terbatas pada type yang ada?
Tidak. Spesifikasi ini fleksibel; tim bisa menambah type sesuai kebutuhan.
Hubungannya dengan SemVer bagaimana?
fix->PATCHfeat->MINOR- commit dengan
BREAKING CHANGE(type apa pun) ->MAJOR
Bagaimana memversioning ekstensi spesifikasi Conventional Commits?
Disarankan gunakan SemVer juga.
Bagaimana jika terlanjur salah memilih type commit?
- Jika type masih valid tapi kurang tepat (mis.
fixpadahalfeat), perbaiki riwayat sebelum merge/rilis (mis. viagit rebase -i). - Jika type tidak valid (mis.
feet), commit tetap tidak merusak repo, tetapi kemungkinan tidak terbaca oleh tooling berbasis spesifikasi.
Apakah semua kontributor wajib mengikuti spesifikasi ini?
Tidak wajib. Pada workflow squash merge, maintainer bisa merapikan pesan commit saat penggabungan.
Bagaimana Conventional Commits menangani revert?
Spesifikasi tidak menetapkan aturan revert secara ketat. Tooling bisa memanfaatkan type dan footer untuk logika masing-masing.
Rekomendasi umum:
revert: batalkan perubahan pada modul pembayaran
Refs: 676104e, a215868