عنوان:

‫Conventional Commits چیست؟


نویسنده: مسعود
تاریخ: ۱۴۰۳/۱۲/۰۷ ۱۲:۱۰
آدرس: www.dntips.ir
Conventional Commits یک استاندارد و قرارداد ساده برای نوشتن پیام‌های کامیت (Commit Messages) در سیستم‌های کنترل نسخه مانند Git است که به شما کمک می‌کند تا تاریخچه‌ی کامیت‌های پروژه‌ی خود را به صورت منظم، قابل‌فهم و خودکار مدیریت کنید.

فرمت Conventional Commits به شکل زیر است:
<type>[optional scope]: <description>

[optional body]

[optional footer(s)]
  • type (نوع کامیت): نوع تغییر (مثل feat, fix, docs, refactor, و ...).
  • scope (دامنه اختیاری): بخشی از کدبیس که تغییر کرده (مثلاً api, ui, parser).
  • description (توضیح کوتاه): خلاصه‌ای از تغییر انجام شده.
  • body (بدنه اختیاری): توضیحات تکمیلی و جزئیات بیشتر.
  • footer (پانویس اختیاری): شامل اطلاعاتی مثل BREAKING CHANGE یا مرجع مسائل (issue references)

Conventional Commits مثال‌های

feat(parser): اضافه کردن قابلیت پشتیبانی از JSON

fix: رفع مشکل کرش کردن برنامه در هنگام بارگذاری تصویر

docs: به‌روزرسانی راهنمای نصب در README.md

refactor(ui): بهینه‌سازی کامپوننت دکمه‌ها

chore: بروزرسانی وابستگی‌های پروژه به نسخه‌های جدید

BREAKING CHANGE: متد oldMethod حذف شده است. از متد newMethod استفاده کنید.

پیام کامیت با توضیح و پاورقی تغییری بزرگ
feat: allow provided config object to extend other configs

BREAKING CHANGE: `extends` key in config file is now used for extending other config files

پیام کامیت با علامت ! برای نشان دادن تغییری بزرگ
feat!: send an email to the customer when a product is shipped

پیام کامیت با محدوده و ! برای نشان دادن تغییری بزرگ
feat(api)!: send an email to the customer when a product is shipped

پیام کامیت بدون بدنه
docs: correct spelling of CHANGELOG

پیام کامیت با بدنه‌ی چند پاراگرافی و چند پاورقی
fix: prevent racing of requests

Introduce a request id and a reference to latest request. Dismiss
incoming responses other than from latest request.

Remove timeouts which were used to mitigate the racing issue but are
obsolete now.

Reviewed-by: Z
Refs: #123

نوعهای پرکاربرد Conventional Commits


در استاندارد Conventional Commits، انواع مختلفی از کامیت‌ها استفاده می‌شود که هر کدام معنای خاصی دارند. در ادامه انواع پرکاربرد این کامیت‌ها به همراه شرح مختصر و مثال ارائه شده است:

feat: کامیتی از نوع feat برای معرفی یک ویژگی جدید به کد شما استفاده می‌شود (مطابق با MINOR در نسخه‌بندی معنایی).
مثال:
feat: اضافه کردن قابلیت جستجو به صفحه اصلی

fix: کامیتی از نوع fix برای رفع یک باگ در کد شما استفاده می‌شود (مطابق با PATCH در نسخه‌بندی معنایی).
مثال:
fix: رفع مشکل عدم نمایش تصاویر در مرورگر Safari

chore: برای تغییرات متفرقه که تاثیری روی منطق کد ندارد، مانند به‌روزرسانی وابستگی‌ها یا تغییرات پیکربندی.
:مثال
chore: بروزرسانی وابستگی‌های npm

docs: برای به‌روزرسانی یا بهبود مستندات پروژه.
مثال:
docs: اصلاح غلط املایی در README.md

style: برای تغییرات ظاهری و فرمت‌بندی کد که تاثیری بر منطق کد ندارد (مانند اصلاح فاصله‌ها، کاماها، یا نام‌گذاری متغیرها).
مثال:
style: قالب‌بندی مجدد کد مطابق با استاندارد ESLint

