الفرع الرئيسي Main (المعروف سابقاً بـ Master) هو الفرع الرئيسي في Git الذي يحتوي على كود الإنتاج المستقر الجاهز للنشر. كل commit في main يقابل إصداراً من المشروع، والفرع نفسه محمي ضد التغييرات المباشرة ويعمل كمصدر واحد للحقيقة للفريق بأكمله. وفقاً لـ GitHub، 2020، منذ أكتوبر 2020، يُسمى الفرع الجديد افتراضياً main بدلاً من master.
أهم النقاط
الفرع الرئيسي Main (أو Master — حسب إعدادات المستودع) هو الفرع الافتراضي الذي يتم إنشاؤه عند تهيئة أي مستودع Git. إنه الفرع الرئيسي للمشروع ويحتوي على كود جاهز للنشر في الإنتاج.
على عكس develop، حيث يزدهر العمل اليومي بالميزات الجديدة، فإن main هو واجهة المشروع. كل إصدار من الكود في main مر بدورة كاملة: التطوير في فرع feature، التكامل في develop، التحضير للإصدار في فرع release، والاختبار النهائي. فقط بعد ذلك تصل التغييرات إلى main.
المبدأ الأساسي: يجب أن يكون main مستقراً دائماً. إذا تم اكتشاف خطأ في main، فهذا يعني الحاجة إلى hotfix عاجل خارج الدور. لذلك، في المشاريع الاحترافية، يكون main محمياً ضد التغييرات العرضية بواسطة قواعد حماية الفرع.
وفقاً لـ Git Book، main ليس فرعاً خاصاً بخصائص فريدة، بل هو مرجع عادي لـ commit يُعتبر رئيسياً بالاتفاق. Git لا يميز بين main وأي فرع آخر على مستوى النظام.
تاريخياً، كان الفرع الافتراضي في Git يُسمى master. في يونيو 2020، لفتت حركة Black Lives Matter الانتباه إلى مصطلحي master و slave في صناعة تكنولوجيا المعلومات. أعلنت GitHub عن الانتقال إلى مصطلح main للفرع الافتراضي.
منذ أكتوبر 2020، جميع المستودعات الجديدة على GitHub تُنشأ بالفرع main. GitLab و Bitbucket أيضاً طبقا دعم main كاسم افتراضي. Git 2.28 (يوليو 2020) أضاف الخيار init.defaultBranch لتكوين اسم الفرع الافتراضي.
تقنياً، إعادة تسمية فرع موجود من master إلى main هي عملية بسيطة. التحدي الرئيسي هو تحديث جميع المراجع في تكوينات CI/CD والوثائق والمستودعات المحلية للمطورين.
لإعادة تسمية فرع في مستودع موجود، نفذ:
# إعادة تسمية master محلياً إلى main
git branch -m master main
# تحديث المستودع البعيد
git push -u origin main
# حذف master القديم على الخادم
git push origin --delete master
# تحديث HEAD على الخادم
# (عبر واجهة GitHub: Settings ← Branches ← Default branch)
Git Flow و GitHub Flow يحددان دور الفرع main بشكل مختلف. اختيار النموذج يعتمد على حجم الفريق، وتكرار الإصدارات، ومتطلبات استقرار الكود.
| الخاصية | Git Flow | GitHub Flow |
|---|---|---|
| دور main | فقط إصدارات | الفرع المركزي للتطوير |
| الفروع الإضافية | Develop, Release, Hotfix | فقط فروع feature |
| تكرار الإصدارات | كل 1–4 أسابيع | عدة مرات يومياً |
| التعقيد | عالي | منخفض |
| متى تختار | تطبيقات محمولة بدورات إصدار | خدمات ويب بنشر مستمر |
لتطوير التطبيقات المحمولة، Git Flow هو المعيار، حيث أن نشر تطبيق في App Store و Google Play له دورات إصدار ثابتة. GitHub Flow أكثر ملاءمة لمشاريع الويب التي يمكن نشرها عدة مرات يومياً.
في GitHub Flow، لا يوجد فرع develop. جميع فروع feature تُنشأ مباشرة من main، وبعد الانتهاء تُدمج مرة أخرى عبر Pull Request. كل دمج في main يُشغل تلقائياً النشر إلى الإنتاج. هذا النموذج يتطلب مستوى عالياً من أتمتة الاختبارات وانضباط الفريق.
في GitHub Flow، لا يوجد فرع develop. جميع فروع feature تُنشأ مباشرة من main، وبعد الانتهاء تُدمج مرة أخرى عبر Pull Request. كل دمج في main يُشغل تلقائياً النشر إلى الإنتاج. هذا النموذج يتطلب مستوى عالياً من أتمتة الاختبارات وانضباط الفريق.
حماية الفرع لـ main هي إعداد إلزامي في أي مشروع تجاري. بدونها، قد يؤدي دفع عرضي إلى إرسال كود غير مكتمل إلى الإنتاج أو كسر تطبيق يعمل لجميع المستخدمين.
تكوين جميع القواعد الست هو المعيار للمشاريع المحمولة التي تضم 10,000+ مستخدم. للمشاريع الصغيرة، القواعد الثلاث الأولى كافية.
مستوى حماية main يعتمد على حجم المشروع. يمكن لشركة ناشئة الاكتفاء بالحد الأدنى من الحماية، بينما يتطلب تطبيق المؤسسات أقصى القيود.
الوسم هو ممارسة إنشاء مراجع مسماة لـ commits محددة في main. كل علامة تقابل إصداراً من التطبيق تم نشره في الإنتاج. هذا يسمح بالتبديل السريع إلى أي إصدار سابق للتصحيح أو الإصلاح.
معيار تسمية العلامات في تطوير التطبيقات المحمولة هو SemVer (الإصدار الدلالي): v1.2.3، حيث الرقم الأول هو الإصدار الرئيسي (تغييرات جذرية)، والثاني هو الإصدار الثانوي (ميزات جديدة)، والثالث هو التصحيح (إصلاحات).
يتم إنشاء العلامة بعد دمج فرع release في main. ثم يتم بناء هذا commit في CI/CD، وتوقيعه، وإرساله إلى متجر التطبيقات. إذا تم اكتشاف خطأ في العلامة، يتم إنشاء فرع hotfix من تلك العلامة.
# إنشاء علامة إصدار مشروحة
git tag -a v2.4.1 -m "Release version 2.4.1"
# إرسال العلامة إلى الخادم
git push origin v2.4.1
# عرض جميع العلامات في المستودع
git tag -l "v2.*"
# إنشاء فرع hotfix من علامة محددة
git checkout -b hotfix/crash-fix v2.4.1
فهم تسلسل الفروع في Git Flow هو الأساس لتنظيم التطوير التعاوني بشكل صحيح. كل نوع فرع له مصدره وغرضه وقواعد الدمج الخاصة به.
قاعدة مهمة: feature لا يُدمج أبداً مباشرة في main. feature → develop → release → main هي سلسلة الدمج الصحيحة. انتهاك هذه القاعدة يبطل الغرض من نموذج Git Flow بأكمله.
لنفترض سيناريو: أكمل الفريق تحضير الإصدار v2.5.0. فرع release تمت مراجعته وجاهز للدمج في main. بعد الدمج، يتم إنشاء علامة ونشر الإصدار.
# التبديل إلى main والتحديث
git checkout main
git pull origin main
# دمج فرع release المُتحقق منه
git merge --no-ff release/2.5.0
# إنشاء علامة إصدار
git tag -a v2.5.0 -m "Release 2.5.0 - Payment integration"
# إرسال main والعلامة إلى الخادم
git push origin main --tags
العلم --no-ff (بدون تقدم سريع) يضمن إنشاء commit دمج، حتى لو كان يمكن إجراء الدمج ببساطة بتحريك المؤشر. هذا يحتفظ بمعلومة أن التغييرات جاءت من فرع release، مما يسهل تحليل التاريخ.
إذا تم اكتشاف خطأ حرج في الإنتاج، تختلف العملية عن الإصدار العادي. يتم إنشاء hotfix من main، وبعد الإصلاح، يُدمج في كل من main و develop.
إذا تم اكتشاف خطأ حرج في الإنتاج، تختلف العملية عن الإصدار العادي. يتم إنشاء hotfix من main، وبعد الإصلاح، يُدمج في كل من main و develop.
# إنشاء فرع hotfix من main
git checkout main
git checkout -b hotfix/2.5.1-crash-fix
# الإصلاح والcommit
git add src/fix/
git commit -m "Fix crash on login screen"
# دمج hotfix مرة أخرى إلى main
git checkout main
git merge --no-ff hotfix/2.5.1-crash-fix
git tag -a v2.5.1 -m "Hotfix 2.5.1"
git push origin main --tags
# دمج hotfix أيضاً في develop
git checkout develop
git merge --no-ff hotfix/2.5.1-crash-fix
git push origin develop
# حذف فرع hotfix
git branch -d hotfix/2.5.1-crash-fix
الأسئلة الشائعة
تقنياً — نعم، إنه مرجع عادي لـ commit. لكن عملياً — لا، لأن main هو الفرع الافتراضي، ومعظم المنصات لا تسمح بحذف الفرع المضبوط كفرع افتراضي. بدلاً من الحذف، أنشئ فرعاً افتراضياً جديداً ثم احذف القديم.
إذا لم يكن الخطأ حرجاً، استخدم العملية العادية: أنشئ فرع feature من develop، أصلح الخطأ، أجرِ مراجعة الكود، وانتظر دورة الإصدار التالية. يُستخدم hotfix فقط للأخطاء الحرجة التي تمنع عمل المستخدمين.
main هو فرع محلي على جهاز الكمبيوتر الخاص بك. origin/main هو مخبأ محلي لحالة الفرع البعيد على الخادم. الأمر git fetch يحدث origin/main، بينما git pull يدمج التغييرات فوراً في main المحلي الخاص بك.
استخدم git clone لنسخ المستودع بالكامل إلى دليل جديد. إذا كنت بحاجة إلى تغيير URL البعيد، نفذ git remote set-url origin. لتغيير دليل العمل دون نسخ المستودع، استخدم git worktree add.
نعم، حتى في فريق من شخصين، حماية main مبررة. دفع عرضي بأمر غير صحيح قد يعيد كتابة التاريخ. الحد الأدنى من الحماية — منع الدفع المباشر وطلب PR — يستغرق 5 دقائق للإعداد ويمنع ساعات من استعادة البيانات.
الملخص
سنقوم بتطوير تطبيق جوال جاهز
تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.
اقرأ أيضًا