همه چیز درباره ی گردش کار Gitflow با مثال

همه چیز درباره ی گردش کار Gitflow با مثال

گردش کار Gitflow یک گردش کار در Git است که به توسعه ی مداوم نرم افزار و پیاده سازی روندهای DevOps کمک می کند. اولین بار وینسنت دریسن (Vincent Driessen)، این گردش کار را مطرح کرد و جامعه برنامه نویسان، به صورت گسترده استفاده کردند. گردش کار Gitflow یک روش شاخه گرفتن سختگیرانه را تعریف می کند که حول انتشار محصول تعریف شده است. این امر یک چهارچوب مقاوم برای مدیریت پروژه های بزرگ تر را برای ما فراهم می کند. شما می توانید در مقاله ی ۴ گردش کار در Git، مطالب بیشتری در مورد این گردش کار، در سکان آکادمی بخوانید.

اولین کسی باشید که به این سؤال پاسخ می‌دهید

Gitflow برای پروژه هایی که چرخه ی انتشار محصول برنامه ریزی شده ای دارند و همچنین برای پیاده سازی روند تحویل مداوم (Continuous Delivery) -که یک best practice در حوزه ی DevOps است- بسیار مناسب است. این گردش کار به هیچ مفهوم یا دستور جدیدی فراتر از آنچه برای گردش کار Feature Branch مورد نیاز است، نیاز ندارد. Gitflow به جای اضافه کردن مفهوم جدید، به هر شاخه، یک نقش متفاوت می دهد و مشخص می کند که این شاخه ها کی و چگونه باید با یکدیگر تعامل داشته باشند. علاوه بر شاخه ی feature، گردش کار Gitflow از شاخه های مختلفی برای آماده سازی، نگهداری و ثبت نسخه های منتشر شده استفاده می کند. در عین حال شما می توانید از تمام ویژگی های گردش کار شاخه ی feature مثل درخواست pull، کار کردن مستقل توسعه دهندگان و همکاری بهینه تر بین توسعه دهندگان بهره ببرید.


آماده سازی


Gitflow در واقع فقط یک ایده ی انتزاعی از گردش کار درGit است. این گردش کار مشخص می کند که چه نوع شاخه هایی ساخته شود و چگونه این شاخه ها را با هم merge کنیم. ما در این مقاله اهداف این شاخه ها را شرح خواهیم داد. مجموعه ابزار git-flow یک ابزار خط فرمان واقعی است که به نصب نیاز دارد. فرآیند نصب git-flow آسان است و پکیج های این ابزار برای سیستم عامل های مختلفی در دسترس است. در سیستم های OSX شما می توانید از دستور brew install git-flow استفاده کنید. همچنین در ویندوز شما می توانید آن را دانلود و نصب کنید. پس از نصب git-flow می توانید از آن در پروژه های خود با اجرای دستور git flow init استفاده کنید.
Git-flow یک ابزار توسعه داده شده روی Git است و دستور git flow init یک افزونه از دستور اصلی git init است که تنها تغییری که در مخزن شما ایجاد می کند ساختن شاخه ها برای شما است.


گردش کار Gitflow چگونه کار می کند؟

 همه چیز درباره ی گردش کار Gitflow با مثال

شاخه های develop و master


به جای یک شاخه ی master، این گردش کار از دو شاخه برای ثبت تاریخچه ی پروژه استفاده می کند. شاخه ی master تاریخچه ی نسخه های رسمی پروژه را نشان می دهد که به صورت رسمی عرضه شده اند. شاخه ی develop به عنوان یک بستر برای گرد هم آوری featureها عمل می کند. شاخه ی develop همچنین این امکان را به ما می دهد که به تمام commit ها شماره ی نسخه ی محصول را به عنوان برچسب اختصاص دهیم.
اولین قدم، ایجاد شاخه ی develop است. یک راه آسان برای توسعه دهنده، ایجاد یک شاخه ی خالی با نام develop در Git خود و push کردن آن به سرور است. این کار با دستور زیر قابل انجام است:

git branch develop
git push -u origin develop


در حالی که شاخه ی master نسخه ی خلاصه شده ای از تاریخچه ی پروژه را نگهداری می کند، این شاخه تمام تاریخچه ی پروژه را شامل خواهد شد. اکنون توسعه دهنده های دیگر باید ازمخزن مرکزی، clone بگیرند و یک شاخه ی قابل ردیابی برای develop ایجاد کنند:

