پ.ن: این مقاله برای کسانی مناسب است که حداقل آشنایی لازم و تجربه کار با Git را داشته باشند.
همانطور که مطلع هستید، Git یک ابزار برای مدیریت تغییرات در یک پروژه است، به عنوان مثال در تیم های کوچک (۲ تا ۳ نفره)، استفاده از گیت به سادگی قابل انجام است و تا حدودی نیز کمک کننده است؛ حال اگر بخواهیم این مسئله را به پروژه های بلند مدت و با پیچیدگی و وابستگی های بالا یا به اجرای پروژه در تیم های بزرگتر تعمیم دهیم، آن وقت چه اتفاقی رخ خواهد داد؟
اینجاست که اگر قوانین سختگیرانهای در مورد "چگونگی اعمال تغییرات روی خود Git" نداشته باشیم؛ ممکن است در دراز مدت شاهد یک پروژه با Git بسیار بهم ریخته و اصطلاحا شلخته روبهرو شویم.
دلایل زیادی میتواند باعث بهم ریختگی پروژه شود؛ در ادامه چند مورد از دلایلی که طبق تجربه خودم، از عوامل تخریب نظم پروژه هستند را باهم بررسی میکنیم:
حال بیاید یک نمونه از پروژه های که از ابتدا بدون هیچ قانون و مدیریت خاصی روی Git تاکنون پیشرفت کرده را باهم بررسی کنیم؛ توجه کنید این پروژه یک پروژه موفق و پر بازده است، ما قرار است در بخش فنی و صرفا از نظر تکنیکال آن را مورد بررسی قرار دهیم.
پ.ن: به علت حفظ اصل محرمانگی داده و جلوگیری از آشکار شدن مشخصات پروژه، قسمت هایی که شامل اطلاعات حساس هستند از داخل تصویر بالا حذف شدهاند.
در ادامه سعی کنید چند سوال خیلی مهم را با توجه به وضعیت پروژه در تصویر بالا پاسخ دهید:
اگر توانستید تمام سوالات بالا را جواب دهید؛ این مقاله به درد شما نمیخورد پس آن را ببندید و از وجود چنین مقاله ای اظهار بیاطلاعی کنید چون شما در Levelهای بالاتری از من و ۹۹ درصد توسعه دهندگان جهان زندگی میکنید.
خب راه کار مناسب برای جلوگیری از مشکل پیش آمده و شفاف کردن مسائل مطرح شده در سوالات بالا، چیست؟ اینجاست که ما با مفهومی به اسم Git Flow آشنا میشویم.
همانطور که در بحث مهندسی نرم افزار مفهومی تحت عنوان روش های مدیریت پروژه مانند Scrum, Agile, XP و موارد مشابه داریم، در بحث مدیریت Git نیز چنین مفاهیمی برای این مسئله داریم که شامل یک سری قوانین و اصول از پیش تعریف شده هستند که میتوانند بر اساس سیاست ها و ساختار هر تیم، شخصیسازی و مورد استفاده قرار گیرند؛ کلمه Git Flow در حقیقت اسم یکی از ابزار هایی است که Git برای مدیریتش در اختیار ما قرار میدهد.
از مهمترین وظایفی گه ما از Git Flow انتظار داریم برای ما برآورده کند، میتوانیم به موارد زیر اشاره کنیم:
در فرایند Git Flow تمامی Branchها به چند دستهبندی زیر تقسیم میشوند و ساخت یک Branch خارج از این دستهبندی باعث بروز مشکلات گفته شده میشود.
فرض کنید بعد از یک ماه از انتشار آخرین نسخه، متوجه یک مشکل بحرانی در پروژه میشوید و از طرفی هم در شرایطی نیستید که بخواهید آخرین نسخه توسعه یافته پروژه خود را منتشر کنید یا اصطلاحا آپدیت جدید داشته باشید؛ در چنین شرایطی باید از Master یک Sub-Branch تحت عنوان Hotfix ایجاد کرده و بعد از رفع مشکل بلافاصله مجددا روی Master ادغام شود؛ بدیهی است که بعد از ادغام روی Master، تغییرات منتشر میشود.
به طور کلی، هر ویژگی جدیدی که قرار است به پروژه اضافه شود یا هر تغییری که قرار است در ویژگی های فعلی پروژه اعمال شود، تحت عنوان Feature-Branch روی پروژه اعمال میشود.
همانطور که در جمله بالا مشخص است، برای تغییر روی ویژگی های فعلی پروژه باید از Feature استفاده کرد، حال اگر برای ویژگی موردنظر و Task مربوط به آن، از قبل یک Feature-Branch موجود باشد با ادغام Develop روی آن Branch، تغییرات را ادامه میدهیم در غیر این صورت برای تغییرات موردنظر یک Feature-Branch جدید میسازیم.
در دستهبندی Branch های Git Flow، دو پوشه اختیاری به نام های Bugfix و Upgrade مشاهده میشود که مشخصات و قوانین آن دقیقا مشابه Feature است؛ فقط در مورد Bugfix تنها نکته حائز اهمیت این است که اگر رفع مشکل مربوطه، فقط با یک Commit قابل حل باشد، تغییرات مربوط به آن روی Develop اعمال میشود در غیر این صورت یک Branch جدید تحت عنوان Bugfix برای آن ساخته میشود.
هنگامی که تصمیم میگیریم یک نسخه جدید از آخرین تغییرات توسعه یافته پروژه را منتشر کنیم باید یکسری تغییرات روی پروژه اعمال کنیم که پیش زمینه انتشار نسخه جدید است، به عنوان مثال تغییر در Version Code پروژه، Rebuild پلاگین های مورد استفاده، جابجایی بین پلاگین های Market-Base مانند پلاگین های پرداخت و سایر تغییراتی که صرفا در فرایند آماده سازی خروجی برای نسخه جدید روی پروژه اعمال میشود؛ همگی از جمله تغییراتی هستند که تحت عنوان Release-Branch روی پروژه اعمال میشود.
(۱) استفاده از Command و ابزار Git Flow
همانطور که قبلا اشاره کردم، Git Flow یکی از ابزارها و دستورات Git است که برای تسهیل فرایند و قوانین گفته شده توسعه یافته است و میتوانید با اجرای دستور `git flow` و دستورات start و finish نسبت به مدیریت Flow خود اقدام کنید.
(۲) رعایت اصول مربوط به Git Flow در مدیریت Git
در این روش با شناخت قوانین اولیه Git Flow و رعایت اصولی که در این مقاله مطرح میشود، میتوانید یک Flow سفارشی و هماهنگ با سیاست ها و اولویت های تیم توسعه خود، طراحی و پیاده سازی کنید؛ من با توجه به تجربهای که در پیاده سازی این مسئله در یک پروژه نسبتا پیچیده داشتم پیشنهاد میکنم از روش دوم استفاده کنید که انعطاف پذیری بالاتری دارد و به مدیران پروژه آزادی عمل بیشتری میدهد.
اولین اصل مهم در مدیریت Git، مشخص کردن نقش هر عضو از پروژه در سیستم Git است؛ شخصیت ها در پروژه به ۵ دسته زیر دستهبندی میشوند:
بررسی تفاوت های هر کدام از نقش های بالا خارج از حوصله این مقاله است، در صورتی که علاقهمند به آشنایی با این مفاهیم هستید میتوانید مقالات زیر را مطالعه کنید:
Repository roles for an organization on Git-Hub
Permissions and roles on Git-Lab
پس از مشخص کردن نقش هر شخص در پروژه، عملیات های اصلی روی Branchها در Git بر اساس جدول زیر میتواند انجام شود:
به دلیل عدم اثر گذاری نقش های Reporter و Guest در فرایند Git Flow، از آوردن آنها در جدول بالا خودداری کردیم.
دومین و مهمترین اصل در مدیریت Git، قوانین مرتبط با کنترل Branchهای پروژه است چون ساختار و دستهبندی اصلی پروژه را مشخص میکند؛ این قوانین به شرح زیر است:
در اینجا فرض بر این است که برای مدیریت پیشرفت پروژه از Jira استفاده میشود و ارتباط بین Jira با Git به درستی برقرار بوده و همچنین قابلیت Smart Comment نیز فعال است.
هیچ کس حتی مدیر پروژه نمیتواند با دستور Merge این کار را مستقیما روی Branchها انجام دهد.
پس از ارسال درخواست ادغام Branchها، افرادی که قبلتر به آن اشاره کردم با بررسی سلسله تغییرات و تایید آنها، عملیات Merge را انجام میدهند.
{Base Git Address}/[Optional Branch Name]_[Jira Code] origin/features/featureTestA_PFT-16
مشخصا هر ادغامی که صورت میگیرد نتیجه تکمیل شدن یک Sprint یا Task است که با درج کردن شماره آن در پیام هر Merge میتوان در آینده، ارتباط بهتری با تغییرات انجام شده برقرار کرد و بررسی مشکلات احتمالی را سادهتر میکند.
به عنوان مثال، ممکن است یک پروژه شامل دو پروژه Server و Client باشد و یک Task نیازمند تغییرات مشترکی برای هر دو طرف پروژه باشد در چنین شرایطی نامگذاری Branch مربوطه برای هر دو طرف یکسان انجام میشود.
در انتهای مقاله نیز به بررسی یکی از پروژه هایی که بیش از ۱ سال، اصول و قوانین Git Flow روی آن رعایت شده میپردازیم:
پ.ن ۱: به علت حفظ اصل محرمانگی داده و جلوگیری از آشکار شدن مشخصات پروژه، قسمت هایی که شامل اطلاعات حساس هستند از داخل تصویر بالا حذف شدهاند.
پ.ن ۲: قسمت های قرمز رنگ همان پیشوند مربوط به پروژه در Jira است که در نامگذاری Branchها رعایت شده است.
حالا میتوانید سوالاتی که در ابتدای مقاله مطرح شد را اینجا از خود بپرسید و با توجه نکات مطرح شده و اطلاعات حاضر در تصویر بالا، به آن پاسخ دهید.
منتظر پیشنهادات و انتقادات سازنده. شما دوستان در این حوزه هستم.
موفق و سربلند باشید