Cheat-sheet Conventional Commit di Git, Sangat Disarankan
Kenapa Conventional Commit di Git itu Penting? Bukannya Kita Bebas Mengetik Commit?
Jika kamu adalah seorang developer dan baru pertama kali mendengar ini, maka kamu terindikasi rookie. Dan jika sudah push commit tanpa mengetahui ini, itu tidak masalah, rookie mistake bisa dimaklumi karena saya dulu juga begitu. Setelah membaca sekilas definisi dan cheat sheet nya, harapannya kamu menerapkan ini untuk kedepannya supaya mengikuti best practice & tren, memudahkan pengembangan, dan terlihat keren.
Sumber pembuatan cheat sheet conventional commits berasal dari pengalaman pribadi serta sumber external sebagai berikut:
Definisi
Conventional Commits adalah aturan commits yang telah disepakati oleh komunitas developer sebagai standar commit untuk kemudahan tracking version control system seperti git. Meskipun tidak wajib, aturan ini sangat disarankan dan sudah diterapkan oleh mayoritas developer. Conventional ini juga boleh dibuat aturan tersendiri untuk pattern commits, misalnya dalam suatu perusahaan ingin membuat aturannya tersendiri. Meskipun fokusnya adalah untuk developer, conventional commit dapat diterapkan di luar bidang itu seperti data analyst, data science, dan lain sebagainya dengan sedikit perbedaan.
Penggunaan commit dapat dilakukan dengan git commit lalu memasuki editor vim, nano, atau sejenisnya tergantung os. JIka tidak mau memasuki editor, bisa menambahkan -m yang akan seperti ini:
git commit -m "ini pesan commit"
Btw bisa juga memakai extension nya di VSCode kalau mau.
Kenapa Penting?
- Memudahkan melacak perkembangan project dalam git
- Diterapkan oleh mayoritas sehingga team hingga contributor dapat memahami dengan mudah
- Semantik, sesuai best practice
- Otomatis membuat CHANGELOGs yang rapi
- Trigger serta mempermudah build dan CI/CD Pipeline
Cheat Sheets
{tipe}{(scope, opsional)}: {deskripsi}
{body, opsional}
{footer(s), opsional}
git commit -m "<type>(<optional scope>): <description>" \
-m "<optional body>" \
-m "<optional footer(s)>"
Struktur diatas adalah commit versi lengkap, tanpa kurung kurawal. Tidak harus semua, minimal ada tipe dan deskripsi sedangkan body, scope, dan footer bersifat opsional. Berikut ialah penjelasannya satu per satu komponen:
-
Deskripsi
Berperan sebagai inti dari pesan perubahannya dan wajib ada. Berikut aturannya:
- Berisi tentang apa yang diubah, bukan bagaimana
- Singkat dan jelas (max 72 char, best practice dari git)
- Tanpa kaptial di awal dan tanpa tanda baca di akhir
-
Tipe
Berperan sebagai kategori perubahan dan wajib ada. Berikut aturannya:
- Singkat dan menggunakan lowercase
- Disarankan memakai kata kunci standar
Kata Kunci Standar
Minimal kata kunci standar yang digunakan ialah feat dan fix, tetapi disarankan untuk menerapkan semua. Jika dalam kasus tertentu kata kunci standar tidak cukup, membuat kata kunci custom adalah ide bagus. Kata kunci ini berlaku untuk UI maupun API.
-
feat (new feature/function)
Perubahan yang berdampak pada user. Gunakan jika:
- menambahkan fitur baru
- menambahkan fungsionalitas baru
Contoh:
feat: add new ui component in navbarfeat: add image converter systemfeat: add session and cookies system
-
fix (fix a bug/error)
Perubahan yang berdampak pada user. Gunakan jika:
- memperbaiki bug atau error
- memperbaiki kesalahan tujuan program
Contoh:
fix: remove toast spam in register pagefix: resolve undefined uuidfix: change button color with correct theme
-
perf (performance improvments)
Perubahan yang berdampak pada user. Gunakan jika:
- meningkatkan performa program (speed, memory, dll)
Contoh:
perf: only render used client componentsperf: simplify query builderperf: delete unused assets
-
refactor (code refactoring without changing behavior)
Perubahan yang tidak berdampak pada user. Gunakan jika:
- mengubah struktur code tanpa menambah fitur atau memperbaiki bug
- membuat program lebih mudah dibaca developer
- membersihkan program
Contoh:
refactor: separate controller into modular servicesrefactor: using async await istead promiserefactor: renaming column variable using snake_case convention
-
style (change code style only)
Perubahan yang tidak berdampak pada program. Gunakan jika:
- format code (Prettier, ESLint, dll)
- mengubah gaya penulisan code tanpa mengubah program (indentation, whitespace, line break, dll)
Contoh:
style: change indentation from 4 to 2style: format code with ESLintstyle: change Prettier rules
-
test (test changes)
Perubahan pada unit testing. Gunakan jika:
- menambah unit testing
- memperbaiki unit testing
Contoh:
test: add unit test for auth middlewaretest: improve API request validation testtest: fix performance latency checks
-
docs (documentations)
Perubahan pada dokumentasi. Gunakan jika:
- menambah/mengubah dokumentasi (README, CHANGELOG, dll)
- menambah/mengubah code documentation (comments, dll)
- menambah/mengubah docs generate (swagger, dll)
Contoh:
docs: update README to include installation instructionsdocs: apply conventional comments in c++ for variablesdocs: add video links usage in notes.txt
-
build (build process / dependencies)
Perubahan pada production. Gunakan jika:
- mengubah/mengupdate konfigurasi build
- mengubah/mengupdate dependencies yang berdampak pada build
- mengkonfigurasi devops (docker, kurbenetes, dll)
Contoh:
build: upgrade tauri to v2.0build: migration from npm to pnpmbuild: update docker image
-
ci (continuous integration)
Perubahan pada konfigurasi CI/CD. Gunakan jika:
- menambah/mengubah konfigurasi CI/CD
- update workflows (GitHub action, dll)
Contoh:
ci: add health check in GitHub Actionci: configure jenkins for integration testci: add security scan in GitLab
-
chore (routine task / miscellaneous)
Perubahan yang tidak berdampak pada program. Gunakan jika:
- urusan maintenance & routine task
- mengupdate devDependencies
- mengkonfigurasi project settings (package.json. .gitignore, dll)
- memindahkan atau mengganti nama file/folder
- perubahan lain yang tidak termasuk ke dalam tipe-tipe sebelumnya
Contoh:
chore: update .gitignore to include .editorconfigchore: update @types/node to latest versionchore: renaming folder with kebab-case
-
revert (revert a previous commit)
Perubahan untuk berpindah ke commit sebelumnya. Gunakan jika:
- kembali/rollback ke commit sebelumnya jika dibutuhkan
Contoh(default dari git):
revert: "feat: add new ui component in navbar"revert: "fix: resolve undefined uuid"revert: "build: upgrade tauri to v2.0"
-
Scope
Scope adalah bagian yang bersifat opsional40px pada conventional commit. Scope menjelaskan area, modul, atau bagian code yang terpengaruh pada commit. Berikut ialah aturannya:
- berada tepat sesudah
tipedan sebelum ”:”. - singkat padat jelas
- lowercase dan tidak ada tanda baca
- boleh menggunakan lebih dari satu scope, dipisahkan dengan koma tanpa spasi (tetapi ini tidak lazim)
- nama scope bebas, ditentukan project/tim. contoh:
- modul: auth, payment, session
- file: readme, yaml, json
- komponen: navbar, button, dto
- layer: model, view, controller
- area: api, ui, core
Contoh:
feat(session): add session and cookies systemdocs(readme): update README to include installation instructionsfix(ui): change button color with correct theme
- berada tepat sesudah
-
Body
Body adalah bagian yang bersifat opsional pada conventional commit. Body berisi penjelasan tambahan dari deskripsi commit seperti apa, kenapa dan bagaimana. Berikut ialah aturannya.
- tambahkan satu baris kosong sesudah tipe & deskripsi
- tidak ada batasan char
- boleh menggunakan huruf kapital dan tanda baca
- boleh multi line seperti paragraf
- boleh menggunakan bullet list
Contoh:
-
chore: renaming folder with kebab-case Renamed folders to kebab-case for consistency. -
refactor(api): separate controller into modular services The controller had grown too large and was handling multiple responsibilities, making it hard to maintain and test. This commit extracts the logic into separate modular services: - UserService for handling user operations - AuthService for authentication and token management - NotificationService for sending system notifications This separation improves readability, maintainability, and testability of the codebase without changing external behavior.
-
Footer(s)
Footer(s) adalah bagian yang bersifat opsional pada conventional commit. Berikut ialah aturannya:
- strukturnya berupa
<token>: nilai - footer Boleh lebih dari satu
Berikut jenis-jenis token pada footer secara umum:
-
BREAKING CHANGE
- harus uppercase dan dengan spasi
- dipakai untuk menandai perubahan yang tidak kompatibel, backward incompatible
- bisa digantikan dengan
!sebagai penandaBREAKING CHANGEtepat sebelum:dan sesudahtypeatauscopejika ada. (tetapi best practice tetap menyertakan BREAKING CHANGE)
Contoh:
-
feat: remove deprecated auth API BREAKING CHANGE: All clients must update to use /auth/jwt endpoint instead of /auth/session. -
feat!: remove deprecated auth API BREAKING CHANGE: All clients must update to use /auth/jwt endpoint instead of /auth/session. -
refactor(auth)!: remove deprecated login methods BREAKING CHANGE: `loginWithToken` has been removed. Use `authenticate` instead.
-
Referensi issue / tiket
- menghubungkan commit dengan issue atau tiket
- untuk nilai, ditambahkan
#tepat sebelum nilai - Terdapat beberapa jenis:
closescommit ini menutup issue darinilaifixescommit ini memperbaiki issue darinilairefscommit ini merujuk ke issue darinilaitanpa menutupnya
Contoh:
-
fix: handle null pointer in profile service Fixes #234 Refs #235
-
Metadata
- menambahkan metadata seperti info penulis, contributor, reviewer, dll
- konvensinya harus kebab-case
- contoh umum:
- Reviewed-by
- Co-authored-by
- Signed-off-by
Contoh:
-
fix: handle null pointer in profile service Reviewed-by: Alice Co-authored-by: Bob <bob@example.com>
- strukturnya berupa
Ringkasan
Berikut adalah poin penting dari cheat sheet conventional commits:
| Tipe | Tujuan |
|---|---|
| feat | Menambahkan fitur atau fungsi baru yang berdampak ke user |
| fix | Memperbaiki bug, error, atau kesalahan yang berdampak ke user |
| perf | Meningkatkan performa seperti speed, memory, dll |
| refactor | Mengubah atau membersihkan struktur code untuk keterbacaan oleh developer dan tidak mengubah tujuan program |
| style | Mengubah gaya dari code seperti indentasi, eol, dll serta tidak mengubah tujuan program |
| test | Menambah, mengubah atau memperbaiki unit testing |
| docs | Menambah atau mengubah dokumentasi seperti README, comment, dll |
| build | Perubahan pada production seperti konfigurasi build, dependencies, devops |
| ci | Perubahan pada konfigurasi CI/CD |
| chore | Maintenance, routine task, update devDependencies, konfigurasi project (package.json, .gitignore, dll), ganti nama. Perubahan lain yang tidak termasuk pada tipe sebelumnya |
| revert | Perubahan untuk berpindah ke commit sebelumnya |
Kesimpulan
Conventional commits pada git sangat disarankan. Jika belum terbiasa menerapkannya, terapkan secara perlahan dimulai dari feat dan fix lalu bertahan ke tipe yang lain dan pastinya jangan lupa deskripsinya. Untuk scope, body, footer bisa belakangan saja. Hope you enjoy it Developers ^-^
Catatan dari penulis terkait Bootstrap CSS:
Tidak perlu menghafal cheat sheet. Jika lupa, cukup lihat saja cheat sheet nya disini. Kalau tetap mau menghafalkannya supaya tidak repot membuka cheat sheet lagi, cukup praktekan saja, biarkan tubuhmu yang menghafal berdasarkan pengalaman dan kebiasaan, otakmu hanya untuk berfikir.
Bonus funfact
Developer profesional masih mondar-mandir lihat cheat sheet, karena mereka tau kalau menghafal itu useless dan sangat sulit menghafal sebanyak itu.