كتاب ProGit، الدرس السابع، التفريعات branches

بسم الله الرحمن الرحيم

عبود عند السلطان

كان يا ما كان، في سالف العصر والأوان، في مدينة العلم والعرفان، سلطانٌ جوّال في الأمصار، حاكمٌ مُحبٌ للمعرفة والآثار. أمر هذا السلطان بإعداد مخطوطةٍ فريدةٍ لم يُرَ مثلُها في البلاد، تُجمع فيها العلوم وأخبار العباد، تُهدى إلى ملوك الأرض يوم جلوسه على العرش.

فنادى في الناس: “من كان منكم أمينًا في النقل، بصيرًا بالحرف، فليأتِ إلى بيت الحكمة”. فقدم إليه ثلاثة من أفاضل الكُتّاب المشار إليهم بالبنان وهم:

عبود، صاحب العقل الرصين،

عبد الرحمن، صاحب القلم الرشيق،

هشام، صاحب المعنى الدقيق.

أمرهم السلطان أن يعملوا على أصل واحد من المخطوط بلا نسخ وتشتيت، يُحفظ في صندوقٍ من حديد، وأعطاهم مفاتيحًا لها بريق.

فقال عبود:

“يا مولاي، إن تركتَنا نكتب جميعًا في ذات الأصل، تداخلت الأقلام، وتضاربت الأفهام، وفُقِدتِ الأمانة، واختلط الحابل بالنابل”.

فأجاب السلطان وقد بدت عليه ملامح الاستحسان:

إذن أشيروا أيها الكتاب!

فأطرقوا يتفكرون برهة، وإذ بعود يقول:

“يا مولاي أدام الله عزك، نجعل لكلٍّ منا نسخة من المخطوط. يعمل فيها كلّ كاتب على ما أُوكل إليه. فإذا استوَت فصولنا، جمعناها وأدخلناها على الأصل بحكمةٍ وتدبير”.

فقال السلطان:

“ولو أن أحدكم كتب ثم قال في غده: (لو غير هذا كان أحسن، ولو زيد كذا لكان يُستحسَن، ولو تقدَّم هذا لكان أفضل)، فاستيلاء النقص على جملة البشر مشتهر، فكيف يرجع عما كتب؟”

قال عبد الرحمن:

“هاهنا نفع النسخة يا مولاي. فإن ضللنا المسعى، تُتركُ النسخة في مكانها، ولا يصيب الأصل شيء، فلم نمسسه. وإن أفلحنا، ضممناها إلى الأصل والأصل بسلام”.

وهكذا بدأوا:

عبود كتب في نسخته عن الحكمة والسياسة.

عبد الرحمن أضاف في نسخته رسومًا وجداول من نظم البلاد.

هشام جرّب في نسخته أبوابًا جديدةً لم تُكتب من قبل.

وفي كل ليلة، كانوا يجتمعون حول النار، يُراجعون ما كتبوه، فإن رضي الجميع، ضموا كل النُّسَخِ في الأصل، كأنها لم تتفرّق يومًا.

مرّت الأسابيع، واكتمل المخطوط، بلا خطأٍ ولا تضارب. أعجب بها السلطان، وسُرَّ بها ملوك الأرض.

ما التفريع؟

التفريع Branching: أن تتخذ مسارًا موازيًا لمسار التطوير الرئيس، تعمل فيه دون أن تخل بالأصل.

المبرمج المبتدي الذي يجهل جِت git إن رام إضافة مزية إلى برنامجه فأجود ما تجود به قريحته أن يذهب فينسخ مجلد العمل إلى مجلد آخر ثم يعمل على المزية هناك بمعزلٍ عن إفساد الأصل، وهذا مرهق وشاق لا سيما إذا كان المشروع ضخمًا.

ومزية التفريع تكفيه عناء ذلك، فلا غنى لك عنها في استعمال جِت وبرمجة البرامج العظام أيها المبرمج، وأنت محتاج لها أبدًا، بها تعمل على ميزات وإضافات features جديدة أو تجريبية وعلى إصلاح علل في البرنامج دون إفساد سائر البرنامج، كما فعل عبود وصاحبيه إذ أخذوا نسخة ولم يمسسوا الأصل بسوء، وبعد التيقن مما كتبوه ضموه إلى الأصل، أضافوه، وهذا نفسه يكون في جِت بالتفريع، إنشاء الفروع  branches.

قلنا في تعريف التفريع أنه اتخاذ: (مسارٍ موازنٍ لمسار التطوير الرئيس)، فما الذي نعني بمسار التطوير الرئيس؟