refactor: برای بهبود ساختار کد بدون تغییر در رفتار (بدون اضافه کردن ویژگی جدید یا رفع باگ).
مثال:
refactor: بهینه‌سازی منطق تابع calculateTotalPrice

perf: برای بهبود عملکرد و بهینه‌سازی سرعت یا مصرف منابع.
مثال:
perf: کاهش زمان بارگذاری صفحه با فشرده‌سازی تصاویر

test: برای افزودن یا به‌روزرسانی تست‌های واحد (unit tests) یا تست‌های یکپارچه (integration tests).
مثال:
test: افزودن تست واحد برای تابع validateEmail

build: برای تغییرات مربوط به سیستم بیلد (build system) یا ابزارها و وابستگی‌های خارجی (مانند Webpack، npm، Gradle).
مثال:
build: تنظیم پیکربندی Webpack برای پشتیبانی از تصاویر SVG

ci: برای تغییرات مربوط به سیستم یکپارچه‌سازی پیوسته (CI)، مانند تنظیمات GitHub Actions، Jenkins، Travis.
مثال:
ci: افزودن مرحله lint به گردش کار GitHub Actions

BREAKING CHANGE: برای نشان دادن تغییرات بزرگ و ناسازگار با نسخه‌های قبلی. می‌تواند در هر نوع کامیتی استفاده شود. کامیتی که دارای پاورقی BREAKING CHANGE: باشد یا پس از نوع/محدوده علامت ! داشته باشد، تغییرات بزرگی در API ایجاد می‌کند (مطابق با MAJOR در نسخه‌بندی معنایی).
مثال:
feat!: حذف متد قدیمی getUserData

BREAKING CHANGE: متد getUserData حذف شده است. از متد جدید fetchUserData استفاده کنید.

revert: برای بازگردانی تغییرات قبلی که با یک کامیت دیگر ایجاد شده‌اند.
مثال:
revert: بازگشت تغییرات مربوط به بروزرسانی وابستگی react-router

این تغییر باعث مشکلات ناخواسته در ناوبری صفحات شد.

مزایای استفاده از Conventional Commits

استفاده از این استاندارد مزایای زیادی دارد که شامل موارد زیر می‌شود:
1. 📈 تولید خودکار CHANGELOG
با استفاده از ابزارهایی مانند semantic-release و standard-version می‌توانید به صورت خودکار فایل CHANGELOG.md را ایجاد و به‌روزرسانی کنید.
2. 🔢 نسخه‌بندی معنایی (Semantic Versioning)
تغییرات در نسخه‌ها به‌طور خودکار بر اساس نوع کامیت‌ها انجام می‌شود:
  • fix → نسخه Patch افزایش می‌یابد (مثال: 1.0.01.0.1).
  • feat → نسخه Minor افزایش می‌یابد (مثال: 1.0.01.1.0).
  • BREAKING CHANGE → نسخه Major افزایش می‌یابد (مثال: 1.0.02.0.0).
3. 🛠 بهبود یکپارچگی و CI/CD
پیام‌های کامیت منظم و ساختاریافته به ابزارهای CI/CD کمک می‌کنند تا بر اساس نوع تغییرات، عملیات مناسب (مانند تست، ساخت و انتشار) را به صورت خودکار انجام دهند.
4. 👥 ارتباط شفاف با تیم و کاربران
خواندن تاریخچه‌ی کامیت‌ها ساده‌تر می‌شود و تیم توسعه و حتی کاربران پروژه به راحتی می‌توانند بفهمند چه تغییراتی در پروژه رخ داده‌است.
5. 💡 بهبود فرآیند Code Review
هنگام بررسی کدها (Code Review)، نوع و هدف تغییرات به وضوح مشخص است که این کار را سریع‌تر و دقیق‌تر می‌کند.
6. 🎯 تشویق به کامیت‌های کوچک و منظم
برای رعایت استاندارد، توسعه‌دهندگان به جای کامیت‌های بزرگ و نامفهوم، تغییرات را به صورت گام‌به‌گام و با توضیحات مناسب انجام می‌دهند.