ما هو Git وما هو GitHub ؟
مقدّمة
يقوم المبرمج عادة بحفظ نسخة من البرنامج كلّما حقق تقدُّماً في عملية تطوير النظام (كتابة الكود البرمجي)؛ وذلك ليتمكّن من العودة إلى تلك النسخ (versions) مستقبلاً إذا أراد التراجع عن تعديلاته وإضافاته التي أجراها على الكود الأصلي، ولذلك ترى حجم مجلد المشروع يصبح كبيراً جداً؛ إذ يحتوي على الكثير من النسخ للمشروع ذاته، ولنا أن نتخيّل ما سيكون عليه الحال لو كان حجم المشروع- في الأصل- كبيراً جداً! لنفترض مثلاً أن حجم ملفات المشروع في بدايته بلغ (200) ميجابايت، وكلما مرّ يوم أو اثنان قام المبرمج بحفظ نسخة كاملة من المشروع للعودة إليها كنقطة أمان (safe point)، وبالتالي من المتوقّع أن يحجز هذا المشروع وحده أكثر من (3) جيجابايت من مساحة القرص الصلب! وبالتأكيد هذه الطريقة في العمل مرفوضة؛ فكيف سنحلّ هذه المشكلة؟ أيضاً، هذه المشكلة تخصّ مبرمجاً واحداً فقط، فماذا لو تحدّثنا عن مشروع يعمل عليه فريق كبير من المبرمجين؟
نظام التحكم بالإصدارات Version Control System (اختصاراً VCS)
هنا يأتي دور نظام التحكم بالإصدارات (VCS) فالنسخ التي تقوم بحفظها كل فترة تسمى إصدارات (versions) وأحد أشهر هذه الأنظمة نظام (Git). مهمّة نظام الإصدارات الأساسية أن يوفّر عليك عبء الاحتفاظ بالكثير من النُسخ من البرنامج نفسه، فلا يكون عندك في الجهاز إلا نسخة واحدة من المشروع، إذ يمكن للمبرمج أن يخبر نظام التحكم (VCS) بأن يسجّل حالة المشروع الآن كنسخة جديدة من البرنامج (add + commit). وعندما يريد المبرمج الرجوع إلى نقطة تحقق قديمة فإنه يطلب من النظام عمل مراجعة (checkout) لنسخة سابقة ويتم له الأمر كما أراد. وكذلك عندما يريد المبرمج بالعمل المركز على أحد مكونات أو ملفات المشروع فإنه يطلب من البرنامج فتح فرع (branch) جديد يقوم بالعمل عليه وعندما ينتهي من عمله يقوم بعمل دمج (merge) بين الفرع والأصل، كلّ هذا يتم بدون نسخ ملفات المشروع وزيادة حجمه على القرص الصلب. وهذا ممتاز بالنسبة لمبرمج واحد يعمل على المشروع. ولكن ماذا لو كان لدينا فريق من المبرمجين يعملون على المشروع ذاته وكلّ منهم مهتم بتطوير جزء من المشروع الكبير؟ وماذا لو كان أعضاء الفريق موجودين في أماكن بعيدة فيزيائيّاً؟
منصّة استضافة المشاريع البرمجية والعمل المشترك (GitHub)
هنا يأتي دور منصّة (GitHub)، تقدّم هذه المنصّة خدمة استضافة المشاريع البرمجية وتسمح للمبرمج وفريقه بالعمل على المشروع نفسه من أجهزة مختلفة دون حدوث تصادمات. يتم إنشاء مجلّد (مستودع أو Repository) خاص بالمشروع، وتسمى أول نسخة توضع في هذا المستودع بالـ(master). ومنها يتم اشتقاق الأفرع (branches) المختلفة. فهذا المبرمج يقوم بتحسين الكود الخاص بأحد مكونات النظام، وذاك يقوم بإضافة ميزة جديدة للمشروع،
وآخر يقوم بإصلاح خطأ ظهر- حديثاً- ولم ينتبه إليه الفريق مسبقاً، وهكذا.. كل منهم يعمل على فرع خاص به، وعندما ينتهي المبرمج من العمل على فرعه، فإنه يقوم بعمل طلب دمج تعديلاته في النسخة الأم من خلال (pull request). وعند موافقة أعضاء الفريق يتم عمل (merge) بين النسخة الجديدة والنسخة الأم، وتتوزّع النسخة الأم الجديدة على المطورين كلهم. وعند انتهاء الفريق من العمل على المشروع يقومون بنشره بين المستخدمين، ويمكن للمستخدمين التواصل مع الفريق البرمجي وإخبارهم عن أخطاء ظهرت أثناء الاستخدام أو يطلبون منهم إضافة ميزات جديدة إلى المنتج البرمجي، فيقوم المبرمج المسؤول بفتح فرع جديد من المشروع وتطويره ليلبّي احتياجات المستخدمين بدون تعطيل استخدام النسخة العاملة عند باقي المستخدمين.
خاتمة
تجاوز عدد مستخدمي (GitHub) ال3 مليون مستخدم، وبلغ عدد المشاريع على هذه المنصة حوالي (7) مليون مشروع. وتمّ إنجاز الكثير من المشاريع المعروفة والعالمية على منصّة (GitHub) والتي يعرفها المبرمجون تماماً، مثل: (Bootstrap) ,(Node.js) ,(JQuery) ,(Django) ,(scikit-learn)، ونماذج (TensorFlow) التي تمّ تطويرُها من قبل جوجل (Google) للعمل على مشاريع تعلّم الآلة والتعلّم العميق (Deep learning)، كل الأكواد البرمجيَّة متوفرة على (GitHub) ويمكن للجميع الاطلاع عليها. كما تجدر الإشارة إلى أنه يمكن لأي مستخدم إنشاء مشروع مجاني على (GitHub) ولكنه مشروع عام (public) يمكن لأي شخص الاطلاع عليه بدون أخذ إذن صاحب المشروع، أما إذا أردت العمل مع فريق المطورين بسرية فيمكن فتح مشروع خاص (private) وسري مقابل مبلغ معين من المال لقاء الاستضافة التي يقدّمها الموقع.