عالم تطوير البرمجيات، عالم عجيب فسطر واحد يضيفه المبرمج قد يعث في البرنامج فسادًا، ولا سيما إن كان المشروع كبيرًا، لكن في هذا العالم حارس مجهول الهوية، يعمل في صمت بلا كلل أو ملل، يصون المشروع من إفساد المفسد وتخريب المخرب، منظمًا ومؤرخًا كل صغيرة وكبيرة تُستَحدَث في المشروع، وذا الحارس اسمه نظام إدارة النُّسَخ!
تتجلى الحاجة لنظام إدارة النُّسَخ عند العمل مع فريق، وعند عملك على مشروع يزداد تعقيده، فأنت بلا ريب محتاج له مُريد، بل إنها لن تفارقك في مسيرتك في عالم البرمجة.
مقتطف من حياة مبرمج حديث العهد
هب أنك تعمل على مشروع هامٍ جدًا، وقد اقترب موعد تسليمه للعميل، وذهبت تعدل بعض التعديلات، وتغيِّر هنا وهناك دون حفظ نسخة منه، وفجأة يتعطل المشروع بسبب التغيير، فتسودُّ الدنيا في عينك، وتذهب مذعورًا تود التراجع عما فعلته، لكنك نسيت كيف كان، أضعت طريق العودة وها أنت ضائع ووقت التسليم يقترب ويقترب…
وبفضل الرحمن أصلحت المشروع وسلمته للعميل في وقته، وعاهدت نفسك أن لا تمسَّ الملف حتى تحفظ نسخة منه، فالمؤمن لا يُلدغ من جُحرٍ مرتين!
وذهبت تبرمج مشروعًا آخر، وفي كل مرة تنسخ الملف قبل تعديله، ولو أردت العمل على إصدار جديد من مشروعك ذهبت تنسخ المجلد كله، ولو كنت ذا عقلٍ فقد تضيف التاريخ والوقت إلى اسم الملف أو المجلد. تمر الليالي وتنقضي ومشروعك لا يزداد إلا نموًّا، تكثر الملفات والمجلدات، إصدار تلو آخر، ميزة تلو أخرى…
ثم تهجر المشروع ما شاء لك اللّٰه أن تهجره، لأي عارضٍ حل بك، وفي ليلة من الليالي يقودك الحنين وتعود لوصاله راغبًا غير راهب، وعند عودتك تنكَّر لك المشروع (صار غريبًا لا تعرفه)، فما هذه المجلدات والملفات المبعثرة، لقد تُهتَ في هذه المعمعة، أضعتَ سبيل الخلاص!
لعلَّك مررت بما سلف ذكره، والحمد لله فعندنا لك الحل في مقال اليوم والمقالات الآتية إن شاء اللّٰه، وهو نظام إدارة النُّسَخ، فما هو؟
ما نظام إدارة النُّسَخ؟

نظام إدارة النُّسَخ version control system، اختصارًا VCS: حارس يتعقَّب ويُدير التغييرات التي تطرأ على الرِّماز المصدري source code.
وله أسماء أخرى مثل إعداد الرِّماز المصدري source code management وإدارة المراجعات revision control وإدارة الرِّماز المصدري source control.
المعطيات data تتغير على طول مدتها، فهذه سمة ملازمة لها، ولأنها تتغير فإننا نريد تأريخ كل تغيُّر يطرأ، لأي غرض يقتضيه الحال، لهذا ظهر نظام إدارة النُّسَخ حتى يتعقب كل التغييرات المحدثة، سواء كانت في رماز مصدري source code أو مستندات أو غيرها من الوسائط المتعددة.
ونظام إدارة النُّسَخ ليس حصرًا على المبرمجين، بل قد يستعمله غيرهم من كُتَّاب ورسامين، وأنظمة إدارة النُّسَخ كثيرة متعددة بتعدد أنواع المعطيات، فبعضها لإدارة الرماز المصدري وبعضها لغرض آخر، ألم تفكر بالموسوعة الحرة Wikipedia كيف تدير التغييرات؟
بنظام إدارة النُّسَخ سهل أن ترى تغير المعطيات على مر الزمن، فتعود إلى نسخة في حقبة من الزمن، مثلًا النسخة التي كتبتها قبل عامين، أو تسترجع نسخة قديمة تعمل بعد تعطل الحالية. وليس التغيير وحده ما تستطيع تخزينه، بل من أحدث هذا، ومتى أحدثه، ولماذا أحدثه!
فلكل تغيير رسالة تشرح سببه، والشخص الذي غيره، وتاريخ حدوث التغيير. وكما ترى فهو هام جدًّا، ولا سيما عند تعاون الفريق على مشروع من المشاريع، كما أسلفت في بداية المقال.
قف للحظة يا مبعسس، أين يُخزَّن كل هذا؟
= نظام إدارة النُّسَخ لديه قاعدة معطيات database يخزن فيها كل تغير يحدث، ونسمي قاعدة المعطيات باسم المستودع repository. ففي هذا المستودع كل صغيرة وكبيرة مخزنة محفوظة، فهذا تأريخ المشروع كله.
أول نظام إدارة للنُّسَخ
أنشئ أول نظام إدارة للنُّسَخ عام ١٩٧٢ في مختبرات بِل Bel العريق، حيث نشأ نظام يُونِكس UNIX، وسمي باسم SCCS، اختصارًا لجملة Source Code Control System، ولا يعمل إلا في نظام يُونِكس، ولا يعمل إلا مع الرماز المصدري source code دون غيره.
وبعده بعشر سنوات أتى نظام إدارة للنُّسَخ اسمه RCS، اختصارًا لجملة Revision Control System، ولم يكن مثل SCCS الذي لا يعمل إلا على نظام يُونِكس، بل كان عابرًا للمنصات cross-platform، وكان يقتصر على الملفات النصية text files.
وكل واحد من أنظمة إدارة النُّسَخ المذكورة كان يعمل على نظام التشغيل، أي محليًا local، ولم تكن الغاية منه مشاركة الرماز المصدري، ولكن تلبية احتياجات مستعمل واحد.
وها قد عرفنا ما هو نظام إدارة النُّسَخ، وحان وقت معرفة أنواعه، فهو ينقسم إلى نوعين: نظام إدارة النُّسَخ المركزي، ونظام إدارة النُّسَخ الموزع. أما ما سبق بيانه فهو نظام إدارة للنُّسَخ محلي local version control system.