$ git flow init


Initialized empty Git repository in ~/project/.git/
No branches exist yet. Base branches must be created now.
Branch name for production releases: [master]
Branch name for "next release" development: [develop]


How to name your supporting branch prefixes?
Feature branches? [feature/]
Release branches? [release/]
Hotfix branches? [hotfix/]
Support branches? [support/]
Version tag prefix? []


$ git branch
* develop
 master

شاخه های feature


هر feature جدید می بایست در شاخه ی خود قرار داشته باشد. این شاخه می تواند به مخزن مرکزی برای تهیه ی نسخه پشتیبان (backup) یا به منظور همکاری با توسعه دهنده های دیگر، push شود؛ اما به جای ایجاد شاخه ی جدید از master، شاخه های feature از شاخه ی develop به عنوان پدر استفاده می کنند. هنگامی که یک feature کامل می شود، در شاخه ی develop بابقیه merge می شود. شاخه های feature هرگز نباید به صورت مستقیم با شاخه ی master ارتباط داشته باشند.

 همه چیز درباره ی گردش کار Gitflow با مثال

شاخه های feature همراه با شاخه ی develop همان گردش کار Feature Branch را تداعی می کند؛ اما گردش کار Gitflow همین جا متوقف نمی شود.
شاخه های feature به طور معمول، از به روزترین نسخه ی شاخه ی develop گرفته می شوند.


ساخت یک شاخه ی feature


با استفاده از دستور زیر می توان یک شاخه ی feature جدید ساخت:

git checkout develop
git checkout -b feature_branch

اگر از افزونه ی git-flow استفاده می کنید امکان استفاده از دستور زیر را نیز دارید:

git flow feature start feature_branch

اکنون می توانید مثل قبل با Git کار کنید.

پایان یک شاخه ی feature


وقتی که توسعه ی یک feature به اتمام می رسد، گام بعدی merge شاخه ی feature_branch در شاخه ی develop است.
این کار با دستور زیر قابل انجام شدن است:

git checkout develop
git merge feature_branch


همچنین با افزونه ی git-flow می توانید از دستور زیر استفاده کنید:

git flow feature finish feature_branch

شاخه های انتشار (Release Branches)

 همه چیز درباره ی گردش کار Gitflow با مثال

هنگامی که شاخه ی feature ,developهای کافی را برای انتشار نسخه جدید محصول کسب کرد (یا تاریخ انتشار از قبل مشخص شده، نزدیک است)، شما یک شاخه ی انتشار از شاخه ی develop می گیرید. ایجاد این شاخه چرخه ی انتشار جدیدی را آغاز می کند، پس هر feature جدیدی باید بعد از انتشار اضافه شود. در این مرحله فقط رفع نقص، تهیه ی مستند پروژه و باقی کار های مربوط به انتشار محصول در این شاخه انجام می شوند. وقتی که محصول آماده ی ارائه است، شاخه ی انتشار در شاخه ی master، ادغام می شود و برچسب شماره ی نسخه روی آن می خورد. علاوه بر این باید شاخه ی انتشار در شاخه ی develop نیز merge شود.

استفاده از یک شاخه ی مجزا برای انتشار محصول این امکان را می دهد که در حالی که یک تیم روی featureهای دیگر برای انتشار بعدی کار می کنند، تیم دیگری این نسخه را برای انتشار نهایی آماده کنند. این کار همچنین فازبندی مراحل توسعه محصول را واضح و روشن می سازد.
ساخت یک شاخه ی انتشار نیز مانند ساخت هر شاخه ی دیگری ساده است. این شاخه از شاخه ی develop گرفته می شود.

git checkout develop
git checkout -b release/0.1.0

همچنین این کار با استفاده از افزونه ی git-flow به صورت زیر انجام می شود:

$ git flow release start 0.1.0
Switched to a new branch 'release/0.1.0'


