Git 2026

فصل ۲۲ · Conventional Commits

Conventional Commits — پیام به‌عنوان API

Conventional Commits یعنی پیام را با قالب ثابت بنویسی: نوع(محدوده): خلاصه. مثال: feat(auth): add refresh token. ابزارها از روی نوع می‌فهمند نسخه و changelog را چطور عوض کنند.

🎯 اهداف یادگیری

  • مشخصات Conventional Commits 1.0.0 را رعایت کنی
  • feat! و BREAKING CHANGE را درست علامت بزنی
  • commitlint را در ذهن داشته باشی (پیاده در فصل ۲۵)
  • در VS Code پیام را بدون درد بنویسی

📜 مشخصات

فرمول
type(scope)!: description

[body]

[footer]

انواع استاندارد: feat، fix، docs، style، refactor، perf، test، build، ci، chore، revert.

نمونه‌ها
feat(auth): add rotating refresh tokens
fix(pdf): embed Vazirmatn to avoid tofu glyphs
docs(readme): add PDF badge
feat(api)!: drop v1 endpoints

BREAKING CHANGE: clients must use /v2

Semantic Release:

  • fix → PATCH (1.2.3 → 1.2.4)
  • feat → MINOR (1.2.3 → 1.3.0)
  • ! یا BREAKING CHANGE → MAJOR (1.2.3 → 2.0.0)

✍️ در VS Code

افزونهٔ Conventional Commits فرم می‌دهد. یاSnippet:

snippets
{
  "conv": {
    "prefix": "cc",
    "body": "${1|feat,fix,docs,chore,refactor,test,ci|}(${2:scope}): ${3:summary}"
  }
}

پیام را انگلیسی نگه دار اگر تیم بین‌المللی است؛ برای مخزن فارسی آموزشی می‌توانی بدنه را فارسی و type را انگلیسی بگذاری — قرارداد را در CONTRIBUTING بنویس.

good

fix(login): handle expired JWT on 401

فعل امری، محدوده، نتیجه.

bad

fixed stuff / WIP / asdf / update files

چند تغییر = چند کامیت

اگر README و منطق auth را با هم عوض کردی، دو کامیت بساز (add -p). changelog دروغ نگوید.

سؤالات مصاحبه (با پاسخ)

Junior — type اجباری است؟ برای Git نه؛ برای انسان و ربات در تیم‌های مدرن عملاً بله.

Senior — چرا ! و BREAKING هر دو؟ ! در عنوان برای انسان و parser سریع؛ footer برای توضیح مهاجرت. ابزارها هر دو را می‌فهمند.

✅ چک‌لیست فهم

  • ۱۰ کامیت آخرت Conventional است
  • breaking را علامت می‌زنی
  • WIP را قبل از ریویو می‌شکنی/squash می‌کنی

فصل بعد: بخش سوم — rebase تعاملی؛ جایی که Senior از Mid جدا می‌شود.

فصل ۲۲ از ۳۶ · مرجع جامع و حرفه‌ای Git و GitHub · ویرایش 1.0.0