مركزي centralized
عرفت في الفقرة السالفة أن أنظمة إدارة النُّسَخ (SCCS وRCS) لم تكن إلا محلية، تعمل في حاسوبك فقط، لا تستطيع مشاركة الرماز المصدري، لا تستطيع التعاون مع فريقك إلا بنسخ المشروع ونقله إلى غيرك في كل مرة.
ولأجل تسهيل تعاون أعضاء الفريق في برمجة المشروع جميعًا = ظهرت الحاجة إلى نظام إدارة النُّسَخ المركزي centralized version control system، اختصارًا CVCS، وهذا الجيل الثاني من نظام إدارة النُّسَخ.
هذا النوع يكون فيه المستودع على خادوم مركزي central server واحد يحوي كل نسخ المشروع وتأريخه ، ولمن أراد المساهمة ومعاونة أصحابه فعليه الاتصال بالخادوم، ويعدلون الملفات ثم التغييرات إلى الخادوم المركزي حيث يكون المستودع.
هذا النظام يتطلب اتصال بالشبكة حتى تتصل بالخادوم المركزي، وإذا تعطل الخادوم فإن تأريخ المشروع والمشروع سيختفي إن لم تكن له نسخة احتياطية في مكان ما. وقد تُعدُّ هذه من عيوبه.
ومن الأمثلة على هذا النوع نظام إدارة للنُّسَخ اسمه CVS، اختصارًا لجملة Concurrent Version System، عام ١٩٨٦، أول نظام مركزي. وفي أواخر الثمانينات ظهر Perforce الذي استعمل في شركة جوجل.
وظهر في عام ألفين ٢٠٠٠ نظام إدارة للنُّسَخ اسمه Subversion، وما يميزه أنه كان يدعم ملفات غير نصية ويتعقب التغييرات التي تحدث فيها.
موزع distributed
نظام إدارة النُّسَخ الموزع distributed version control system، اختصارًا DVCS، يناقض النوع الأول، نظام إدارة النُّسَخ المركزي، فهو الضد منه، ويحل العيوب التي في أخيه، وهو الجيل الثالث الحديث.
في هذا النوع لدى كل مبرمج مشارك في المشروع نسخة كاملة من المشروع مع تأريخه أيضًا، فتستطيع العمل على المشروع دون اتصال، وهكذا إن تضرر الخادوم المركزي فعندك نسخة كاملة مع التأريخ الذي فيه كل تعديل أجراه كل عضوٍ.
وأشهر الأمثلة من هذا النوع كان Bazaar وMercurial وDarcs وGit، التي أتت في الحقبة ما بين ٢٠٠٣ و٢٠٠٥.
الغرض من هذه المقالة التبشير بسلسلة جديدة نتحدث فيها عن نظام إدارة للنُّسَخ موزع، إلا وهو Git، وكل ما سلف كان مقدمة حتى تفهم ما الذي سنشرع به الأيام القادمة.
حديثنا مع git حديث ذو شجون، وفي الفقرة الآتية طرف من الحديث، وبيان بكيف أتى!
نشأة Git

لينوس مبتكر نواة لينُكس، النواة الحرة مفتوحة المصدر، لما كان يبرمج النواة عام ٢٠٠٢ اعتمد على نظام إدارة للنُّسَخ موزع (صرت تفهم المعنى الآن، تهانينا!) اسمه BitKeeper، ولقد كان مملوكًا ومغلق المصدر closed-source.
حدثت بعض الأحداث بين مجتمع تطوير نواة لينُكس والشركة المالكة لنظام إدارة النُّسَخ BitKeeper عام ٢٠٠٥، وإذ ذاك صار استعمال BitKeeper مدفوعًا. فعزم لينوس وعقد عزمه على برمجة نظام إدارة للنُّسَخ موزع، يكون حرًّا ومجانيًّا، متعظًا ومستلهمًا من طول معاشرته لنظام إدارة النُّسَخ الموزع BitKeeper، فتمخض عن ذلك ولادة Git!
سنشرع في الأيام القادمة إن شاء اللّٰه بشرح نظام إدارة النُّسَخ الموزع Git، وسيكون مصدرنا هو كتاب (ProGit) لكاتبه Scott Chacon وBen Straub.
الخاتمة
ها قد وصلنا إلى نهاية المقال، وهو مقدمة لمقال لسلسلة كاملة، وها أنا أخط بقلمي الخطوط الأخيرة لهذا المقال الشائق، وأرجو إني قد وفِّقت في الشرح.
وفي نهاية الأمر لا يسعني سوى أن أشكرك على حسن قراءتك لهذا المقال، وأني لبشر أصيب وأخطِئ، فإن وفِّقت في طرح الموضوع فمن اللّٰه عز وجل وإن أخفقت فمن نفسي والشيطان.
أرجو منك تقييم كفاءة المعلومات من أجل تزويدي بالملاحظات والنقد البناء في خانة التعليقات أو عبر حساب الموقع، والسلام عليكم ورحمة اللّٰه تعالى وبركاته.