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:
{ "conv": { "prefix": "cc", "body": "${1|feat,fix,docs,chore,refactor,test,ci|}(${2:scope}): ${3:summary}" } }
پیام را انگلیسی نگه دار اگر تیم بینالمللی است؛ برای مخزن فارسی آموزشی میتوانی بدنه را فارسی و type را انگلیسی بگذاری — قرارداد را در CONTRIBUTING بنویس.
fix(login): handle expired JWT on 401
فعل امری، محدوده، نتیجه.
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 جدا میشود.