شاخه ی انتشار پس از merge در master و develop پاک می شود. merge شاخه ی انتشار در شاخه ی develop بسیار مهم است، زیرا ممکن است به روزرسانی های حیاتی ای به شاخه ی انتشار اضافه شده باشند و این تغییرها می بایست در اختیار featureهای جدید قرار داشته باشند. اگر سازمان شما به بررسی و مرور کد، اهمیت می دهد، بهترین موقعیت برای درخواست pull اینجا است.
برای اتمام شاخه ی انتشار از دستورهای زیر استفاده کنید:

git checkout master 
git merge release/0.1.0


دستور بالا با استفاده از افزونه ی git-flow به صورت زیر در می آید:

git flow release finish '0.1.0'

شاخه های Hotfix

 همه چیز درباره ی گردش کار Gitflow با مثال

شاخه های hotfix یا نگهداری، برای رفع سریع نقص های نسخه های منتشر شده استفاده می شوند. شاخه های hotfix بسیار به شاخه های انتشار شبیه اند با این تفاوت که شاخه های hotfix به جای develop از شاخه ی master گرفته می شوند. این شاخه ها تنها شاخه ای هستند که باید به طور مستقیم از شاخه ی master گرفته شوند. به محض اینکه رفع نقص انجام شد این شاخه باید در هر دو شاخه ی master وdevelop، با هم merge شود و شاخه ی master باید یک برچسب با شماره نسخه ی جدید دریافت کند.

داشتن یک روند جدا برای رفع نقص ها به تیم شما این امکان را می دهد تا بدون مزاحمت برای سایر تیم ها، مشکل ها را حل کنند یا تا چرخه ی انتشار محصول بعدی صبر کنند. یک شاخه ی hotfix با دستورهای زیر قابل ایجاد است:

git checkout master
git checkout -b hotfix_branch


همچنین با استفاده از افزونه ی git-flow می توانید از دستور زیر استفاده کنید:

$ git flow hotfix start hotfix_branch

مشابه با شاخه ی انتشار، این شاخه، پس از پایان در هر دو شاخه ی develop و masterبا هم merge می شود:

git checkout master
git merge hotfix_branch
git checkout develop
git merge hotfix_branch
git branch -D hotfix_branch


با استفاده از افزونه ی git-flow:

$ git flow hotfix finish hotfix_branch

یک نمونه از گردش کار


یک مثال کامل از گردش کار Feature Branch به صورت زیر است. فرض می کنیم یک مخزن با شاخه ی master ساخته شده است.

git checkout master
git checkout -b develop
git checkout -b feature_branch
# work happens on feature branch
git checkout develop
git merge feature_branch
git checkout master
git merge develop
git branch -d feature_branch


علاوه بر روند feature و انتشار، یک مثال hotfix به صورت زیر است:

git checkout master
git checkout -b hotfix_branch
# work is done commits are added to the hotfix_branch
git checkout develop
git merge hotfix_branch
git checkout master
git merge hotfix_branch

جمع بندی


در این مقاله ما گردش کار Gitflow را بررسی کردیم. Gitflow یکی از چند گردش کاری است که تیم شما می تواند از آن تبعیت کند. این گردش کار برای تیم هایی که برنامه ریزی توسعه محصول را بر اساس انتشار آن انجام می دهند بسیار مناسب است. همچنین این گردش کار، روندهایی مخصوص رفع نقص محصول منتشر شده تعریف می کند و این روند را شفاف می کند.

روند کلی گردش کار Gitflow به صورت زیر است:
1. شاخه ی develop از شاخه ی master گرفته می شود.
2. شاخه ی انتشار از شاخه ی develop گرفته می شود.
3. شاخه های feature از شاخه ی develop گرفته می شوند.
4. وقتی که کار روی یک شاخه ی feature تمام می شود، این شاخه در شاخه ی merge ،develop می شود.

5. وقتی که کار روی شاخه ی انتشار تمام می شود، این شاخه در هر دو شاخه ی develop وmaster با هم merge می شود.
6. اگر نقص در شاخه ی master شناسایی شود، یک شاخه ی hotfix از شاخه ی master گرفته می شود.
7. وقتی که نقص در شاخه ی hotfix رفع شد، این شاخه در هر دو شاخه ی develop و master ادغام می شود.
امیدوارم این مقاله برای شما مفید باشد و بتوانید از این گردش کار در پروژه های خود استفاده کنید. همچنین خوشحال می شوم نظرهای خود را در مورد این مقاله با ما به اشتراک بگذارید.

منبع