مقارنة استراتيجيات التفريع
مقارنة استراتيجيات التفريع
يُعدّ اختيار استراتيجية التفريع من أعلى القرارات تأثيرًا على الفريق الهندسي. اختر الاستراتيجية الصحيحة وستصبح الإصدارات روتينًا اعتياديًا. اختر الخاطئة وستمضي فترات بعد الظهر في حلّ تعارضات الدمج، والأمسيات في تعقّب الانحدارات، وعطل نهاية الأسبوع في إطفاء حرائق الإصدارات المعطوبة. يرسم هذا الدرس الاستراتيجيات الثلاث السائدة — Git Flow وGitHub Flow والتطوير المُبنى على الجذع (Trunk-Based Development) — ويشرح المقايضات الهندسية لكل منها، مع توضيح ما تستخدمه الشركات الكبرى فعليًا في الإنتاج.
Git Flow: التطوير المتوازي المنظّم
قدّم Vincent Driessen نموذج Git Flow عام 2010، وهو يُحدّد مجموعة صارمة من الفروع الدائمة والمؤقتة. صُمّم في الأصل للبرمجيات التي تمتلك دورات إصدار واضحة — كمكتبات ذات إصدارات رقمية، أو تطبيقات الهاتف المحمول التي تُشحن عبر متاجر التطبيقات، أو برمجيات المؤسسات ذات الإصدارات الفصلية.
الفروع الدائمة: main (أو master) يعكس دائمًا بيئة الإنتاج. develop يجمع المميزات المكتملة قبل الإصدار.
الفروع المساندة (مؤقتة):
feature/*— يتفرع منdevelopويندمج فيه.release/*— يتفرع منdevelopعند اكتمال المميزات للإصدار؛ لا يقبل إلا إصلاحات الأخطاء؛ يندمج فيmain(مع وسم) وdevelopمعًا.hotfix/*— يتفرع مباشرةً منmain؛ يندمج فيmainوdevelopمعًا.
develop وrelease. حين يُدمج release/2.4.0 أخيرًا، يكون develop قد تقدّم كثيرًا — والدمج العكسي إلى develop مؤلم بشكل موثّق. الفرق التي تبنّت Git Flow عام 2012 ولم تُراجعه منذ ذلك تقضي 20-30% من وقتها الهندسي في إدارة التعارضات. حتى Driessen نفسه أضاف ملاحظة في منشوره الأصلي يوصي فيها بالتطوير على الجذع للفرق التي تُطبّق التسليم المستمر.
GitHub Flow: البساطة للتسليم المستمر
يُختزل GitHub Flow في قاعدة واحدة: main قابل للنشر دائمًا. كل تغيير — ميزة أو إصلاح أو إعادة هيكلة — يعيش في فرع قصير الأمد يُفتح كطلب سحب (Pull Request)، يُراجع، ثم يندمج مباشرةً في main. يُنشر التطبيق فور الدمج أو خلاله عبر CI/CD.
يعمل GitHub Flow بكفاءة عالية لمنتجات SaaS التي تشحن عدة مرات في اليوم. طلب السحب هو وحدة العمل: يحمل الفرق والنقاش ونتائج CI وبوابة النشر في مكان واحد.
v2 وv3 في وقت واحد (شائع مع APIs أو SDKs الهاتفية)، فستكون بمفردك. غالبًا ما ترتجل الفرق فروع release/v2 دائمة، فتخترع فعليًا جزءًا من Git Flow فوق GitHub Flow.
التطوير على الجذع: ما تستخدمه الفرق عالية السرعة فعلًا
التطوير على الجذع هو الاستراتيجية خلف مستودع Google الموحّد (مليار سطر من الكود، فرع واحد)، وأدوات Meta الداخلية، وغالبية المنظمات الرائدة في التسليم المستمر. القاعدة أبسط من GitHub Flow: يُودع الجميع مباشرةً في main (الجذع) مرة واحدة على الأقل يوميًا. الفروع القصيرة، إن وُجدت، تعيش أقل من 24 ساعة.
يبدو التطوير على الجذع فوضويًا لمن اعتاد الفروع الطويلة، لكنه يعمل بفضل ثلاث ممارسات مكمّلة:
- أعلام المميزات (Feature Flags) — العمل غير المكتمل يُشحن خلف علَم مغلق في الإنتاج. سيتعمق الدرس التالي في هذا الموضوع.
- الاختبار الآلي الشامل — خط CI يمسك بالانحدارات قبل وصولها إلى
main؛ البنية المعطوبة أزمة أولوية قصوى. - البرمجة الثنائية/الجماعية أو دورات مراجعة في نفس اليوم — يُراجع الكود في الوقت الفعلي أو خلال 1-2 ساعة، لا أيام.
ما تستخدمه الشركات الكبرى فعليًا
الإجابة التجريبية: انتقلت الصناعة بشكل واسع نحو التطوير على الجذع، مع GitHub Flow كحل وسط عملي للفرق الأصغر. نشرت Google وMeta وMicrosoft (الأدوات الداخلية) وLinkedIn وEtsy منشورات هندسية تؤكد اعتمادها للتطوير على الجذع على نطاق واسع. تجد تقارير DORA (أبحاث وتقييم DevOps) باستمرار أن التطوير على الجذع مؤشر إحصائي دال على أداء تسليم البرمجيات المتميز — أوقات تسليم أقصر، وتكرار نشر أعلى، ومعدل فشل تغييرات أدنى.
المُمكِّن الحقيقي ليس الشجاعة — بل البنية التحتية الهندسية: خط CI سريع وشامل (أكثر خطوط Google أقل من 10 دقائق)، ومنصة أعلام مميزات ناضجة (LaunchDarkly أو Unleash أو Flipt أو محلية الصنع)، وثقافة تجعل البنية المعطوبة أولوية فورية لا موضوعًا للوقوف اليومي.
اختيار الاستراتيجية المناسبة لفريقك
طبّق هذه المعايير بالترتيب:
- هل تصون إصدارات متعددة منشورة في وقت واحد؟ إن كانت الإجابة نعم، فـ Git Flow (أو نسخة مبسّطة منه مع فروع
release/*دائمة فوق GitHub Flow) ضرورة على الأرجح. - هل يمكنك النشر إلى الإنتاج بعد كل دمج؟ إن كانت نعم، ابدأ بـ GitHub Flow. انتقل إلى التطوير على الجذع حين تكون مجموعة الاختبارات شاملة ودورات المراجعة محكمة.
- هل خط CI الخاص بك أقل من 15 دقيقة من البداية للنهاية؟ التطوير على الجذع يعمل فقط إذا كانت حلقة التغذية الراجعة سريعة بما يكفي لعدم تجميع المطورين للعمل.
- هل لديك أعلام مميزات؟ التطوير على الجذع بدون أعلام يعني شحن مميزات غير مكتملة للمستخدمين. إن لم تتمكن من نشر الأعلام، ابقَ على GitHub Flow حتى تستطيع.
develop في main، وإلزام المراجعة قبل الدمج). وحده هذا يُقلص ألم الدمج بنسبة 70-80%. ثم، حين يصبح CI متينًا والأعلام جاهزة، قصّر عمر الفروع نحو الصفر — هذا هو التطوير على الجذع. القفز مباشرةً من Git Flow إلى التطوير على الجذع يفشل غالبًا لأن البنية التحتية الأساسية لم تكن جاهزة بعد.
فروع الإصدار: الجزء الوحيد من Git Flow الجدير بالإبقاء
حتى الفرق التي تتبع GitHub Flow أو التطوير على الجذع تحتاج أحيانًا إلى فروع إصدار — عند إطلاق تطبيق هاتفي أو حزمة npm أو ملف ثنائي مُجمَّع حيث لا يمكن نشر إصلاح دون تقديم جديد للمتجر أو إبطال CDN. في هذه الحالة، فرع release/vX.Y مقطوع من main عند إيداع الإصدار، يُستخدم حصريًا لإصلاحات حرجة منقولة بـ cherry-pick، هو الأداة الصحيحة. ادمج كل إصلاح فورًا في main باستخدام git cherry-pick (تناولناه في الدرس 3).
قاعدة الانضباط: لا شيء يصل إلى فرع الإصدار لم يصل أولًا إلى main. فروع الإصدار آلية تسليم لا بيئة تطوير.
أنماط الفشل الشائعة
- "GitHub Flow لكن الفروع تعيش أسبوعين" — هذا ليس GitHub Flow، بل Git Flow بطيء بلا هيكل. الفروع الطويلة تُفشل النموذج بأكمله. طبّق حدًا لعمر الفرع في CI (مثل: رفض PRs مفتوحة أكثر من 3 أيام على قاعدة قديمة).
- تخطي الدمج العكسي في Git Flow — نسيان دمج
release/*عكسيًا فيdevelopيعني غياب إصلاحات شحنتها للتو في الإصدار التالي. أدوات Git Flow تؤتمت هذا، لكن سير عمل Git Flow اليدوي يتخطاه دائمًا. - التطوير على الجذع بلا اختبارات — الإيداع اليومي على الجذع بلا اختبارات شاملة وسريعة يعني فقط "نحرر جميعًا على نفس الفرع ونأمل الأفضل". الاختبارات شرط مسبق صارم.
- أعلام المميزات المتروكة إلى الأبد — تتراكم الأعلام كديون تقنية. في Netflix وGoogle، تُحدَّد تواريخ إزالة مجدولة للأعلام لحظة إنشائها. الأعلام القديمة تُسبب حوادث (علَم تُرك مفعّلًا كان ينبغي إزالته أسقط الإنتاج في شركات عديدة).