Git و GitHub

سير عمل Git Flow

13 دقيقة الدرس 24 من 35

سير عمل Git Flow

Git Flow هو نموذج تفريع شائع صممه Vincent Driessen يوفر إطار عمل قوي لإدارة المشاريع الأكبر مع إصدارات مجدولة. يحدد بنية تفريع صارمة حول إصدارات المشروع.

ما هو Git Flow؟

Git Flow هو استراتيجية تفريع تستخدم فروعاً متعددة طويلة الأجل وأنواع فروع محددة لأغراض مختلفة. إنه مناسب بشكل خاص للمشاريع ذات دورات الإصدار المجدولة.

الأصل: تم تقديم Git Flow في عام 2010 بواسطة Vincent Driessen في مقالته "نموذج تفريع Git ناجح" وأصبح واحداً من أكثر سير العمل اعتماداً.

الفروع الأساسية

يستخدم Git Flow فرعين رئيسيين لهما عمر لا نهائي:

main (أو master): - كود جاهز للإنتاج - كل التزام هو إصدار جديد - دائماً مستقر وقابل للنشر - لا تلتزم مباشرة بـ main أبداً develop: - فرع التكامل للميزات - يحتوي على أحدث تغييرات التطوير - مصدر الإصدار التالي - فروع الميزات تدمج هنا

الفروع الداعمة

يستخدم Git Flow ثلاثة أنواع من الفروع الداعمة ذات عمر محدود:

