Conventional Commits — commit xabarlarini standartlashtirish

~15 daq · Git · Professional Git Workflow

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.0 mi yoki 2.0.0 mi? — 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 main dagi 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
  • ! yoki BREAKING 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