اعلم أيها القارئ الكريم إذا أنشأت مستودعًا -كما تعلمنا في الشروح الأولى من جِت- فأنت في مسار عمل أصلي يبتدئ منه كل البرنامج، يكون هو الأصل الذي تعمل فيه، أي هو الجذر منه تبتدئ الشجرة بتفريعاتها. هذا الأصل مثل المخطوط الذي كان في عبود، لا تضم إليه شيئًا إلا بعد الاستيقان من حاجته وصلاحه، فإن هممت بإصلاح علة في برنامج لكنك خائف من أن تفسد سائر البرنامج عليك فتفرع!

الفرع هذا لن يمس الأصل بسوء، لا ضرر، فالعب فيه وافعل ما تشاء، فإن أفسدت فيه فسهل جدًا حذفه والرجوع إلى الأصل وكأن الفرع لم يكن. ومثله إن شرعت بإضافة مزية إلى برنامج، فأنت مقتدر على فعله في تفرع منعزل عن الأصل، هناك تختبره وتمحصه من كل علة.

انظر هذه الصورة، مسار التطوير الرئيس هو الذي عليه الدوائر الزرق، كنا نسير فيه، في مرة إيداع commit، وكل إيداع هو الدائرة الزرق:

ثم في مرة من المرات أضفنا مزية للبرنامج فتفرعنا من الدائرة الزرقاء الثانية -كما ترى- وخرج السهم إلى دائرة خضراء في خط آخر لا يمس الأصل بسوء، بل هو في معزلٍ عنه، ثم كنا نعمل على هذا التفريع ونعمل على الأصل (الدوائر الزرق وخطها)، ثم انتهينا من المزية وقذفنا بها إلى الأصل واندمجت معه وكأنها لم تكن تفريعًا قطُّ.

وكما قرأت، التفريع يُدمج بالأصل، يُضم إليه كما ضم عبود ما كتبه إلى المخطوط فصار شيئًا واحدًا، ولهذا محاسن منها العزل، فكل تفريع في معزلٍ عن الأصل، والتعاون، فكل شريك في البرنامج سيوكل بأمر ويعمل عليه في ركن، وفي هذا سرعة إنجاز وتنظيم.

عرض التفريعات

وبعد أن فهمت فحوى التفريع فسهل عليك التطبيق. الأمر التالي يستعمل في عرض إنشاء وحذف وتسمية التفريعات:

git branch

كتابة الأمر السابق وحده سيعرض لك التفريعات، فإن كان المستودع حديث النشأة سيظهر لك هذا:

* master
(END)

وعلامة النجمة تخبرك بالتفريع الحالي الذي أنت فيه، وهي تشير هاهنا إلى الأصل واسمه master. لعلك تسألني الآن وتقول كيف يكون الأصل تفريعًا؟!

إن كان تفريعًا فمن ماذا يا مبعسس تفرع؟ كيف يكون الأصل تفريعًا هداك الرحمن؟

هدانا الله وإياك وأحسنت سؤالًا، وجواب سؤالك في المقال الآتي، فما هذا المقال إلا مقدمة، فلنا مع التفريعات صولات وجولات إن شاء الله، خذ مني ما درسته اليوم بأن الأمر يعرض التفريعات في المستودع والنجمة تشير إلى التفريع الحالي والباقي لوقته.

إنشاء تفريع والولوج إليه

لإنشاء تفريع نستعمل نفس الأمر مع إضافة اسم التفريع الذي تود إنشاءه. مثلًا سأسميه feature-login، مزية الولوج:

git branch feature-login

إن نفذت أمر عرض التفريعات سترى النجمة تشير إلى نفس الأصل، أي أن الأمر السابق أنشأ لك التفريع ولم يُدخلك إليه، ولتدخل إليه اكتب:

git checkout feature-login

الآن قد ولجت إليه! العب وامرح هاهنا كيفما شئت، الأصل محفوظ مصان.

إن أردت دمج الأمرين في أمر واحد، ينشئ التفريع وتلج إليه فاكتب:

git checkout -b feature-login

وكيف ترجع للأصل؟ إلى master؟

هذا واجب عليك، تفكّر قليلًا وستعرف…

الخاتمة

ها قد وصلنا إلى نهاية المقال، وها أنا أخط بقلمي الخطوط الأخيرة لهذا المقال الشائق، وأرجو إني قد وفِّقت في الشرح.

وفي نهاية الأمر لا يسعني سوى أن أشكرك على حسن قراءتك لهذا المقال، وأني لبشر أصيب وأخطِئ، فإن وفِّقت في طرح الموضوع فمن اللّٰه عز وجل وإن أخفقت فمن نفسي والشيطان.

أرجو منك تقييم كفاءة المعلومات من أجل تزويدي بالملاحظات والنقد البناء في خانة التعليقات أو عبر حساب الموقع، والسلام عليكم ورحمة اللّٰه تعالى وبركاته.