فروع الميزات: - تفرع من: develop - تدمج مرة أخرى إلى: develop - التسمية: feature/*, feature-* - الغرض: تطوير ميزات جديدة فروع الإصدار: - تفرع من: develop - تدمج مرة أخرى إلى: main وَ develop - التسمية: release/*, release-* - الغرض: إعداد إصدار الإنتاج فروع الإصلاح العاجل: - تفرع من: main - تدمج مرة أخرى إلى: main وَ develop - التسمية: hotfix/*, hotfix-* - الغرض: إصلاحات إنتاج سريعة

تصور Git Flow

إليك كيف تتفاعل الفروع:

main o-----------o-----------o \ /|\ / release \ / | \ / o-----o | o-----o \ / | \ / develop o-o----o----o-o----o | | | feature o o o \ / \ / o o

تثبيت Git Flow

قم بتثبيت امتداد Git Flow للأوامر المريحة:

# macOS (Homebrew) brew install git-flow # Linux (Ubuntu/Debian) apt-get install git-flow # Windows # التنزيل من: https://gitforwindows.org/ # Git Flow مضمن في Git for Windows # التحقق من التثبيت git flow version
ملاحظة: يمكنك استخدام Git Flow بدون الامتداد باستخدام أوامر Git العادية، ولكن الامتداد يجعله أكثر ملاءمة.

تهيئة Git Flow

قم بإعداد Git Flow في مستودعك:

# تهيئة Git Flow (إعداد تفاعلي) git flow init # أجب على المطالبات (أو اضغط على Enter للإعدادات الافتراضية): # اسم الفرع لإصدارات الإنتاج: [main] # اسم الفرع لتطوير "الإصدار التالي": [develop] # بادئة فروع الميزات: [feature/] # بادئة فروع الإصدار: [release/] # بادئة فروع الإصلاح العاجل: [hotfix/] # بادئة فروع الدعم: [support/] # بادئة علامة الإصدار: [] # أو استخدم الإعدادات الافتراضية بشكل غير تفاعلي git flow init -d

العمل مع فروع الميزات

تطوير ميزات جديدة في فروع معزولة:

# بدء ميزة جديدة git flow feature start user-authentication # هذا ينشئ feature/user-authentication من develop # ويتحول إليه تلقائياً # العمل على الميزة الخاصة بك git add . git commit -m "Add login functionality" git commit -m "Add logout functionality" # إنهاء الميزة (يدمج مرة أخرى إلى develop) git flow feature finish user-authentication # خلف الكواليس، هذا يفعل: # 1. يدمج الميزة في develop # 2. يحذف فرع الميزة # 3. يتحول مرة أخرى إلى develop
# نشر الميزة إلى البعيد (للتعاون) git flow feature publish user-authentication # سحب ميزة شخص آخر git flow feature pull origin user-authentication # قائمة جميع الميزات git flow feature list

إنشاء إصدار

إعداد إصدار إنتاج جديد:

# بدء فرع إصدار git flow release start 1.2.0 # هذا ينشئ release/1.2.0 من develop # يُسمح فقط بإصلاحات الأخطاء والتوثيق ومهام الإصدار # إجراء استعدادات الإصدار echo "1.2.0" > VERSION git commit -am "Bump version to 1.2.0" # تحديث CHANGELOG git commit -am "Update CHANGELOG for 1.2.0" # إنهاء الإصدار git flow release finish 1.2.0 # هذا سوف: # 1. يدمج الإصدار في main # 2. يضع علامة على الإصدار بالإصدار # 3. يدمج الإصدار مرة أخرى في develop # 4. يحذف فرع الإصدار # دفع كل شيء بما في ذلك العلامات git push origin main develop --tags
مهم: لا ينبغي إضافة ميزات جديدة أثناء فرع الإصدار. يُسمح فقط بإصلاحات الأخطاء والتغييرات المتعلقة بالإصدار.

معالجة الإصلاحات العاجلة

إصلاح أخطاء الإنتاج الحرجة بسرعة:

# بدء إصلاح عاجل (من main) git flow hotfix start 1.2.1 # هذا ينشئ hotfix/1.2.1 من main # إصلاح الخطأ الحرج git commit -am "Fix critical security vulnerability" # إنهاء الإصلاح العاجل git flow hotfix finish 1.2.1 # هذا سوف: # 1. يدمج الإصلاح العاجل في main # 2. يضع علامة مع إصدار الإصلاح العاجل # 3. يدمج الإصلاح العاجل مرة أخرى في develop # 4. يحذف فرع الإصلاح العاجل # دفع التغييرات git push origin main develop --tags

Git Flow بدون الامتداد

استخدم أوامر Git العادية إذا كنت تفضل:

فرع الميزة: git checkout develop git checkout -b feature/my-feature # العمل... git checkout develop git merge --no-ff feature/my-feature git branch -d feature/my-feature فرع الإصدار: git checkout develop git checkout -b release/1.2.0 # إعداد الإصدار... git checkout main git merge --no-ff release/1.2.0 git tag -a v1.2.0 -m "Version 1.2.0" git checkout develop git merge --no-ff release/1.2.0 git branch -d release/1.2.0 فرع الإصلاح العاجل: git checkout main git checkout -b hotfix/1.2.1 # إصلاح الخطأ... git checkout main git merge --no-ff hotfix/1.2.1 git tag -a v1.2.1 -m "Version 1.2.1" git checkout develop git merge --no-ff hotfix/1.2.1 git branch -d hotfix/1.2.1
علامة --no-ff: تفرض إنشاء التزام دمج حتى عندما يكون التقديم السريع ممكناً. هذا يحافظ على الوجود التاريخي لفرع الميزة.

الإصدار الدلالي

يعمل Git Flow بشكل جيد مع الإصدار الدلالي:

التنسيق: MAJOR.MINOR.PATCH (مثلاً، 2.4.1) MAJOR (2): - تغييرات API غير متوافقة - تغييرات كاسرة - مثال: 1.9.0 → 2.0.0 MINOR (4): - ميزات جديدة (متوافقة مع الإصدارات السابقة) - إضافات وظيفية - مثال: 2.3.0 → 2.4.0 PATCH (1): - إصلاحات الأخطاء (متوافقة مع الإصدارات السابقة) - إصلاحات عاجلة - مثال: 2.4.0 → 2.4.1 أمثلة: إصدار ميزة: 1.2.0 → 1.3.0 إصلاح عاجل: 1.3.0 → 1.3.1 تغيير كاسر: 1.9.0 → 2.0.0

متى تستخدم Git Flow

Git Flow مثالي لأنواع معينة من المشاريع:

✓ جيد لـ: - الإصدارات المجدولة (شهرياً، ربع سنوياً) - إصدارات متعددة في الإنتاج - فرق كبيرة مع أدوار محددة - مشاريع تتطلب إصدارات مستقرة - تطبيقات سطح المكتب أو الهاتف المحمول - منتجات البرمجيات التقليدية ✗ غير مثالي لـ: - النشر المستمر (نشر عدة مرات يومياً) - فرق صغيرة مع تكرارات سريعة - تطبيقات الويب مع إصدارات متدحرجة - مشاريع تحتاج إلى تحديثات إنتاج فورية - منتجات SaaS مع التسليم المستمر

أفضل ممارسات Git Flow

✓ احتفظ بـ main دائماً قابلاً للنشر ✓ يجب أن يكون Develop مستقراً (جميع الاختبارات تمر) ✓ ميزة واحدة لكل فرع ميزة ✓ فروع ميزات صغيرة ومركزة ✓ عمليات دمج منتظمة لتجنب التعارضات ✓ احذف الفروع بعد الانتهاء ✓ استخدم الإصدار الدلالي للعلامات ✓ وثق ملاحظات الإصدار ✓ اختبر بدقة على فرع الإصدار ✓ لا تلتزم مباشرة بـ main أو develop أبداً

ورقة غش أوامر Git Flow

التهيئة: git flow init [-d] الميزات: git flow feature start <name> git flow feature finish <name> git flow feature publish <name> git flow feature pull origin <name> الإصدارات: git flow release start <version> git flow release finish <version> git flow release publish <version> الإصلاحات العاجلة: git flow hotfix start <version> git flow hotfix finish <version> أخرى: git flow feature list git flow release list git flow hotfix list

التكامل مع طلبات السحب

اجمع Git Flow مع طلبات السحب في GitHub:

# بدلاً من إنهاء الميزة محلياً: git flow feature start my-feature # العمل على الميزة... git push -u origin feature/my-feature # إنشاء طلب سحب على GitHub: # - القاعدة: develop # - المقارنة: feature/my-feature # بعد الموافقة على PR ودمجها: git checkout develop git pull git branch -d feature/my-feature # التنظيف المحلي

تمرين عملي:

المهمة: ممارسة سير عمل Git Flow

  1. تهيئة مستودع Git جديد
  2. إعداد Git Flow: git flow init -d
  3. إنشاء ميزة: git flow feature start add-navbar
  4. إجراء تغييرات والالتزام بها
  5. إنهاء الميزة: git flow feature finish add-navbar
  6. بدء إصدار: git flow release start 1.0.0
  7. تحديث ملف الإصدار والالتزام
  8. إنهاء الإصدار: git flow release finish 1.0.0
  9. إنشاء إصلاح عاجل: git flow hotfix start 1.0.1
  10. إصلاح خطأ وإنهاء: git flow hotfix finish 1.0.1
  11. عرض هيكل الفرع الخاص بك: git log --all --graph --oneline

النتيجة المتوقعة: ستفهم دورة حياة Git Flow الكاملة من تطوير الميزات إلى إصدارات الإنتاج والإصلاحات العاجلة.

المزالق الشائعة

المشكلة: نسيان دمج الإصلاح العاجل إلى develop الحل: Git Flow يفعل هذا تلقائياً؛ عمليات الدمج اليدوية تحتاج إلى عناية المشكلة: فروع ميزات طويلة الأمد الحل: احتفظ بالميزات صغيرة؛ ادمج بشكل متكرر إلى develop المشكلة: تعارضات عند إنهاء الإصدار الحل: ادمج develop في فرع الإصدار قبل الانتهاء المشكلة: الالتزام مباشرة بـ main الحل: استخدم قواعد حماية الفرع على GitHub المشكلة: عدد كبير جداً من الفروع الحل: أنهِ واحذف الفروع بسرعة

Git Flow مقابل سير العمل الأخرى

Git Flow: + منظم ومنظم + إدارة إصدار واضحة - معقد للمبتدئين - عبء للنشر المستمر GitHub Flow: + بسيط ومباشر + رائع للنشر المستمر - هيكل أقل للإصدارات - غير مثالي لإصدارات متعددة التطوير المبني على الجذع: + تكرارات سريعة جداً + الحد الأدنى من التفريع - يتطلب انضباطاً - علامات الميزات مطلوبة

الملخص

في هذا الدرس، تعلمت:

  • Git Flow هو نموذج تفريع مع بنية محددة
  • فرعان رئيسيان: main (الإنتاج) و develop (التكامل)
  • ثلاثة فروع داعمة: الميزة والإصدار والإصلاح العاجل
  • فروع الميزات للتطوير الجديد
  • فروع الإصدار لإعداد إصدارات الإنتاج
  • فروع الإصلاح العاجل لإصلاحات الإنتاج الحرجة
  • امتداد Git Flow يبسط أوامر سير العمل
  • يعمل بشكل جيد مع الإصدار الدلالي
  • الأفضل للإصدارات المجدولة والبرمجيات التقليدية
  • يمكن الجمع مع طلبات السحب لمراجعة الكود
التالي: في الدرس التالي، سنستكشف GitHub Flow، وهو سير عمل أبسط مصمم للنشر المستمر!