| # | القسم |
|---|---|
| 1 | لماذا الفروع؟ |
| 2 | أنواع الفروع |
| 3 | Git Flow |
| 4 | GitHub Flow |
| 5 | Trunk-Based Development |
| 6 | المقارنة واختيار الاستراتيجية |
| 7 | اختبار — استراتيجيات التفريع |
| 8 | تطبيق عملي — تطبيق GitHub Flow |
| 9 | الخلاصة |
الفرع خط تطوير مستقل. يسمح بالعمل على ميزة جديدة أو تصحيح دون المساس بالشفرة المستقرة التي يستخدمها الآخرون.
فكّر في الفرع كمسودة منفصلة. يمكنك أن تجرّب فيه ما تشاء؛ ما دام لم تدمج، فعمل الآخرين لا يتأثر.
بلا فروع، يكتب الفريق كله في الملف نفسه في الوقت نفسه: فوضى مضمونة. مع الفروع، يتقدم كل شخص في ممره، ثم نجمع بنظافة.
الأوامر الأساسية التي رأيناها في الوحدة 01:
# إنشاء فرع والانتقال إليه
git switch -c feature/login
# سرد الفروع
git branch
# العودة إلى main
git switch main| الإجراء | الأمر الحديث | الصيغة القديمة |
|---|---|---|
| إنشاء + انتقال | git switch -c nom | git checkout -b nom |
| انتقال | git switch nom | git checkout nom |
| سرد | git branch | git branch |
| حذف | git branch -d nom | git branch -d nom |
تمرين مصغّر — اكتب الأمر الحديث لإنشاء فرع feature/login والانتقال إليه دفعة واحدة.
git switch -c feature/login (يكافئ الصيغة القديمة git checkout -b feature/login).
في الفريق لا تُنشأ الفروع عشوائياً: نعطيها دوراً واسماً عرفياً. هذه أكثر الأنواع انتشاراً.
| نوع الفرع | البادئة المعتادة | الدور | مدة الحياة |
|---|---|---|---|
| رئيسي | main (أو master) | شفرة الإنتاج، مستقرة دائماً | دائمة |
| تكامل | develop | يجمع الميزات الجارية | دائمة |
| ميزة | feature/ | تطوير ميزة جديدة | قصيرة |
| إصدار | release/ | التثبيت قبل وضع الإنتاج | قصيرة |
| تصحيح عاجل | hotfix/ | تصحيح خطأ حرج في الإنتاج | قصيرة جداً |
أمثلة أسماء واقعية:
feature/ajout-paiement-stripe
feature/dashboard-utilisateur
release/1.4.0
hotfix/correction-faille-loginعرف تسمية جيد توثيق مجاني: من اسم الفرع وحده يعرف الفريق الموضوع.
تمرين مصغّر — يجب أن تصحّح على وجه السرعة ثغرة دخول في الإنتاج. أي بادئة فرع تستخدم، واقترح اسماً كاملاً.
البادئة hotfix/ (تصحيح عاجل ينطلق من main). مثال: hotfix/correction-faille-login.
Git Flow استراتيجية منظَّمة قدّمها Vincent Driessen سنة 2010. تقوم على فرعين دائمين (main و develop) وثلاثة أنواع فروع مؤقتة (feature، release، hotfix).
الدورة النموذجية:
develop لإنشاء فرع feature/*.feature في develop.release/* للتثبيت.release في main (وتُوسَم) و في develop.hotfix/* من main، ثم ندمجه في main و develop.# بدء ميزة (بلا إضافة git-flow)
git switch develop
git switch -c feature/panier
# ... عمل + إيداعات ...
git switch develop
git merge feature/panier
git branch -d feature/panier| المزايا | العيوب |
|---|---|
| منظَّم جداً، أدوار واضحة | ثقيل، فروع كثيرة |
| مثالي لـ إصدارات مخطَّطة | سيئ التكيّف مع النشر المستمر |
| يفصل بوضوح التطوير والإنتاج | دمج معقّد، خطر تعارضات |
يتألق Git Flow للبرمجيات المسلَّمة بإصدارات (تطبيقات محمولة، برمجيات مثبَّتة). لموقع ويب يُنشَر 10 مرات في اليوم يصبح عائقاً.
GitHub Flow استراتيجية بسيطة وخفيفة، فكّرت لـ النشر المستمر. فرع دائم واحد: main. الباقي يمر بفروع feature قصيرة وطلبات سحب.
القواعد الذهبية:
main قابل للنشر دائماً.main.main.main فوراً.git switch main
git pull
git switch -c feature/filtre-recherche
# ... إيداعات ...
git push -u origin feature/filtre-recherche
# → فتح طلب سحب على GitHub| المزايا | العيوب |
|---|---|
| بسيط، فروع قليلة | يفترض تغطية اختبارات جيدة |
| مثالي للويب / SaaS | أقل ملاءمة لإصدارات متعددة يجب إبقاؤها |
| يشجّع تسليماً صغيراً متكرراً | يطلب انضباطاً على جودة main |
GitHub Flow غالباً أفضل نقطة انطلاق لفريق حديث: هيكل كافٍ للتعاون، وخفة كافية للسرعة.
تمرين مصغّر — في GitHub Flow، اكتب الأمرين للانطلاق من main محدَّث قبل إنشاء فرع العمل.
git switch main
git pullبعد ذلك فقط: git switch -c feature/....
Trunk-Based Development (التطوير على الجذع) يدفع البساطة أبعد: الجميع يدمج عمله في فرع واحد (trunk، أي main) مراراً جداً — مثاليًا عدة مرات في اليوم.
المبادئ الأساسية:
# دورة قصيرة جداً
git switch main
git pull
# تعديل صغير...
git commit -am "إضافة زر التصدير"
git push # مدمج في الجذع بعد دقائق| المزايا | العيوب |
|---|---|
| تكامل مستمر حقيقي | يتطلّب CI صلباً وسريعاً |
| يتجنّب «دمج الجحيم» | يطلب كثيراً من الانضباط |
| ممارسة الفرق عالية الأداء (Google وغيرها) | أعلام ميزات يجب إدارتها |
أسوأ عدو لفرق Git الفروع التي تعيش أسابيع. كلما تأخر الدمج، صار ألماً. يحلّ trunk-based ذلك بالدمج المبكر والمتكرر.
تمرين مصغّر — في Trunk-Based، كيف تدمج ميزة غير منتهية دون إعاقة الآخرين ودون إنشاء فرع طويل؟
نخفي الشفرة غير المكتملة خلف feature flag (علم ميزة): تُدمَج في الجذع لكنها معطَّلة للمستخدمين.
لا توجد استراتيجية كونية: الاختيار الجيد يعتمد على نوع المنتج ونضج الفريق ووتيرة النشر.
| المعيار | Git Flow | GitHub Flow | Trunk-Based |
|---|---|---|---|
| فروع دائمة | 2 (main + develop) | 1 (main) | 1 (main) |
| التعقيد | مرتفع | منخفض | منخفض جداً |
| وتيرة التسليم | بإصدارات | مستمرة | مستمرة جداً |
| مدة الفروع | طويلة | قصيرة | قصيرة جداً (< يوم) |
| اختبارات آلية مطلوبة | مرغوبة | مهمة | لا غنى عنها |
| الحالة المثالية | تطبيقات بإصدارات، محمول | ويب / SaaS، فريق متوسط | فريق ناضج، CI قوي |
نصيحة: معظم الفرق ينبغي أن تبدأ بـ GitHub Flow. يقدّم أفضل تسوية بين البساطة والأمان. ننتقل إلى trunk-based عندما ينضج CI، أو إلى Git Flow فقط إذا فرض المنتج إصدارات.
السؤال 1: لماذا يُستخدم فرع Git أساساً؟
a) لنسخ المستودع احتياطياً على السحابة
b) للعمل بمعزل دون التأثير على الشفرة المستقرة
c) لضغط الملفات
d) لحذف السجل
الإجابة: b) — الفرع خط تطوير مستقل يعزل العمل حتى الدمج.
السؤال 2: كم فرعاً دائماً يستخدم Git Flow؟
a) واحد (main)
b) اثنان (main و develop)
c) لا شيء
d) واحد لكل مطوّر
الإجابة: b) — يقوم Git Flow على فرعين دائمين: main (إنتاج) و develop (تكامل).
السؤال 3: أي استراتيجية أنسب لموقع ويب يُنشَر عدة مرات في اليوم؟
a) Git Flow
b) GitHub Flow أو Trunk-Based
c) بلا فروع أصلاً
d) فرع لكل سنة
الإجابة: b) — GitHub Flow (وأكثر منه Trunk-Based) مصمَّمان للنشر المستمر. Git Flow سيكون ثقيلاً جداً.
السؤال 4: في Trunk-Based Development، كيف نخفي ميزة غير منتهية؟
a) في فرع طويل لعدة أسابيع
b) بـ feature flag (علم ميزة)
c) بحذف الشفرة كل مساء
d) لا يمكن، يجب إنهاء الكل دفعة واحدة
الإجابة: b) — تسمح أعلام الميزات بدمج شفرة غير مكتملة دون تفعيلها للمستخدمين، فنتجنّب الفروع الطويلة.
السؤال 5: أي بادئة فرع تُستخدم لتصحيح خطأ حرج مباشرة في الإنتاج؟
a) feature/
b) release/
c) hotfix/
d) develop/
الإجابة: c) — فرع hotfix/ ينطلق من main لتصحيح خطأ عاجل، ثم يُدمَج في main و develop.
تعمل على مستودع main فيه مستقر. طُلب منك إضافة صفحة «حول». طبّق GitHub Flow:
main محدَّث.apropos.html.# 1. الانطلاق من main محدَّث
git switch main
git pull origin main
# 2. إنشاء فرع وصفي
git switch -c feature/page-apropos
# 3. إنشاء الملف ثم إيداعه
echo "<h1>حول</h1>" > apropos.html
git add apropos.html
git commit -m "إضافة صفحة حول"
# 4. دفع الفرع نحو البعيد
git push -u origin feature/page-apropos
# 5. التحقق من الفروع
git branchالنتيجة المتوقعة:
| الخطوة | التحقق |
|---|---|
| الفرع أُنشئ | git branch يعرض * feature/page-apropos |
| الإيداع موجود | git log --oneline -1 يظهر «إضافة صفحة حول» |
| الفرع دُفع | Git يعرض * [new branch] feature/page-apropos -> feature/page-apropos |
| التتبع معدّ | -u يربط الفرع المحلي بالفرع البعيد |
* feature/page-apropos
mainالخطوة المنطقية التالية: فتح طلب سحب على GitHub لمراجعة هذا العمل ودمجه — هذا موضوع الدرس 03 بالضبط.
main، develop، feature/، release/، hotfix/ — لكل منها دور.main + طلبات سحب، مثالي للويب.الآن وقد عرفت تنظيم فروعك، حان الدرس 02 — الدمج وإعادة الأساس: كيف تجمع هذه الفروع بنظافة وتحل التعارضات.
جميع الحقوق محفوظة. يُحظَر نسخ هذه الدورة أو نشرها أو استخدامها أو تكييفها، كلياً أو جزئياً، دون إذن كتابي مسبق من الدكتور هيثم رحومة.
دورة من إعداد الدكتور هيثم رحومة — تطوير ونشر حلول البيانات