Conventional Commits — commit xabarlarini standartlashtirish
Muammodan boshlaylik
Jamoaning commit tarixi:
Added login
fix bug in cart
Savat tuzatildi
UPDATE README
refactoring
Merge branch 'dev'
new feature: search
Har kim o'zicha yozadi. Natija:
- "Oxirgi relizdan beri qanday yangi funksiyalar qo'shildi?" — har bir commitni o'qib chiqish kerak
- CHANGELOG ni qo'lda yozish — soatlar
- Keyingi versiya
1.3.0mi yoki2.0.0mi? — taxmin
Conventional Commits — commit xabarlari uchun oddiy standart. U xabarlarni ham odam, ham mashina uchun o'qiladigan qiladi.
Format
<tur>[(soha)][!]: <tavsif>
[batafsil matn]
[footer(lar)]
Misollar:
feat: mahsulot qidiruvi qo'shildi
fix(savat): manfiy miqdor kiritish taqiqlandi
docs: o'rnatish yo'riqnomasi yangilandi
refactor(api): to'lov xizmati alohida modulga ajratildi
feat(auth)!: JWT o'rniga sessiya cookie lari
Turlar
| Tur | Ma'nosi | Versiyaga ta'siri |
|---|---|---|
feat |
Yangi funksiya | MINOR (1.2.0 → 1.3.0) |
fix |
Xato tuzatish | PATCH (1.2.0 → 1.2.1) |
docs |
Faqat hujjat | — |
style |
Formatlash, bo'shliqlar (mantiq o'zgarmaydi) | — |
refactor |
Kod qayta tuzilishi — funksiya ham, xato ham emas | — |
perf |
Tezlikni oshirish | PATCH |
test |
Testlar qo'shish yoki tuzatish | — |
build |
Build tizimi, bog'liqliklar (package.json) |
— |
ci |
CI sozlamalari (GitHub Actions) | — |
chore |
Boshqa xizmat ishlari | — |
revert |
Oldingi commitni bekor qilish | — |
Asosiylari — feat va fix. Qolganlari — jamoa kelishuviga ko'ra.
Soha (scope)
Qavs ichida — loyihaning qaysi qismi:
feat(savat): miqdor tanlash
fix(tolov): Payme summa yaxlitlash
docs(api): /mahsulotlar endpoint tavsifi
Sohalar ro'yxatini jamoa belgilaydi: auth, savat, tolov, api, ui...
Breaking change — buzuvchi o'zgarish
Eski kod yoki API foydalanuvchilarini buzadigan o'zgarish — ikki usulda belgilanadi:
feat(api)!: /api/v1/users endpoint olib tashlandi
yoki footer da:
feat(api): foydalanuvchilar API si qayta loyihalandi
BREAKING CHANGE: /api/v1/users o'rniga /api/v2/foydalanuvchilar ishlatiladi.
Javob formati ham o'zgardi: `name` → `ism`.
Bu — MAJOR versiya (1.2.0 → 2.0.0, keyingi dars).
Footer lar
fix(savat): 10 dan ortiq mahsulot hisoblanmasdi
Tsikl chegarasi `< 10` emas, `< items.length` bo'lishi kerak edi.
Closes #42
Reviewed-by: Malika Karimova
Closes #42 — issue ni avtomatik yopadi (25-dars).
Nima beradi
1. O'qiladigan tarix
git log --oneline
a3f9c2b feat(qidiruv): kategoriya filtri
9f8e7d6 fix(savat): manfiy miqdor taqiqlandi
8e7d6c5 docs: README yangilandi
7d6c5b4 feat(auth)!: sessiya cookie lari
Bir qarashda — nima, qayerda, qanchalik muhim.
git log --oneline --grep="^feat" # faqat yangi funksiyalar
git log --oneline --grep="^fix(tolov)" # to'lov tuzatishlari
2. Avtomatik CHANGELOG
Vositalar commitlardan avtomatik yaratadi:
## [1.3.0] - 2026-11-06
### Features
- **qidiruv:** kategoriya filtri (a3f9c2b)
### Bug Fixes
- **savat:** manfiy miqdor taqiqlandi (9f8e7d6), closes #42
3. Avtomatik versiya
feat bor → MINOR; faqat fix → PATCH; ! yoki BREAKING CHANGE → MAJOR. semantic-release, release-please, changesets kabi vositalar CI da versiyani hisoblaydi, teg qo'yadi, CHANGELOG yozadi va reliz chiqaradi (41-dars).
Majburlash: commitlint
Standart — faqat hamma rioya qilsa ishlaydi. Avtomatik tekshiruv:
npm install -D @commitlint/cli @commitlint/config-conventional
echo "export default { extends: ['@commitlint/config-conventional'] };" > commitlint.config.js
Git hook bilan (47-dars) — har commit da tekshiradi:
npm install -D husky
npx husky init
echo 'npx --no -- commitlint --edit "$1"' > .husky/commit-msg
git commit -m "savat tuzatildi"
⧗ input: savat tuzatildi
✖ subject may not be empty [subject-empty]
✖ type may not be empty [type-empty]
✖ found 2 problems, 0 warnings
git commit -m "fix(savat): manfiy miqdor taqiqlandi" # ✅
[!TIP] Squash merge (23-dars) ishlatadigan jamoalarda faqat PR sarlavhasi muhim — u
maindagi yagona commit xabari bo'ladi. Unda PR sarlavhasini Conventional formatda tekshiruvchi GitHub Action yetarli, oraliq commitlar esa erkin bo'lishi mumkin.
Til haqida
Standart tur nomlarini (feat, fix) inglizcha qoldiring — vositalar ularni taniydi. Tavsif esa jamoa tilida bo'lishi mumkin:
feat(savat): miqdor tanlash qo'shildi ← o'zbek jamoasi uchun normal
feat(cart): add quantity selector ← xalqaro / ochiq loyiha
Muhimi — bitta loyihada bitta til.
Nima uchun shunday?
Nima uchun commit xabarlarini qolipga solish kerak — bu ijodkorlikni cheklamaydimi?
Commit xabari — ijod emas, ma'lumotlar. Standart format ularni tuzilmali ma'lumotga aylantiradi: tur, soha, muhimlik — bularni endi mashina o'qiy oladi. Natijada qo'lda qilinadigan zerikarli ishlar — CHANGELOG yozish, versiya raqamini o'ylash, "bu relizda nima bor" ro'yxatini tuzish — avtomatik bo'ladi. Odamlar uchun esa bir xil format — tez o'qish: fix(tolov) ni ko'rib, darhol "to'lovdagi xato tuzatilgan" deb tushunasiz. Tavsif esa erkin qoladi — siz baribir "nima va nima uchun" ni o'z so'zlaringiz bilan yozasiz (8-dars).
Xulosa
Eslab qoling:
- Format:
tur(soha): tavsif; bo'sh qator; batafsil; footer feat— yangi funksiya (MINOR);fix— xato (PATCH)docs,style,refactor,perf,test,build,ci,chore!yokiBREAKING CHANGE:— buzuvchi o'zgarish (MAJOR)- Footer:
Closes #42 - Foyda: o'qiladigan tarix, avtomatik CHANGELOG va versiya
- commitlint + husky — avtomatik tekshirish
- Squash merge da — PR sarlavhasi muhim
Keyingi dars
35-dars: Semantic Versioning — major, minor, patch versiyalash