You are on page 1of 51

‫تعلّم ‪git‬‬

‫(األداة األكثر استعماالً إلدارة اإلصدارات)‬

‫تأليف‪:‬‬
‫سيد صالح‬
‫م‪ .‬مختار ّ‬
‫جميع الحقوق محفوظة للمؤلف‬

‫تامة وفق رخصة المشاع اإلبداعي ‪Creative‬‬


‫ملحوظة‪ :‬يسمح بتداول هذا الكتاب بحرّية ّ‬
‫جل اإلخالص و القبول‬
‫عز و ّ‬‫‪ Commons‬و على ّنية الصدقة سائلين المولى ّ‬

‫(انقر هنا لقراءة النص القانوني الكامل للرخصة)‬


‫األول‬
‫الفصل َّ‬

‫أساسيّات ‪git‬‬

‫‪4‬‬
‫ما هي ‪git‬؟‬
‫‪ git‬ه ي أداة تس تخدمها ف رق العم ل بش لل ع ام و البرمخي ة منه ا بش لل خ اص إلدارة إص دارات‬
‫المشروع‪/‬العمل الذي يتعاون أعضاء الفريق على إنخازه‪.‬‬
‫إملانية تتبع التغييرات التي أجراها أعضاء الفريق على ملفات المشروع‬
‫ّ‬ ‫و نعني ب "إدارة اإلصدارات"‬
‫و ت اريو ا ل تغيي ر إ افة لعض و الفري ق‬ ‫خ الل م ار ل تنفي ذه المختلف ة بحي د يمل ن تحدي د وق‬
‫المسؤول المتسبب بهذا التغيير‪.‬‬

‫كيف نشأت ‪ git‬و لماذا؟‬


‫نظ ام لي نك ) األب الرو ي ل ‪ ،git‬و تع ود أس باب نش أة ‪ git‬إل ى‬ ‫يعتب ر لين وو تورفال دز (منش‬
‫ينه ا إل ى أداة مناس بة إلدارة اإلص دارات و ص ديقة‬ ‫اج ة الفري ق العام ل عل ى تة وير ن واة لي نك‬
‫لفرق عمل البرمخيات مفتو ة المصدر‪ ،‬خصوصاً بعد النزاع ال ذي نش أ بي نهم و ب ين الش راة القائم ة‬
‫عل ى تة وير نظ ام ‪ BitKeeper‬ال ذي ا انوا يس تعملونت وقته ا (أبري ل ‪ )٢٠٠٥‬ي د أن األخي ر‬

‫س بباً‬ ‫مرخص تخارّياً و بالتالي الستخدامت من قبل مختمع ابي ر م ن المة ّورين تبع ات قانوني ة اان‬
‫ّ‬
‫‪1‬‬
‫النزع‪.‬‬
‫في إشعال فتيل ا‬

‫لماذا تستخدم ‪git‬؟‬


‫تتلخص في‪:‬‬
‫كما ذارنا في التعريف‪ ،‬فإن األهداف الرئيسية الستخدام ‪ّ git‬‬
‫‪ .1‬تسخيل التغييرات التي يخريها المةورون في شيفرات المشاريع البرمخية‪.‬‬
‫بلل من تلك التغييرات و تاريو ال منها‪.‬‬
‫المتسبب ّ‬
‫ّ‬ ‫‪ .2‬تسخيل‬

‫‪1‬‬
‫‪https://en.wikipedia.org/wiki/Git#History‬‬

‫‪5‬‬
‫إملاني ة التع اون ف ي المش اريع البرمخي ة بحي د يمل ن ألكث ر م ن عض و ف ي الفري ق‬
‫ّ‬ ‫‪ .3‬إتا ة‬
‫ياع ّأية مساهمات‪.‬‬ ‫دون‬ ‫الوق‬ ‫الملف‪/‬الملفات في نف‬ ‫العمل على نف‬

‫تثبيت ‪:git‬‬
‫‪ git‬باختالف نظام التشغيل المستخدم و فيما يلي التفاصيل‪:‬‬ ‫تختلف آلية تثبي‬
‫‪ Installer‬يمل ن تحميل ه‬ ‫م ن خ الل مع ال تثبي‬ ‫• أنظم ة وين دوز ‪ : Windows‬ي تم التثبي‬
‫من موقع األداة الرسمي‪.‬‬
‫المخص ص لك ل‬ ‫‪ :Linux‬باس تخدام س ةر األوام ر‪ ،‬و اتب اع أم ر التثبي‬ ‫• أنظم ة لي نك‬
‫و التي ملن مراجعتها من خالل موقع األداة الرسمي‪.‬‬ ‫توزيعة من توزيعات لينك‬
‫الخ اص‬ ‫• أنظمة ماك أو إو ‪ :MacOs‬باستخدام ‪ homebrew‬أو باستخدام معال التثبي‬
‫بماك أو إو و الذي يملن تحميل من موقع األداة الرسمي‪.‬‬
‫الخاصة بنظام التشغيل الذي تعمل عليت‪ ،‬يملنك تخريب األمر‪:‬‬ ‫بعد اتباع تعليمات التثبي‬
‫‪git --version‬‬

‫األداة يد يفت رأ أن يظه ر رق م اإلص دار ال ذي ت م تثبيت ت للت ّو‬ ‫في سةر األوامر للتأكد من تثبي‬
‫‪2‬‬
‫كما تو ّ ح الصورة أدناه‪.‬‬

‫‪2‬‬
‫في متن هذا الكتاب سأستعمل سةر أوامر ماك أو إو ‪ MacOs‬نظ اًر ألنني أكتب هذا الكتاب على ‪ ،Macbook Pro‬لك ن بش لل ع ام‬

‫األسلوب‪.‬‬ ‫يملنك استخدام سةر األوامر المتاح في نظام التشغيل الذي تستعملت بنف‬

‫‪6‬‬
‫تعريف حساب ‪ git‬المحلّي‬
‫يفضل أن نقوم بتعريف الحساب المحلّي الخاص بنا على ‪ ،git‬و ذلك من‬
‫قبل أن نبدأ باستخدام ‪ّ git‬‬
‫خالل تنفيذ األمرين‪:‬‬
‫"‪git config --global user.name "Muktar SayedSaleh‬‬

‫"‪git config --global user.email "muktar@monjz.com‬‬

‫به ذه الةريق ة و عن دما نق وم باس تخدام ‪ git‬بع د قلي ل لحف ي أي ة تغيي رات نق وم به ا‪ ،‬فس تظهر تل ك‬
‫أن المتس بب به ا ه و المس تخدم ص ا ب االس م و البري د اإللكترون ي ال ذين أدخلناهم ا‬
‫التغييرات عل ى ّ‬
‫أعاله‪.‬‬

‫تغيي ر اس م المس تخدم وعن وان البري د ف ي المث ال أع اله إل ى اس م المس تخدم‬ ‫ملحوظ ة أول ى‪ :‬ال ت ن‬
‫الخاص بك و عنوان بريدك اإللكتروني‪.‬‬
‫ملحوظة ثانية‪ :‬اوننا استعملها الوسيط الع ام ‪ --global‬فه ذا يعن ي أن الحس اب ال ذي قمن ا بتعريف ت‬
‫سيلون هو الحساب المستخدم في جميع مستودعات ‪ git‬على هذا الحاسوب‪ ،‬م ا ل م نق م بتخص يص‬
‫بعض المستودعات بغير ذلك ص ار ًة; و سنأتي على ذار معنى المستودع بعد قليل‪.‬‬

‫‪7‬‬
‫البدء باستخدام ‪git‬‬
‫و اآلن‪ ،‬يملنن ا الب دء باس تخدام ‪ git‬إلدارة إص دارات المش روع ال ذي نعم ل عليه ا الي اً‪ ،‬و ذل ك م ن‬
‫خالل االنتقال إلى مخل د المش روع‪ ،‬ث ّم إدخ ال األم ر الت الي ام ا تب ّين الص ورة أدن اه‪ ،‬و ذل ك لتحويل ت‬
‫إلى مستودع ‪ ،git‬يد ّأننا نستخدم مصةلح "مستودع" ‪ Repository‬لإلشارة إلى أي مشروع تدار‬
‫إصداراتت باستخدام ‪ ،git‬و أمر التهيئة هو‪:‬‬
‫‪git init‬‬

‫و بهذا نكون قد قمنا ّ‬


‫للتو بإنشاء ّأول مستودع ‪ git‬بنخاح‪ ،‬مبارك مبارك!‬

‫حاالت الملفات في ‪git‬‬


‫محلي اً ف ي الفق رة الس ابقة‪ ،‬غي ر أن ت ف ار و ال يح وي ّأي ة ّ‬
‫ملف ات‪ ،‬ل ذا س نقوم‬ ‫ّ‬ ‫لق د أنش أنا مس تودع ‪git‬‬
‫بإنشاء ملف جديد (و ليلن ملف ‪ html‬عل ى س بيل التخر ة)‪ ،‬ث م نق وم بحف ي ذل ك المل ف و إ افتت‬
‫إلى ‪.git‬‬

‫أن ت تعلم فيملن ك الرج وع إل ى ات ابي‬ ‫ملف ات ‪ html‬و أ بب‬ ‫فائ دة‪ :‬إذا ل م تك ن تعل م اي ف تنش‬
‫المنشور مسبقاً و الذي يشرح ذلك بالتفصيل‪ ،‬أما بالنسبة لهدف هذا الكتاب فيملنك إنشاء أي مل ف‬
‫عادي إذا أ بب ‪.‬‬
‫ّ‬ ‫نصي‬
‫ّ‬

‫‪8‬‬
‫على ّأية ال‪ ،‬سنستخدم لمثالنا في الشرح ملف ‪ HTML‬نضع ب ت المحت وت الت الي‪ ،‬و نحفظ ت باس م‬
‫‪index.html‬‬
‫>‪<html‬‬

‫ً بك في>‪<head><title‬‬
‫>‪ git!</title></head‬مرحبا‬

‫ً بك في>‪<body><h1‬‬
‫>‪ git!</h1></body‬مرحبا‬

‫>‪</html‬‬

‫و اآلن إذا ع دنا إل ى س ةر األوام ر‪ ،‬و استعر نا الملف ات الموج ودة ف ي مخلّ دنا الخدي د فيخ ب أن‬

‫نرت ملّفنا ‪ index.html‬فقط اما ّ‬


‫تبينت الصورة التالية‪:‬‬

‫و ماك أو إو‪ ،‬يستخدم األمر ‪ ls‬الستعراأ الملفات الموج ودة ف ي المخل د‪ ،‬و‬ ‫ملحوظة‪ :‬في لينك‬
‫يقابلت األمر ‪ dir‬في سةر أوامر ويندوز‪.‬‬

‫سناً‪ ،‬اآلن يملننا أن نتحقق من الة تتبع الملفات في ‪ git‬باستخدام األمر‬


‫‪git status‬‬

‫من صفحات هذا الكتاب‪ ،‬يد يستعمل هذا األمر لرؤية الو ع الحالي‬ ‫و الذي سنستعملت اثي اًر‬
‫أن المل ف جدي د فس يظهره لن ا ‪ git‬عل ى أن ت‬
‫لملفات المشروع بالنسبة ل ‪ ،git‬و ف ي مثالن ا الح الي بم ا ّ‬
‫مل ف جدي د ل م ي تم تتبع ت بع د ‪ Untracked‬و ل م نق م باال تف ا" ب أي "إص دار" من ت ام ا تب ّين لقة ة‬
‫الشاشة أدناه‪.‬‬

‫‪9‬‬
‫فبالنسبة ل ‪ git‬تكون الملفات الموجودة في مستودع ما على إ دت التين‪:‬‬
‫• ‪ :Tracked‬و تشير إلى الملفات التي يعرفها ‪ git‬و المضافة إلى المستودع من قبل‪.‬‬
‫• ‪ :Untracked‬و تشير إلى الملفات الخديدة التي لم تُضف إلى المستودع بعد‪.‬‬
‫التتب ع م رو اًر‬
‫و س نتعلّم بع د قلي ل األم ر المس تعمل لنق ل الملف ات م ن الته ا غي ر المتتبع ة إل ى ال ة ّ‬
‫بمر لة اإلدراج‪ ،‬و هي ما سنناقشت في الفقرة التالية‪.‬‬

‫مرحلة اﻹدراج ‪Staging‬‬


‫التتبع مباشرة للملف الذي ننوي ّ‬
‫تتبعت ألول‬ ‫تمثل مر لة اإلدراج ‪ Staging‬الحالة التي تسبق مر لة ّ‬
‫عليت ال قاً‪ ،‬بما فيها ذفت‪ ،‬يد ال يملننا نقل الملف أو تغييراتت‬ ‫تم‬
‫تتبع التغييرات التي ّ‬
‫مرة‪ ،‬أو ّ‬
‫ّ‬
‫من الة عدم التتبع إلى الة التتبع مباشرة دون المرور بمر لة اإلدراج‪.‬‬
‫المدرجة هي ملف ات ج اهزة لإلي داع امس اهمة ‪ commit‬ف ي المس تودع ال ذي تعم ل علي ت‪،‬‬ ‫و الملفات ُ‬
‫وهو ما سنتعرأ لت بالتفصيل أثن اء ش رح عملي ة إي داع المس اهمة ‪ commit‬ف ي الفق رة الال ق ة‪ ،‬أم ا‬
‫اآلن و اوننا أتممنا العم ل عل ى المل ف ‪ ،index.html‬فل نقم بإ افتت إل ى مر ل ة اإلدراج باس تخدام‬
‫األمر ‪ add‬بالشلل التالي‪:‬‬
‫‪git add index.html‬‬

‫‪10‬‬
‫مههن حالههة‬ ‫و اآلن إذا قمنا بتنفيذ أمر التحقق من حالة ‪( git‬األمر ‪ )git status‬فسنرى انتقههال المله‬
‫عدم التتبع بشكل كلّي‪ ،‬إلى حالة اإلدراج ‪ staging‬كما تبيّن الصورة التالية‪:‬‬

‫ملحوظ ة‪ :‬يملنن ا إ افة أكث ر م ن مل ف وا د إل ى ال ة اإلدراج دفع ًة وا دة م ن خ الل األم ر ‪git‬‬


‫أن الوسيط ‪ --all‬يعني جميع الملفات‪ .‬اما يملننا إ افة مخلد اامل إلى الة‬
‫‪ add --all‬يد ّ‬
‫اإلدراج من خالل اتابة اسم المخلد بدالً من اسم الملف عند تنفيذ تعليمة ‪.add‬‬

‫إيداع المساهمات ‪Committing‬‬


‫يعتم د ‪ git‬ف ي إدارة اإلص دارات عل ى مفه وم "المس اهمات" و المس اهمة ‪ commit‬ه ي مخموع ة م ن‬
‫التعديالت التي تتم عل ى الملفات و التي تحفي التلة وا دة ف ي ش خرة ت اريو ‪ ،git‬بحي د تعتب ر ا ل‬
‫ةة مستقبالً اما‬
‫ةات سير المشروع و يتيح ‪ git‬العودة إلى ّأية مح ّ‬
‫ةة من مح ّ‬
‫مساهمة ‪ commit‬مح ّ‬
‫سنرت‪.‬‬
‫ثم و بع د اإلدراج‬
‫ال إدراج جميع التغييرات المةلوب إيداعها‪ّ ،‬‬
‫على ّأية الة‪ ،‬إليداع مساهمة يخب أو ً‬
‫‪ Staging‬يتم اإليداع في المستودع من خالل األمر ‪ commit‬مع مراعاة ت رك رس الة مناس بة تراف ق‬
‫عملية اإلي داع و تب ين م ا ت م فيه ا بش لل مختص ر ع ادة لس هولة المراجع ة م ن قب ل المس اهم نفس ت أو‬
‫زمالئت في فريق العمل‪.‬‬
‫إليداع العمل الذي قمنا بت في الفقرة السابقة مع رسالة تفيد ّأن ت أول إيداع نقوم بتنفيذ األمر التالي‪:‬‬
‫"بسم هللا الرحمن الرحيم‪ ،‬اإليداع األول" ‪git commit -m‬‬

‫‪11‬‬
‫ينفذ األمر ‪ commit‬عملية اإليداع‪ ،‬وتضيف "‪ -m "message‬رسالة‪ ،‬و هل ذا تك ون بيئ ة اإلدراج‬
‫ف ي مس تودعنا م ع رس الة تق ول "بس م ا ال ر من ال ر يم‪ ،‬اإلي داع األول" ام ا يظه ر ف ي‬ ‫ق د أودع‬
‫عملي ة إي داع‪ ،‬و يس ّمى ه ذا ال رقم‬
‫أن ‪ git‬يق وم تلقائي اً بم نح ت رقيم فري د لك ل ّ‬
‫الص ورة أدن اه‪ ،‬و يال ي ّ‬
‫"معرف اإليداع" ‪.Commit ID‬‬ ‫ّ‬

‫م ن قب ل تنفي ذ مر ل ة‬ ‫ملحوظ ة‪ :‬بالنس بة إلي داع ا لتغيي رات عل ى الملف ات الت ي س بق و أن أودع‬
‫مني أثناء القيام بعملية اإليداع من خالل تمرير الوسيط ‪ -a‬بحيد تصبح التعليم ة‬ ‫اإلدراج بشلل‬
‫االت إي داع ملف ات غي ر‬ ‫الكامل ة ام ايلي‪ ،‬م ع نص يحتي بتحاش ي اس تخدام ه ذه التعليم ة لتف ادي‬
‫مرغوب بإيداعها عن طريق الخةأ‪.‬‬

‫"‪git commit -am "Your commit message here‬‬

‫مرة أخرى!‬
‫إيداع نفس الملف ّ‬
‫من المل ف‬ ‫أي تغيي ر‬
‫س ناً‪ ،‬اآلن بع د أن قمن ا بإي داع المل ف للم ّرة األول ى‪ ،‬فل نقم بعم ل ّ‬
‫‪( index.html‬كإ افة س ةر م ثالً أو تغيي ر محت وت الخمل ة النص ّية) و ذل ك به دف رؤي ة اي ف‬
‫سيقوم ‪ git‬بالتعرف على التغيير الحاصل عند تنفيذ األمر ‪ git status‬ام ا تو حة الص ورة أدن اه‪،‬‬

‫‪12‬‬
‫و يرج ى مال ظ ة الم ة ‪ modified‬و الت ي تعن ي أن المل ف م درج س ابقاً لكن ت اآلن خض ع لتع ديل‬
‫"معدلة ‪ "modified‬بمعنى ّأنها مختلفة عن آخر إدراج تم لها في ‪.git‬‬
‫جعل نسختت الحالية ّ‬

‫المل ف م ع رس الة‬ ‫خة وات عملي ة اإلي داع الس ابقة‪ ،‬و إج راء إي داع ث ا‬
‫ان ل نف‬ ‫يملننا اآلن تك رار نف‬
‫تفيد بسبب اإليداع اما تبينت الصورة التالية‪:‬‬

‫االطالع على سجل اﻹيداعات‬


‫مناسباً لتخر ة أم ر االط الع عل ى‬ ‫اآلن و اوننا قمنا بعمل إيداعين في مستودعنا‪ ،‬رّما يلون الوق‬
‫بالفعل في المستودع من خالل تنفيذ األمر‪:‬‬ ‫اإل يداعات التي تم‬
‫‪git log‬‬

‫‪13‬‬
‫معرف ات عملي ات اإلي داع الس ابقة و ت اريو ا ل منه ا‪ ،‬و الرس الة الت ي تب ّين س بب‬
‫و ال ذي يع رأ ّ‬
‫أن‬
‫اإليداع اما أدخلها المستخدم ال ذي ق ام بعملي ة اإلي داع ام ا يظه ر ف ي الص ورة أدن اه م ع مال ظ ة ّ‬
‫ترتيب ظهور عمليات اإليداع علسي (من األ دث لألقدم)‬

‫أداة اس مها ‪ gitk‬تت يح لن ا االط الع عل ى الس خالت م ن خ الل‬ ‫فائ دة‪ :‬يمل ن بش لل اختي اري تثبي‬
‫واجهة استخدام مرئية ‪ GUI‬تو حها الص ورة التالي ة م ع تأكي دي ّأنن ا يخ ب أن ن تعّلم ‪ git‬م ن خ الل‬
‫سةر األوامر لضمان الفهم الكامل آللية عملها و االستفادة القصوت منها‪.‬‬

‫‪14‬‬
‫التراجع عن عملية إيداع في ‪git‬‬
‫ثم و لسبب أو آلخر نكتشف أننا بحاجة للتراجع عن‬ ‫بعملية إيداع ما أو أكثر‪ّ ،‬‬
‫ّ‬ ‫يحدث أ ياناً أن نقوم‬
‫عملي ات اإلي داع بأس لو ين اثن ين أ دهما بس يط و سنناقش ت‬
‫عملية اإليداع تلك‪ ،‬تتيح ‪ git‬التراجع عن ّ‬
‫الكتيب بإذن ا تعالى‪.‬‬
‫في هذه الفقرة‪ ،‬و اآلخر متقدم سنناقشت في الفصل الرابع من هذا ّ‬
‫معين ة م ن خ الل‬
‫أم ا األم ر البس يط فه و أم ر ‪ git revert‬و ال ذي يق وم ب التراجع ع ن عملي ة إي داع ّ‬
‫ّ‬
‫القيام بعملية إيداع أخرت معاكسة تماماً بحيد تكون النتيخة العودة بالملفات إل ى الته ا الت ي اان‬
‫عليها قبل عملية اإليداع األساسية التي نرغب بالتراجع عنها‪.‬‬
‫و لك ي نفه م األم ر بش لل عمل ي‪ ،‬ل نقم ب التراجع ع ن عملي ة اإلي داع الثاني ة الت ي قمن ا به ا ف ي الفق رة‬
‫الس ابقة و الت ي قمن ا بموجبه ا بإ افة بع ض الكلم ات إل ى مل ف ‪ html‬ال ذي أنش أناه‪ ،‬و للقي ام به ذا‬
‫الغ رأ نحت اج لمعرف ة مع ّرف عملي ة اإلي داع ‪ Commit ID‬المةل وب التراج ع عنه ا و ال ذي يملنن ا‬
‫مما يولده األمر ‪ git log‬اما تظهر الصورة أدناه‬
‫ببساطة نسخت ّ‬

‫بمعرف عملية اإليداع ‪:‬‬


‫ثم تنفيذ األمر التالي مع مراعاة استبدال >‪ّ <commit-id‬‬
‫ّ‬
‫>‪git revert <commit-id‬‬

‫‪15‬‬
‫فائ دة‪ git :‬ذا ي افاي ة لمعرف ة عملي ة اإلي داع المقص ودة بمخ ّرد إدخ ال ّأول ‪ ٨‬أ رف م ن مع ّرف‬
‫ال ترغ ب بنس و اام ل المع ّرف‪ .‬و ه ذا ينةب ق عل ى جمي ع األوام ر الت ي تس تقبل‬ ‫العملي ة إذا ان‬
‫‪ commit ID‬و منها األمر ‪.revert‬‬

‫‪16‬‬
‫الفصل الثاني‬

‫التفريعات ‪Branches‬‬

‫‪17‬‬
‫ما هي التفريعات ‪branches‬؟‬
‫من فرق العمل أن يلون ال عضو أو مخموعة أعضاء م ن‬ ‫يحدث في معظم األ يان عند العمل‬
‫الفريق مس ؤولين ع ن تة وير ج زء مس تقل و منفص ل م ن المش روع‪ ،‬و له ذا الغ رأ ق د يرغ ب ه ؤالء‬
‫الكافي للتةوير دون التأثير‬ ‫بالعمل على نسخة شبت مستقلّة من المشروع بحيد يتاح لهم أخذ الوق‬
‫على باقي أعضاء الفريق‪ ،‬و هذا تماماً ما يتم استخدام التفريعات ‪ Branches‬من أجلت في ‪.git‬‬
‫بمعنى آخر‪ ،‬تسمح الفروع للمةورين بالعمل على أجزاء مختلفة من المشروع دون التأثير على الفرع‬
‫الرئيس ي‪ ،‬و عن د تم ام العم ل ُي دم الف رع الخدي د م ع المش روع الرئيس ي‪ ،‬ب ل تس تةيع التب ديل ب ين‬
‫الفروع و العمل على مشاريع مختلفة دون أن ي ؤثر ا ل منه ا عل ى اآلخ ر‪ ،‬فاس تخدام أس لوب التفري ع‬
‫هنا طريقة سريعة و خفيفة إلجراء التعديالت على المشروع‪.‬‬

‫إنشاء فرع جديد في ‪git‬‬


‫لنض ف اآلن بع ض المزاي ا الخدي دة ف ي ص فحة ‪ index.html‬الت ي أنش أناها ف ي الفص ل الس ابق‪ ،‬و‬
‫كونن ا نرغ ب أن نق وم به ذا ف ي مس تودعنا المحل ي دون الت أثير عل ى المش روع الرئيس ي أو تعةيل ت‬
‫سنقوم بإنشاء فرع جديد باستخدام األمر ‪:git branch‬‬
‫‪git branch hello-world-images‬‬

‫لقد أنشأنا اآلن فرعاً جديداً ‪ branch‬باسم ‪ ،hello-world-again‬و يملنن ا أن نتحق ق م ن وج وده‬
‫من خالل تنفيذ األمر ‪( git branch‬دون تمرير اسم أي فرع) مرة أخرت‬

‫‪18‬‬
‫كم ا ن رت فيوج د اآلن ف رع جدي د باس م ‪ ،hello-world-images‬و ف رع آخ ر اس مت ‪ master‬و‬
‫بخانبت عالمة نخمة * تعني أننا اآلن في هذا الف رع (ف ي الف رع ‪ )master‬و رّم ا تتس اءل اآلن م ن‬
‫أن ‪ git‬تنش الف رع ‪ master‬بش لل‬
‫للتو؟ و الخ واب ّ‬
‫أين جاء الفرع ‪ master‬و أنا أتعلّم التفريعات ّ‬
‫آلي في ال مستودع جديد‪.‬‬

‫فائدة‪ :‬بعض توزيع ات ‪ git‬تس تخدم االس م ‪ main‬ب دالً م ن ‪ master‬لتالف ي اإليح اء الت اريخي ال ذي‬
‫السيد ‪ master‬في بعض الثقافات الغر ية‪.‬‬
‫يعنيت لفي ّ‬

‫تنبيت‪ :‬يخب االنتباه إلى الفرع الذي تتواجد فيت لحظة إنشاء فرع جديد‪ ،‬ألن الفرع الخديد سيلون في‬
‫لحظة إنشائت نسخة مةابقة تماماً للفرع الذي تم إنشاؤه منت‪.‬‬

‫االنتقال إلى فرع آخر في ‪git‬‬


‫نمرر اسمت مع األمر‪ ،‬و لتخر ة‬
‫ُيستخدم األمر ‪ checkout‬لالنتقال من الفرع الحالي إلى فرع آخر ّ‬
‫ذلك يملننا االنتقال إلى الفرع الخديد الذي أنشأناه ّتوا امايلي‪:‬‬
‫‪git checkout hello-world-images‬‬

‫و هل ذا نك ون ق د نقلن ا مس ا ة العم ل الحالي ة م ن الف رع الرئيس ي إل ى الف رع الخدي د‪ ،‬و اآلن لنف تح‬
‫محر اًر نصياً لنخري بعض التعديالت‪.‬‬

‫‪19‬‬
‫فائدة‪ :‬يملننا استخدام الخيار ‪ -b‬مع األمر ‪ checkout‬لنطلب من ‪ git‬أن ينتقل إلى الفرع الجديد في‬
‫حال كان موجودا‪ ،‬و ّإّل أن ينشئ ثم ينتقل إلي مباشرة‪.‬‬

‫من‬ ‫في هذا المثال سنقوم بإ افة اسمها ‪ img_hello_world.jpg‬إلى مخلد العم ل ث ّم نض منها‬
‫صفحة ‪ index.html‬بإ افة السةر التالي‪:‬‬
‫>‪<img src="img_hello_world.jpg" alt="Hello World from Space" /‬‬

‫فنا المل ف الخدي د‬ ‫و به ذا نك ون ق د أجرين ا تغيي رات عل ى مل ف ‪ index.html‬و أ‬


‫‪ img_hello_world.png‬إلى مخلد العمل‪ ،‬و إذا نفذنا ‪ git status‬سنخد مايلي‪:‬‬

‫و ام ا تال ي ف الملف ‪ index.html‬يح وي بع ض التع ديالت (‪ )modified‬غي ر ّأن ت ل م ُي درج بع د‬


‫أم ا المل ف ‪ img_hello_world.jpg‬فحالت ت ‪ Untracked‬اون ت يض اف للم رة‬ ‫‪ ،Not staged‬و ّ‬
‫األولى و لم يودع من قبل‪ ،‬و للقيام بايداع اال التغيي رين س ن حتاج إل ى إ افة ا ال الملف ين إل ى بيئ ة‬
‫اإلدراج لهذا الفرع‪:‬‬
‫‪git add --all‬‬

‫و للت ذاير فق ط اس تخدمنا ‪ --all‬ب دالً م ن أس ماء الملف ات المس تقلة إلدراج جمي ع الملف ات بتعليم ة‬
‫وا دة‪ ،‬و اآلن لو قمنا بالتحقق من الة المستودع فسنرت ما تو حت الصورة التالية‪:‬‬

‫‪20‬‬
‫تمرين‪ :‬لماذا يظهر اال الملفين باللون األخضر اآلن؟‬

‫ان ا ج اهزين إلي داع ه ذه التع ديالت يملنن ا إي داعها باس تخدام األم ر ‪ git commit‬ال ذي‬
‫س ناً‪ ،‬إذا ّ‬
‫تعلمناه سابقاً مع ترك رسالة مناسبة تو ح الهدف من عملية اإليداع‪:‬‬
‫" ‪git commit -m "Added image to index.html‬‬

‫م ا يهمن ا اآلن و نري د التراي ز علي ت ه و وج ود ف رع ‪ branch‬جدي د يختل ف ع ن الف رع الرئيس ي‬


‫‪ master‬و االختالف يملن في عملية اإليداع األخيرة‪ ،‬و لنرت اآلن مدت سرعة وسهولة العم ل م ع‬
‫الفروع المختلفة وم دت افاءته ا ف ي العم ل‪ .‬نح ن اآلن ف ي الف رع ‪ ،hello-world-images‬وأ فنا‬
‫صورة إلى ذلك الفرع‪ ،‬و إذا استعر نا الملفات التي في المخلد الحالي سنخد الملفين ‪index.html‬‬
‫الجديهههههههههد‬ ‫و ‪ ،img_hello_world.jpg‬بمعن ى ّأنن ا نسهههههههههتطيع اآلن ر يهههههههههة الملهههههههه‬
‫‪ ، img_hello_world.jpg‬وكذلك نسههتطيع ر يههة التاييههراد الحادثههة فههي الشههيفرة إذا فتحنهها مله‬
‫‪ ،index.html‬وهو ما نتوقع تماما‪ .‬واآلن‪ ،‬لنرى ما يحدث عند تايير الفرع إلى ‪.master‬‬
‫‪git checkout master‬‬

‫لم تعد الصورة الخديدة جزءاً من هذا الفرع‪ ،‬و لو استعر نا الملفات الموجودة في المخلد الحالي مرة‬
‫أخرت لرأينا اآلن أن الصورة الخديدة غير موجودة و اذلك الشيفرة التي أ فناها إل ى ‪index.html‬‬
‫الوق !‬ ‫و هذا يرينا سهولة العمل مع الفروع وايف أنها تسمح بالعمل على أشياء مختلفة في نف‬

‫‪21‬‬
‫فرع اﻹصالحات الطارئة ‪Hot fixes‬‬
‫لنتخي ل اآلن أنن ا ل م نن ت العم ل عل ى الف رع ‪ ،hello-world-images‬لكنّن ا و لس بب ه ام نري د‬
‫إصالح خةأ طارئ في الفرع الرئيسي ‪ master‬دون المساو بذلك الف رع الرئيس ي وال ف رع ‪hello-‬‬
‫‪ world-images‬بما أننا لم ننت العمل عليت بع د‪ ،‬ف ي تل ك الحال ة يملنن ا ببس اطة إنش اء ف رع جدي د‬
‫للتعامل مع هذا اإلصالح الةارئ و يملننا تسميتت ‪ hot-fix‬اصةال اً‪:‬‬
‫‪git checkout -b hot-fix‬‬

‫و نك ون اآلن ق د أنش أنا فرع اً جدي داً م ن الف رع الرئيس ي و أجرين ا تع ديالت علي ت‪ ،‬و نس تةيع اآلن‬
‫إصالح الخةأ دون التأثير على الفروع األخرت ‪ ،‬و اما تتوقع سيتم األمر بإصالح األخةاء ثم إيداع‬
‫هذا اإلصالح في الفرع الخديد‪ ،‬و لكن ايف نخل ب ه ذا اإلص الح إل ى الف رع الرئيس ي؟ الخ واب م ن‬
‫خالل دم الفرعين و هو ما سنناقشت في الفقرات التالية‪.‬‬

‫دمج الفروع في ‪Git‬‬


‫على ف رأ أن الخة أ ال ذي أص لحناه ف ي ال درو الس ابق أص بح ج اه اًز لل دم ‪ ،‬يملنن ا اآلن أن نق وم‬
‫بدم الفرع ‪ hot-fix‬مع الفرع ‪ master‬باتباع الخةوتين التاليتين‪:‬‬

‫‪22‬‬
‫• االنتقال إلى الفرع الهدف (‪ )master‬ا لذي نرغب بدم الفرع اآلخر معت م ن خ الل تعليم ة‬
‫‪.git checkout master‬‬
‫• دم الفرع اآلخر ‪ hot-fix‬مع الفرع الهدف من خالل األمر ‪.git merge hot-fix‬‬
‫ف ي ال ا ون ا ل ش يء عل ى م ا ي رام س يتم ال دم و س تظهر المس اهمات الت ي قمن ا به ا ف ي ف رع‬
‫من الفرع الرئيسي اما تبين الصورة أدناه‪.‬‬ ‫اإلصال ات العاجلة‬

‫حذف الفروع في ‪git‬‬


‫في ال لم نعد بحاجة إلى فرع ما ألي سبب اان فيملننا ذفت من خالل األمر‬
‫‪git branch -D branch_name‬‬

‫ي د يمث ل ‪ branch_name‬اس م الف رع المةل وب ذف ت‪ ،‬و يراع ى أن يل ون الح رف الوس يط ‪D‬‬


‫بالحالة الكبيرة‪ ،‬اما تبين الصورة أدناه‪.‬‬

‫‪23‬‬
‫تعارض عمليات الدمج ‪Merge conflicts‬‬
‫و دون مشاكل و ذلك نظ اًر لعدم وجود‬ ‫عملية دم الفرعين بشلل سل‬ ‫في الفقرة قبل السابقة‪ ،‬تم‬
‫من فريق‪،‬‬ ‫نفست‪ ،‬لكن أ ياناً و عند العمل‬ ‫الملفات في الوق‬ ‫أكثر من شخص يعملون على نف‬
‫ال تك ون األم ور به ذه البس اطة‪ ،‬و ال يس تةيع ‪ git‬أ يان اً معرف ة الةريق ة المثل ى ل دم مس اهمات‬
‫األس ةر‪ ،‬عن دها‬ ‫المل ف و ف ي نف‬ ‫المس اهمين عن دما يتص ادف وج ود تع ديلين أو أكث ر ف ي نف‬
‫‪ Merge‬و ال ذي يتةل ب الت دخل الي دوي م ن أ د‬ ‫يح دث م ا يس ّمى بتع ارأ ال دم ‪conflict‬‬
‫المساهمين للقيام بعملية ّل التعارأ ‪ Conflict resolve‬بحيد يملن إتمام الدم بسالسة‪.‬‬
‫و لش رح ه ذه الحال ة ال ب ّد م ن اص ةناع ال ة تس توجب التع ارأ أوالً‪ ،‬ث ّم س نرت مع اً اي ف يح دث‬
‫التعارأ‪ ،‬و األهم ايف يملن لّت!‬
‫س ناً‪ ،‬الخ تالق ال ة التع ارأ ق م بعم ل ف رع جدي د ث ّم ع ّدل الس ةر رق م ‪ 5‬م ثالً م ن مل ف‬
‫ثم انتقل إلى الفرع الخديد و قم بتعديل‬
‫‪ index.html‬في نف الفرع الحالي‪ ،‬و قم بحفي المساهمة‪ّ ،‬‬
‫المل ف (الس ةر ‪ ٥‬م ن المل ف ‪ )index.html‬ث ّم ق م بحف ي‬ ‫الس ةر و ف ي نف‬ ‫مختل ف ف ي نف‬
‫المساهمة‪.‬‬
‫اآلن عن دما تع ود إل ى الف رع الرئيس ي و تح اول دم الف رع الخدي د س يظهر التع ارأ و س ترت الم ة‬
‫ة‪:‬‬ ‫ورة التالي‬ ‫ت الص‬ ‫تبين‬
‫ا ّ‬ ‫ة ام‬ ‫ات المتعار‬ ‫ام الملف‬ ‫‪ Conflict‬أم‬

‫‪24‬‬
‫حل التعارض ‪Conflict Resolve‬‬
‫سناً اما رأينا في الفقرة الس ابقة فق د ص ل تع ارأ عن دما اولن ا دم الف رعين مع اً نتيخ ة لحقيق ة‬
‫الملف ات و بالت الي ل ن يس تةيع ‪git‬‬ ‫األم اكن م ن نف‬ ‫أنن ا قمن ا ب إجراء تع ديالت مختلف ة ف ي نف‬
‫تحدي د طريق ة ل دم المس اهمات مع اً بش لل آل ي ف ي الملف ات المت أثرة بالتع ارأ‪ ،‬يملنن ا م ن خ الل‬
‫األم ر ‪ git status‬معرف ة الملف ات الت ي تح وي تعار ات ي د س يظهرها ‪ git‬و بخانبه ا وص ف‬
‫أن الملف خضع لتعديل في اال الفرعين‪ ،‬اما يظهر في الصورة أدناه‪.‬‬
‫‪ both modified‬بمعنى ّ‬

‫أن ‪ git‬قام بو ع عالمات تح دد‬


‫النصي‪ ،‬سنخد ّ‬
‫لو قمنا اآلن بفتح الملف المتأثر باستخدام المحرر ّ‬
‫مناطق التعارأ من المل ف متوقع اً من ا القي ام بتع ديالت يدوي ة عل ى المل ف لح ل التعار ات‪ ،‬و‬
‫عملية ل التعار ات البس يةة م ن‬
‫تسهل ّ‬
‫النصية المتقدمة ّ‬
‫ّ‬ ‫من الخدير بالذار أن بعض المحررات‬
‫خالل بعض األدوات اما في الة ‪ VS Code‬مثالً اما يظهر في الصورة أدناه‪.‬‬

‫‪25‬‬
‫يملننا بو وح رؤية أن ‪ git‬ترك التعديلين المتعار ين مع إشارة وا حة السم الفرع الذي جاء من ت‬
‫كل تعديل (‪ head‬يعني الفرع الذي نحاول الدم إليت‪ master ،‬في مثالنا أعاله)‪.‬‬
‫و اآلن يملنن ا إبق اء التع ديل المةل وب و ذف التع ديل غي ر المرغ وب ب ت ليع ود المل ف إل ى ال ة‬
‫طبيعي ة‪ ،‬ث ّم نق وم بع د ذل ك بعم ل التعليم ات ‪ git add‬للملف ات الت ي ت م تع ديلها و ل التعار ات‬
‫ثم التعليمة ‪ git merge –continue‬اما تظهره الصورة أدناه‪.‬‬ ‫فيها‪ّ ،‬‬

‫محلي اً (عل ى الحاس ب الخ اص‬


‫األساسية في ‪ git‬للتعامل مع المستودع ّ‬
‫ّ‬ ‫بهذا نكون قد غ ّ‬
‫ةينا األوامر‬
‫بنا)‪ ،‬و سنقوم في الفصل القادم بشرح ايفية التعامل مع مستودع بعيد مستعر ين منصة ‪GitHub‬‬
‫ةيت عن د الح ديد ع ن ‪GitHub‬‬
‫غالبية ما سنغ ّ‬
‫ّ‬ ‫أن‬
‫منصات ‪ git‬البعيدة‪ ،‬مع اإلشارة إلى ّ‬
‫كمثال على ّ‬
‫المنصات الشهيرة مثل ‪ BitBucket‬أو ‪.GitLab‬‬ ‫ّ‬ ‫ينةبق على جميع‬

‫‪26‬‬
‫الفصل الثالد‬

‫مدخل إلى ‪GitHub‬‬

‫‪27‬‬
‫‪ git‬أداة عمل ّ‬
‫موزع ‪Distributed‬‬
‫‪ git‬في األصل لتت يح ألعض اء ف رق العم ل المس اهمة بش لل مس ّ‬
‫تقل تمام اً بحي د يمل ك ا ل‬ ‫صمم‬
‫ّ‬
‫الخاصة ‪ clone‬من المستودع الخ اص بالمش روع ال ذي ي تم العم ل‬
‫ّ‬ ‫عضو من أعضاء الفريق نسختت‬
‫ثم عند الحاجة لدم المساهمات القادمة من مساهمين مختلفين يعملون على أكثر م ن جه از‬‫عليت‪ّ ،‬‬
‫يملن االعتماد على مس تودع بعي د ‪ Remote‬وا د أو أكث ر يل ون بمثاب ة المص در الموث وق للش يفرة‬
‫اصةال اً ‪ Source of truth‬م ع أن ت ف ي نهاي ة المة اف م ا ه و ّإال نس خة ‪ Clone‬م ن المس تودع‬
‫نفست‪.‬‬
‫المنص ات أش هرها ‪ GitHub‬و ‪ BitBucket‬و‬
‫ّ‬ ‫لتنظ يم ه ذه العملي ة و تس هيلها ظه رت مخموع ة م ن‬
‫مفصل‪.‬‬
‫‪ GitLab‬و سنقوم في هذا الفصل بالحديد عن ‪ GitHub‬بشلل ّ‬

‫تنبيت‪ :‬اثي اًر م ا يس تعمل المبت دئون ‪ GitHub‬لإلش ارة إل ى ‪ git‬أو العل ‪ ،‬م ع ّأنهم ا ش يئان مختلف ان‬
‫توخي الد ّقة عند استعمال المصةلحات‪.‬‬
‫تماماً تماماً اما سبق و أو حنا‪ ،‬لذلك أرجو ّ‬

‫تسجيل حساب جديد في ‪GitHub‬‬


‫تس خيل الحس اب ف ي ‪ GitHub‬بس يط و مباش ر و ا ل م ا تحتاج ت ه و االنتق ال إل ى الموق ع‬
‫‪ github.com‬ث ّم الض غط عل ى زر ‪ sign up‬ث ّم تق وم بم لء النم وذج و تس خيل الحس اب بش لل‬
‫تقلي دي‪ ،‬و رّم ا تك ون التوص ية‬
‫الو ي دة الت ي أنص ح به ا هن ا ه ي‬
‫عن وان البري د‬ ‫تس خيل الحس اب ب نف‬
‫ال ذي اس تخدمناه ف ي تهيئ ة ‪ git‬ف ي‬
‫األول‪.‬‬
‫الفصل ّ‬

‫‪28‬‬
‫إنشاء مستودع على ‪GitHub‬‬
‫بعد تسجيل الحساب يمكننا إنشاء مستودع على ‪ GitHub‬مباشرة من خالل اختيار ‪Create new‬‬
‫‪ repository‬و مأل تفاصيل المستودع (اسم و وصف ‪ ..‬إلخ) كما تبين الصورة أدناه‪.‬‬

‫عاماً ‪ ،Public‬ي د‬
‫خاصاً ‪ ،Private‬أو ّ‬‫أهم خيار رّما في هذه الشاشة هو خيار جعل المستودع ّ‬ ‫ّ‬
‫أن جع ل المس تودع عام اً ‪ Public‬يعن ي ّأن ت أص بح متا اً لك ل الن او لالط الع علي ت‪ ،‬و نس خت‪ ،‬و‬‫ّ‬
‫المساهمة فيت تّى إذا لم تضبط بعض إعدادات الحماية‪.‬‬
‫اآلن نضغط على زر ‪ Create repository‬إلتمام إنشاء المستودع البعيد على ‪ GitHub‬و خالل‬
‫زمن ال يذار سننتقل آلياً إلى صفحة المستودع ال ذي قمن ا بإنش ائت‪ ،‬و لع ّل أه ّم م ا ف ي الص فحة ف ي‬
‫ه ذه المر ل ة ه و راب ط المس تودع البعي د ال ذي يظه ر ف ي الص ورة أدن اه و ال ذي سنس تعملت بع د قلي ل‬
‫للتو‪.‬‬
‫لمزامنة مستودعنا المحلّي الذي أعددناه سابقاً‪ ،‬مع المستودع البعيد الذي أنشأناه ّ‬

‫‪29‬‬
‫تعريف المستودع البعيد محليّا‬
‫لمزامنة المستودع المحلّي الذي أعددناه في فقرة سابقة على اسو نا الشخصي‪ ،‬مع المستودع البعيد‬
‫محلي اً‪ ،‬و ي تم ذل ك‬
‫ّ‬ ‫من المس تودعات البعي دة‬ ‫الذي أنشأناه للت ّو عل ى ‪ GitHub‬نحت اج إل ى تعريف ت‬
‫من خالل األمر ‪ git remote‬اما يلي‪:‬‬
‫>‪git remote add <remote-name> <github-repo-url‬‬

‫سنسمي ب ت المس تودع البعي د (ع ادة يس ّمى ‪،)origin‬‬


‫ّ‬ ‫يعبر ‪ remote-name‬عن االسم الذي‬
‫يد ّ‬
‫يعبر ‪ github-repo-url‬عن رابط المستودع البعيد الذي رأيناه في الفقرة السابقة‪ ،‬و إل افة‬
‫بينما ّ‬
‫مستودعنا البعيد إلى المحلّي يصبح األمر‪:‬‬
‫‪git remote add origin https://github.com/MukhtarSayedSaleh/git-book.git‬‬

‫أن‬
‫و اآلن يملنن ا اس تعراأ المس تودعات البعي دة م ن خ الل األم ر ‪ git remote -v‬للتأك د م ن ّ‬
‫المستودع أ يف بشلل صحيح اما يظهر في الصورة أدناه‪.‬‬

‫إرسال تعديالتنا المحليّة إلى المستودع البعيد ‪Push‬‬


‫المحلي ة إل ى‬
‫ّ‬ ‫يص ةلح ف ي ‪ git‬عل ى اس تخدام الفع ل دف ع ‪ push‬للتعبي ر ع ن إرس ال التع ديالت‬
‫أن نزامنها مع المستودع البعيد من خالل‬
‫المستودع البعيد‪ ،‬و اثي اًر ما يقال "ندفع التعديالت" بمعنى ّ‬
‫األمر‪.push‬‬

‫‪30‬‬
‫للتو‪ ،‬ل ذلك‬
‫ّ‬ ‫اآلن مستودعنا البعيد ‪ origin‬و الموجود على ‪ GitHub‬ال يحوي ّأية ملفات اونت أنش‬
‫محلياً معت من خالل تنفيذ األمر ‪( git push origin‬بمعن ى ّأنن ا‬
‫ّ‬ ‫يملننا مزامنة التعديالت الموجودة‬
‫المحلية إلى المستودع البعيد ذي االسم ‪ )origin‬اما في الصورة أدناه‪.‬‬
‫ّ‬ ‫سندفع التعديالت‬

‫بمخرد تنفيذ األمر ستظهر الملفات على ‪ GitHub‬اما تظهر لقةة الشاشة أدناه‪.‬‬
‫ّ‬ ‫و‬

‫‪31‬‬
‫تعديل الملفات في ‪ GitHub‬مباشرة‬
‫من الموق ع و دون الحاج ة‬ ‫يت يح ‪ GitHub‬لم ن يرغ ب واجه ة وي ب لتع ديل الملف ات مباش رة‬
‫من ‪ GitHub‬امس اهمة مباش رة‬ ‫لمغادرت ت‪ ،‬و بحي د ي تم ف ي المس اهمات (التع ديالت) الت ي ت تم‬
‫على المستودع البعيد‪ ،‬و لتخر ة ذلك نضغط على أ د الملف ات ث م نخت ار أم ر التع ديل الظ اهر ف ي‬
‫الصورة أدناه‪.‬‬

‫ثم نقوم بإجراء بعض التعديالت و نخت ار الحف ي‪ ،‬و س يةلب من ا ‪ GitHub‬إدخ ال رس الة المس اهمة‬
‫ّ‬
‫اأنن ا قمن ا ب ذلك‬
‫المناس بة (‪ )Commit message‬و ف ي التع ديل امس اهمة جدي دة ‪ Commit‬و ّ‬
‫من خالل األمرين ‪ git add‬و ‪ git commit‬اما نفعل عادة!‬

‫‪32‬‬
‫جلب تعديالت المستودع البعيد إلى المستودع المحلّي ‪Pull‬‬
‫يصةلح في ‪ git‬على استخدام الفعل سحب ‪ pull‬للتعبير عن طلب التع ديالت البعي دة و جلبه ا إل ى‬
‫أن ن زامن المس تودع المحلّ ي م ع‬
‫المس تودع المحلّ ي‪ ،‬و اثي اًر م ا يق ال "نس حب التع ديالت" بمعن ى ّ‬
‫عل ى المس تودع البعي د م ن قب ل زم الء العم ل‪ ،‬و لتخر ة ذل ك فل نقم بخل ب‬ ‫التح ديثات الت ي دفع‬
‫التع ديل ال ذي أجرين اه عل ى المس تودع البعي د (مس تودع ‪ )GitHub‬ف ي الفق رة الس ابقة إل ى المس تودع‬
‫المحلّي و ذلك من خالل تنفيذ األمر ‪ git pull‬اما تو ّ ح الصورة أدناه‪.‬‬

‫ثمة تعديالت على المستودع البعي د ل م ي تم س حبها بع د‪ ،‬فل ن يس مح ل ك‬


‫ملحوظة‪ :‬أ ياناً‪ ،‬و إذا اان ّ‬
‫‪ git‬بالقيام بعمل دفع ‪ push‬و سيةلب منك سحبها أوالً‪ ،‬و ق د تح دث أثن اء ذل ك تعار ات تتةلّ ب‬
‫األسلوب الذي استعر ناه في الفصل الما ي‪.‬‬ ‫الحل بنف‬

‫إنشاء الفروع ‪ Branches‬في منصة ‪GitHub‬‬


‫نس تةيع إنش اء ف رع جدي د للمش روع ال ذي نعم ل علي ت ف ي منص ة ‪ GitHub‬بال دخول إل ى المس تودع‬
‫ثم اتابة اسم الفرع الخديد مع الحرص‬
‫البعيد الخاص بنا و النقر على زر الفرع الرئيسي ‪ّ ،master‬‬
‫على اتابة اسم يصف الفرع و الهدف منت‪ ،‬ثم ننقر على زر ‪:Create Branch‬‬

‫‪33‬‬
‫اآلن و ص ار نش ةاً‪ ،‬و نس تةيع معرف ة أي الف روع‬ ‫ينبغ ي للف رع ‪ test-branch‬أن يل ون ق د أُنش‬
‫نحن فيها بالنظر إلى زر الفرع اما في الصورة أدناه‪ ،‬يد نرت أنت يذار أننا في الفرع ‪master‬‬

‫مخطط عمل جيت هب ‪GitHub Workflow‬‬


‫ألن ‪ git‬مرنة بحيد ال تفرأ على مستخدمها أي ة قي ود ف ي م ا يتعل ق بليفي ة اس تخدامها و توظيفه ا‬
‫ّ‬
‫لعل أشهرها‬
‫بعض الشراات بعمل معايير ‪ standards‬الستخدام ‪ ،git‬و ّ‬ ‫من فريق العمل‪ ،‬قام‬
‫إملاني ات ‪git‬‬
‫ّ‬ ‫يرا ز عل ى توظي ف‬
‫ه و مخةة ات عم ل ‪ GitHub‬أو ‪ GitHub Workflow‬و ال ذي ّ‬
‫و ‪ GitHub‬ااف ة للعم ل بش لل معي اري ف ي ف رق العم ل بحي د ال يحت اج المس اهمون الخ دد أو‬
‫الموظفون الخدد إلى اثير من الشرح للبدء بالمساهمة الفعلية في المشاريع‪.‬‬
‫يراز أسلوب العمل هذا على االستخدام الملثّف للفروع بحيد يم ّلن الفرق م ن اختب ار التع ديالت و‬
‫المزاي ا الخدي دة بحري ة و نش ر البرمخي ات ‪ deployment‬بانتظ ام‪ ،‬و فك رة عم ل ه ذا المخة ط ام ا‬
‫يلي‪:‬‬

‫‪34‬‬
‫‪ )1‬إنشاء فرع جدي د‪ :‬ينش عض و الفري ق فرع اً جدي داً به دف ع دم الت أثير عل ى الف روع األخ رت‬

‫تقرة‪ ،‬ع ادة تك ون الف روع المس ّ‬


‫تقرة بأس ماء ‪ master‬ال ذي يس تعمل للبيئ ة اإلنتاجي ة‬ ‫المس ّ‬
‫مان الخ ودة‬ ‫‪ production‬و ‪ develop‬ال ذي يس تعمل لبيئ ات التة وير‪ ،‬أو اختب ارات‬
‫‪ QA‬أو تخارب العمالء المب ّلرة ‪.staging‬‬
‫من الف رع ال ذي‬ ‫‪ )2‬إيداع المساهمات‪ :‬يقوم عضو الفريق بإيداع المساهمات الخاصة بمهمت ت‬
‫أنشأه في الخةوة السابقة‪.‬‬
‫‪ )3‬ف تح طل ب س حب ‪ :Pull request‬ف ي ‪ GitHub‬طلب ات الس حب ‪ Pull Request‬ه ي‬
‫ةلب مراجعة المس اهمات م ن قب ل وا د أو أكث ر م ن أعض اء الفري ق و‬
‫عملية دم معّلقة تت ّ‬
‫‪Merge‬‬ ‫الموافق ة عليه ا قب ل أن ي تم دمخه ا‪ ،‬و ف ي بع ض البيئ ات تس ّمى طل ب دم‬
‫أن عضو الفريق انتهى من المساهمات في فرع ت و اآلن‬
‫‪ – Request‬و المقصود بها هنا ّ‬
‫يةلب من فريقت الموافقة على دمخها مع فروع المشروع المستقرة بهدف نشرها‪.‬‬
‫‪ : Code‬تابع ة للمر ل ة الس ابقة ي د يق وم أعض اء الفري ق‬ ‫‪ )4‬مر ل ة المراجع ة ‪Review‬‬
‫اآلخ رون (أو قادت ت) بمراجع ة المس اهمات الت ي طل ب زم يلهم دمخه ا‪ ،‬و ع ادة م ا تح دث‬
‫نقاشات مفيدة و إيخابية هنا لتحسين جودة المساهمات‪.‬‬
‫‪ )5‬مر لة الدم و النشر‪ :‬يتم دم الفرع المةلوب و نشره ‪ Deploy‬بشلل آلي أو يدوي‪.‬‬

‫خدمة ‪ GitHub Pages‬الستضافة صفحات الويب‬


‫تت يح منص ة ‪ GitHub‬خدم ة استض افة ص فحات الوي ب الموج ودة ف ي مس تودع بعي د مباش رة عل ى‬
‫‪ GitHub‬و ذل ك م ن خ الل إنش اء مس تودع ع ام جدي د و تس ميتت باس م ‪username.github.io‬‬
‫يد أن ‪ username‬هو اسم المستخدم الخاص بك‪.‬‬
‫ألي ة ص فحات وي ب إل ى ه ذا المس تودع البعي د س تكون ه ذه الص فحات‬
‫بهذه الةريقة و بمخ ّرد دفع ك ّ‬
‫اأنها مستضافة على ‪ web server‬و برابط مباشر من ‪ GitHub Pages‬يملنك‬
‫متا ة للعموم و ّ‬
‫هب في إعدادات المشروع‪.‬‬ ‫العثور عليت من تبويب صفحات جي‬

‫‪35‬‬
‫االشتقاق في ‪GitHub‬‬
‫تت يح منص ة ‪ GitHub‬لمس تخدميها اش تقاق مس تودعات جدي دة خاص ة أو عام ة م ن مس تودعات‬
‫بناء‬
‫العامة‪ ،‬و ذلك بواسةة األمر ‪ fork‬الذي يسمح لك بالبدء بمستودع جديد ً‬
‫ّ‬ ‫المستخدمين اآلخرين‬
‫عاماً‪.‬‬
‫على ما تم بالفعل في مستودع مشروع آخر سواء اان المشروع اآلخر مملوااً لك أو ّ‬
‫أ د األوام ر ف ي نظ ام ‪ ،git‬ب ل ه ي خاص ية توفره ا منص ة ‪ GitHub‬و‬ ‫على أن ‪ fork‬نفسها ليس‬
‫المنصات المشابهة‬
‫ثم الضغط على زر ‪Fork‬‬
‫الشتقاق مستودع ما يملنك بلل بساطة الدخول إلى المستودع المةلوب ّ‬
‫الذي تو ّ حت الصورة التالية‪.‬‬

‫استنساخ المستودعات ‪ Repositories Clonning‬في ‪GitHub‬‬


‫لق د قمن ا ف ي الفق رة الس ابقة بإنش اء اش تقاقنا الخ اص م ن مس تودع ‪ Linux‬مفت وح المص در ف ي‬
‫‪ ،GitHub‬غير أن ذلك المستودع ال يوجد إال على منصة ‪ GitHub‬الياً‪ ،‬و من البديهي ّأننا نري د‬

‫الي اً مواص لة العم ل علي ت ف ي مس تودع ‪ git‬المحل ي ا ون المح ّرر ّ‬


‫النص ي الموج ود ف ي ‪GitHub‬‬

‫‪36‬‬
‫للتةوير الحقيقي‪ ،‬و لهذا تتيح ‪GitHub‬‬ ‫مناسب فقط للتعديالت و المساهمات البسيةة جداً و لي‬
‫المنصات المشابهة ميزة االستنساخ ‪ Clonning‬التي تتيح استنساخ مستودع بعي د إل ى‬
‫ّ‬ ‫و غيرها من‬
‫محلياً سيحوي‬
‫ّ‬ ‫الحاسب المحلي‪ ،‬و يد نقول استنساخ فنحن نعني ذلك ألن المستودع الذي سينشأ‬
‫من المستودع األصلي‪.‬‬ ‫كامل المساهمات و األفرع التي تم‬
‫يتم االستنساخ من خالل األمر ‪ git clone‬ثم تمرير راب ط المس تودع الم راد استنس اخت‪ ،‬و للحص ول‬
‫على الرابط يملننا الضغط على زر ‪ code‬في ‪.GitHub‬‬

‫‪37‬‬
‫تنبيه هام‪ :‬قبل االستنساخ تأ ّكد من قراءة مل ف الت رخيص ‪ License file‬فكثي اًر م ا يلخ أ المة ورون‬
‫(المبرمخون) الستعمال ملتبات‪ ،‬أو أجزاء من ملتبات‪ ،‬أو ت ى أس ةر مح ددة م ن ملف ات‪ ،‬س بق و‬
‫إ دت رخص البرمخيات مفتو ة المص در دون انتب اه لةبيع ة الت رخيص المص ا ب‬ ‫أن نشرت تح‬
‫ألصل الشيفرة معادة االستخدام و انعلاس ات ذل ك عل ى المن ت ال ذي يعم ل علي ت المة ّور‪ ،‬ي د أن‬
‫يحملك عواقب و يضعك تح التزامات قانونية‪ ،‬نذار منها‪:‬‬ ‫ذلك قد ّ‬
‫رخص ة معين ة أن ك‬ ‫الرخصة‪ :‬ق د يعن ي اس تخدامك لش يفرة تح‬ ‫نف‬ ‫‪ - ١‬نشر منتخك النهائي تح‬
‫نف‬ ‫مخب ر ‪-‬بالق انون‪ -‬عل ى نش ر منتخ ك النه ائي عن دما يخه ز بش لل مفت وح المص در و تح‬
‫الرخصة األصلية‪.‬‬
‫رخصة معينة أن ك مخب ر ‪-‬بالق انون‪-‬‬ ‫‪- ٢‬منع االستخدام التخاري‪ :‬قد يعني استخدامك لشيفرة تح‬
‫أال تستخدم منتخك النهائي بشلل تخاري أو ر حي إطالقاً!‬
‫‪- ٣‬منع االشتقاق‪ :‬بمعنى الس ماح لرخ رين باس تعمال ه ذا المن ت "كم ا ه و" دون إتا ة البن اء علي ت‬
‫أيضاً‪.‬‬ ‫أو تعديلت أو ترجمتت ‪ ...‬إلو‪ ،‬و قد يلون لهذا األمر أثر رجعي على منتخك أن‬
‫‪- ٤‬إلزامي ة النس بة‪ :‬بحي د تك ون مخب اًر بالق انون عل ى ذا ر اس م الش خص أو الكي ان مال ك األج زاء‬
‫المقتبسة أو الملتبات المستعملة‪.‬‬
‫لذلك في المرة القادمة و قبل أن تقوم ب"نسو‪-‬لصق" ألي شيفرة برمخية تخدها على االنترن ‪ ،‬تأكد‬
‫هامة قد يخهلها الكثيرون‪.‬‬
‫من قراءة الترخيص بشلل جيد لما لذلك من التزامات قانونية ّ‬

‫‪38‬‬
‫الفصل الرابع‬

‫مواضيع متقدمة في ‪git‬‬

‫‪39‬‬
‫ملف التجاهل ‪.gitignore‬‬
‫الشك أنت ستكون أجزاء أو ملفات من المش روع ال ذي تعم ل علي ت ال تري د مش اراتها م ع غي رك مم ن‬
‫يةلع على شيفرة المشروع‪ ،‬و من أمثلة تلك الملفات‪:‬‬
‫• ملفات السخالت ‪.log files‬‬
‫• الملفات المؤقتة ‪.temporary files‬‬
‫• الملفات المخفية‪.‬‬
‫• الملفات الشخصية‪.‬‬
‫• ملفات الكلمات السرّية و مفاتيح المصادقة‪.‬‬
‫الحساسية‪.‬‬
‫ّ‬ ‫• غير ذلك من الملّفات ذات‬
‫تستةيع أن تةلب من ‪ git‬أن يتخاهل تلك الملفات أو األجزاء من المشروع الت ي ينبغ ي ل ت تخاهله ا‬
‫باس تخدام مل ف ‪( .gitignore‬ال ي أن اس م المل ف يب دأ بنقة ة و بالت الي س يلون مخفي اً بش لل‬
‫و م اك أو إو) و ل ن يتعق ب ‪ git‬الملف ات و المخل دات المح ددة ف ي‬ ‫افت ار ي ف ي أنظم ة لي نك‬
‫‪ .gitignore‬رغم أنت يتتبع ملف ‪ .gitignore‬نفست‪.‬‬
‫يخب أن يتم إنشاء الملف ‪ .gitignore‬في أعل ى مس توت م ن مخل دات المش روع (ف ي المخل د الخ ذر‬
‫‪ root‬بتعبير آخر)‪ ،‬ثم و بعد إنشاء الملف نستخدم أ ّي محرر نص ي‪ ،‬و نض يف القواع د الت ي تح دد‬
‫ألننا قد نكون ف ي االت نحت اج‬‫الملفات التي نرغب بتخاهلها‪ ،‬و ين نقول قواعد فنحن نعني ذلك ّ‬
‫فيه ا لتخاه ل الكثي ر م ن الملف ات دفع ة وا دة اتل ك الت ي له ا امت داد مح دد م ثالً أو الت ي تة ابق‬
‫معيناً ‪ ...‬إلو‪ ،‬و فيمايلي القواعد التي نستةيع تعريفها‪:‬‬
‫أسماؤها نمةاً ّ‬
‫أمثلة‬ ‫الشرح ‪ -‬المةابقات‬ ‫النمط‬

‫لألسةر الفارغة أي تأثير ف ي‬ ‫لي‬


‫ملف ‪.gitignore‬‬

‫‪40‬‬
‫لألس ةر الت ي تب دأ بإش ارة ‪#‬‬ ‫لي‬ ‫‪# text comment‬‬
‫أي ت أثير ف ي مل ف ‪ .gitignore‬و‬
‫إنما تستخدم لترك تعليقات لتو يح‬
‫المةورين عادة‬
‫ّ‬ ‫شيء ما من قبل‬

‫جمي ع ملف ات ‪ name‬و مخل دات ‪/name.log‬‬ ‫‪name‬‬


‫‪ ،name‬و الملف ات و المخل دات ‪/name/file.txt‬‬
‫‪/lib/name.log‬‬ ‫التي في أي مخلد ‪name‬‬

‫االنته اء بالش رطة المائل ة ‪/name/file.txt slash‬‬ ‫‪name/‬‬


‫يش ير إل ى أن المةل وب مةابقت ت ‪/name/log/name.log‬‬
‫ه و المخل د الم ذاور‪ ،‬و ية ابق عدم وجود تةابق‪:‬‬
‫‪/name.log‬‬ ‫جميع الملفات و المخل دات ف ي أي‬
‫مخلد ‪name‬‬

‫جمي ع الملف ات الت ي فيه ا ‪/name.file‬‬ ‫‪name.file‬‬


‫‪/lib/name.file‬‬ ‫‪name.file‬‬

‫االبت داء بالش رطة المائل ة يش ير ‪/name.file‬‬ ‫‪/name.file‬‬


‫عدم وجود تةابق‪:‬‬ ‫إل ى أن ال نمط ية ابق الملف ات‬
‫‪/lib/name.file‬‬ ‫الموجودة في المخلد الخذر فقط‪ ،‬و‬
‫هو مخلد ‪root‬‬

‫‪41‬‬
‫يح دد ال نمط الملف ات ف ي مخل دات ‪/lib/name.file‬‬ ‫‪lib/name.file‬‬
‫عدم وجود تةابق‪:‬‬ ‫بعينه ا‪ ،‬لتك ون منس و ة دوم اً إل ى‬
‫‪name.file‬‬ ‫المخل د الخ ذر ت ى ل و ل م نب دأ‬
‫بالشرطة الدالة على المخلد الخذر‪/test/lib/name.file ،‬‬
‫و هي الشرطة المائلة‬

‫االبت داء بعالمت ي النخم ة ** قب ل ‪/lib/name.file‬‬ ‫‪**/lib/name.file‬‬


‫الش رطة المائل ة يح دد أن ال نمط ‪/test/lib/name.file‬‬
‫ية ابق أي مخل د ف ي المس تودع‪ ،‬و‬
‫المخلد الخذر فقط‬ ‫لي‬

‫جمي ع مخل دات ‪ name‬و أي ‪/name/log.file‬‬ ‫‪**/name‬‬


‫ملف ات أو مخل دات ف ي أي مخل د ‪/lib/name/log.file‬‬
‫‪/name/lib/log.file‬‬ ‫‪name‬‬

‫جمي ع مخل دات ‪ name‬و الملف ات ‪/lib/name/log.file‬‬ ‫‪/lib/**/name‬‬


‫و المخل دات ف ي أي مخل د ‪/lib/test/name/log.file name‬‬
‫‪/lib/test/ver1/name/log.file‬‬ ‫داخل مخلد ‪lib‬‬
‫عدم وجود تةابق‪:‬‬
‫‪/name/log.file‬‬

‫‪/name.file‬‬ ‫جميع الملفات ذات االمتداد ‪.file‬‬ ‫‪*file.‬‬


‫‪/lib/name.file‬‬

‫‪42‬‬
‫‪/lastname/log.file‬‬ ‫جمي ع المخل دات الت ي تنته ي ب‬ ‫‪*name/‬‬
‫‪/firstname/log.file‬‬ ‫‪name‬‬

‫تة ابق العالم ة ح محرف اً و ي داً ‪/names.file‬‬ ‫‪name?.file‬‬


‫‪/name1.file‬‬ ‫غير محدد‪.‬‬
‫عدم وجود تةابق‪:‬‬
‫‪/names1.file‬‬

‫تة ابق محرف اً و ي داً ف ي نة اق ‪/names.file‬‬ ‫‪name[a-z].file‬‬


‫مح دد‪ ،‬و يل ون المح رف ف ي تل ك ‪/nameb.file‬‬
‫الحال ة رف اً م ن ‪ a‬ت ى ‪ ،z‬أو عدم وجود تةابق‪:‬‬
‫‪/name1.file‬‬ ‫رقماً‬

‫ية ابق محرف اً وا داً ف ي مخموع ة ‪/namea.file‬‬ ‫‪name[abc].file‬‬


‫مح ددة م ن المح ارف‪ ،‬و ف ي تل ك ‪/nameb.file‬‬
‫الحالة يلون المحرف أ د الحروف عدم وجود تةابق‪:‬‬
‫‪/names.file‬‬ ‫الثالثة ‪ a‬أو ‪ b‬أو ‪c‬‬

‫داً باس تثناء ‪/names.file‬‬ ‫ية ابق محرف اً وا‬ ‫‪name[!abc].file‬‬


‫المحارف المح ددة ف ي مخموع ة‪ ،‬و ‪/namex.file‬‬
‫عدم وجود تةابق‪:‬‬ ‫هي ‪ a-b-c‬في تلك الحالة‬
‫‪/namesb.file‬‬

‫‪/name.file‬‬ ‫جميع الملفات ذات االمتداد ‪.file‬‬ ‫‪*.file‬‬

‫‪43‬‬
‫‪/lib/name.file‬‬

‫تثناء‪ ،‬و ‪/name/file.txt‬‬


‫تحدد العالمة ! نفي اً أو اس ً‬ ‫‪name/‬‬
‫‪ !name/secret.log‬تة ابق جمي ع الملف ات و المخل دات ‪/name/log/name.log‬‬
‫ف ي أي مخل د ‪ name‬باس تثناء عدم وجود تةابق‪:‬‬
‫‪/name/secret.log‬‬ ‫‪name/secret.log‬‬

‫تثناء‪ ،‬و ‪/log.file‬‬


‫تحدد العالمة ! نفي اً أو اس ً‬ ‫‪*.file‬‬
‫تةابق جميع الملفات ذات االمتداد ‪/lastname.file‬‬ ‫‪!name.file‬‬
‫عدم وجود تةابق‪:‬‬ ‫‪ .file‬باستثناء ‪name.file‬‬
‫‪/name.file‬‬

‫افة أنم اد جدي دة بع د النف ي ‪log.file‬‬ ‫إ‬ ‫‪*.file‬‬


‫سيعيد تخاه ل مل ف ت م تخاهل ت م ن ‪/name/log.file‬‬ ‫‪!name/*.file‬‬
‫قب ل‪ .‬جمي ع الملف ات ذات االمت داد عدم وجود تةابق‪:‬‬ ‫*‪junk.‬‬
‫‪/name/junk.file‬‬ ‫‪ .file‬باس تثناء تل ك الت ي ف ي مخل د‬
‫‪ ،name‬إال إذا ا ان اس م المل ف‬
‫‪junk‬‬

‫فائ دة‪ :‬يوج د موق ع لةي ف ج داً اس مت ‪ https://gitignore.io‬يعة ي قوال ب ج اهزة لملف ات‬
‫جر وه!‬
‫‪ .gitignore‬مناسبة لكل لغة برمخة أو إطار عمل شهير لتسريع إعداد ما يخب تخاهلت‪ّ .‬‬

‫‪44‬‬
‫السفر في الزمن مع ‪git checkout‬‬
‫أن نعي د الملف ات الموج ودة‬
‫نستةيع باستخدام ‪ git‬أن نعيد عقارب الساعة إلى الوراء مخازياً‪ ،‬بمعنى ّ‬
‫فيه ا لحظ ة مس اهمة م ا تمام اً‪ ،‬و ذل ك م ن خ الل األم ر ‪git‬‬ ‫ف ي المس تودع إل ى الحال ة الت ي اان‬
‫معرف المساهمة المةلوب العودة إليها‪.‬‬
‫ثم ذار ّ‬
‫‪ّ checkout‬‬
‫>‪git checkout <commit-id‬‬

‫األمر ‪Reset‬‬
‫متقدمة للتراجع عن مساهمة أو أكث ر قمن ا به ا‪ ،‬و قلن ا‬
‫األول ّأنت توجد طريقة ثانية ّ‬
‫ذارنا في الفصل ّ‬
‫للح ديد عنه ا‪ ،‬أال و ه ي طريق ة األم ر‬ ‫ّأنن ا س نغةيها ف ي الفص ل المتق ّدم‪ ،‬و اآلن ق د ان الوق‬
‫‪.reset‬‬
‫ُيستخدم األم ر ‪ reset‬عن د الرغب ة ف ي إرج اع المس تودع ف ي الت اريو إل ى مس اهمة س ابقة و ل ت ثالث ة‬
‫أنماد‪:‬‬
‫‪ .1‬النمط الخشن ‪ :--hard‬و هو أخةر األنماد يد ّأنت يعيد المستودع إلى مساهمة س ابقة‬
‫بعد تلك المساهمة‪.‬‬ ‫مع إلغاء جميع المساهمات و التغييرات التي دث‬
‫>‪git reset --hard <commit-id‬‬

‫‪ .2‬النمط الناعم ‪ :--soft‬و هو شبيت بالسابق إال ّأنت ال يلغ ي المساهمات التالية‪ ،‬بل يبقيها و‬
‫و تم عمل ‪ add‬لها إنّما لم يتم عمل ‪( commit‬و لهذا اسمت سوف )‪.‬‬ ‫كأنّها تم‬
‫>‪git reset --soft <commit-id‬‬

‫‪ .3‬النمط الوسةي ‪ :--mixed‬شبيت بالنمط الناعم مع فارق ّأنت يبقي التغييرات و ّ‬


‫اأنها دث‬
‫تسخل في تاريو المستودع بعد‪ ،‬و بالتالي إذا أردت اال تف ا" به ا فيخ ب أن تق وم‬
‫للتو و لم ّ‬
‫ّ‬
‫بعمل ‪ git add‬ثم ‪.git commit‬‬
‫>‪git reset --mixed <commit-id‬‬

‫‪45‬‬
‫اعتراف‪ :‬شخصياً فكثي اًر ما أستعمل هذا النمط للتراجع عن بعض المساهمات التي أ ةر للقيام بها‬
‫على سبيل التخر ة أو ألسباب أخرت قبل االنتهاء الفعلي من العمل على ميزة ما‪.‬‬

‫ال أن تقوم بتحديد المس اهمة‬


‫بغض النظر عن النمط الذي تريد استخدامت فيخب ّأو ً‬
‫على ّأية ال‪ ،‬و ّ‬
‫معرفه ا ‪ Commit ID‬م ن خ الل األم ر ‪ git log‬أو‬
‫التي ترغ ب ف ي الع ودة إليه ا (م ن خ الل تحدي د ّ‬
‫‪.)gitk‬‬
‫تمث ل‬
‫التخيلي ان التالي ان م اذا يح دث عن د القي ام ب األمر ‪ git reset --hard‬ي د ّ‬
‫ّ‬ ‫يو ّ ح الش لالن‬
‫كل دائرة مساهمة ما ‪.commit‬‬

‫إذا اان في المستودع أر ع مساهمات اما يو ّ ح الشلل أعاله و أ ببنا العودة إلى المساهمة الثانية‬

‫فعلياً نتخّلى ع ن المس اهمتين الت اليتين و يص بح ش لل المس تودع الي اً‬
‫فإننا ّ‬
‫بشلل خشن ‪ّ --hard‬‬
‫كما في الشلل أدناه‪.‬‬

‫‪git‬‬ ‫ف ي موق ع‬ ‫ملحوظ ة‪ :‬أنص ح بش ّدة لم ن يرغ ب بفه م ‪ git‬ف ي العم ق أن يمض ي بع ض الوق‬
‫عم ا يق وم ب ت ا ل أم ر بش لل مرئ ي‪ ،‬و بالمناسههبة‪ ،‬هههذا‬
‫‪ visualization‬يد يعةيك تص ّو اًر ممت ا اًز ّ‬
‫الموقع هو مصدر الشكلين أعاله‪.‬‬

‫‪46‬‬
47
‫استخدام ‪commit --amend‬‬
‫‪git‬‬ ‫ؤخ اًر‪ ،‬و ه و م ا يتيح ت األم ر‬
‫أ يان اً و لس بب م ا ق د نرغ ب بتغيي ر م ا قمن ا بالمس اهمة ب ت م ّ‬
‫يغي ر المس اهمة األص ّلية و إنّم ا يخم ع ّأي ة‬
‫األم ر ال ّ‬
‫أن ه ذا ّ‬
‫‪ ،commit --amend‬م ع التنبي ت ّ‬
‫موج ودة الي اً ف ي بيئ ة اإلدراج ‪ staging environment‬م ع آخ ر مس اهمة و ينش م ن اليهم ا‬
‫ألن اس تخدامت يعن ي تغيي ر مع ّرف آخ ر مس اهمة ‪ commit ID‬و‬
‫الي اً‪ ،‬ن ذار ه ذا ّ‬
‫مس اهمة جدي دة ّ‬
‫لذلك وجب التنبيت‪.‬‬

‫‪ git blame‬حان وقت لوم أحد ما!‬


‫أ يان اً نرغ ب و لس بب م ا بمعرف ة م ن ه و المس اهم ال ذي تس بب بتغيي ر س ةر م ا م ن مل ف م ا أو‬

‫مخموعة أسةر‪ ،‬يتيح لنا ‪ git‬ذلك من خالل األمر ‪ git blame‬و أرت تس ميتت طريف ة ّ‬
‫ألن ‪blame‬‬
‫السلبية إللقاء اللوم على أ د ما‪ .‬على ّأية ال‪ ،‬صيغة األمر‬
‫ّ‬ ‫باللغة اإلنخليزية تستعمل في الحاالت‬
‫هي‪:‬‬
‫>‪git blame -L <start>,+<end> -- <file-path‬‬

‫أن ‪ start‬ه و رق م الس ةر‪ ،‬و ‪ end‬ه و ع دد األس ةر التالي ة ف ي ال ّأنن ا نرغ ب باالس تعالم‬
‫يد ّ‬
‫س ة اًر وا داً‪ ،‬و ‪ file-path‬ه و مس ار المل ف ال ذي نس تعلم عن ت‪ ،‬تظه ر‬ ‫ع ن اتل ة أس ةر و ل ي‬
‫الصورة التالية المالمة الواقعة علي في تعديل السةر رقم ‪ ٣‬من الملف ‪.index.html‬‬
‫ّ‬

‫‪48‬‬
‫‪ git bisect‬متى حدث هذا؟‬
‫ف ي دوث مش للة م ا أو تغيي ر م ا‬ ‫أ ياناً نرغب و لس بب ما بمعرفة م ا ه ي المس اهمة الت ي تس بب‬

‫تحدياً‬
‫في المشروع الذي نعمل عليت‪ ،‬و في الة المشاريع الكبيرة ذات التاريو الةويل قد يش ّلل هذا ّ‬
‫إذا اان يعني مراجعة المساهمات وا دة وا دة‪.‬‬
‫ارزمي ة البح د الثن ائي ‪ Binary Search‬ف ي المس اهمات‬
‫آلي ة لتوظي ف خو ّ‬
‫ي ت وّفر ‪ّ git‬‬
‫لحس ن الح ّ‬
‫للوصول بشلل أسرع بلثير إلى المساهمة المةلو ة و تحديد آلية االستخابة لها‪.‬‬
‫مخ اني ف ي‬
‫إلكتروني اً و بش لل ّ‬
‫ّ‬ ‫وزع‬
‫الكتي ب عل ى ّني ة الص دقة و به دف أن ي ّ‬
‫و بم ا ّأنن ي أكت ب ه ذا ّ‬
‫نهاية المةاف‪ ،‬فسأخالف المعهود قليالً في مثل هذا السياق‪ ،‬و أ يلك إلى الفيديو التالي الذي يشرح‬
‫ألن المتعلّم لهذا األمر يحتاج أن يراه بشلل تفاعلي برأيي‪.‬‬
‫األمر بمنتهى الروعة و ذلك ّ‬

‫و اآلن‪ ،‬ماذا بعد؟‬


‫الق در الك افي‬ ‫لكنن ي أرت ّأنن ي غ ّ‬
‫ةي‬ ‫بتغةي ة ااف ة األوام ر الموج ودة ف ي ‪ّ ،git‬‬ ‫ال أزع م ّأنن ي قم‬
‫أم ا بقي ة أوام ر ‪ git‬ف يملن‬
‫ال ذي يس مح للم تعلّم الخدي د االس تفادة م ن ه ذه األداة ف ي عمل ت الي ومي و ّ‬
‫مبسط يشرح ال أمر من خ الل ال رابط الت الي‬ ‫الرجوع إلى الموقع الرسمي لألداة للحصول على شرح ّ‬
‫في ال الحاجة لذلك‪.‬‬
‫رددوا ف ي التواص ل مع ي ف ي‬
‫الكتي ب‪ ،‬أرج و أال تت ّ‬
‫ال ذي م ّن علين ا بإتم ام ه ذا ّ‬ ‫ش ل اًر لك م و الحم د‬
‫اتيبات أخرت قادمة بإذن ا‪.‬‬
‫الرغبة‪ ،‬و إلى اللقاء في ّ‬
‫ال ّ‬

‫تم بحمد ا‬
‫إسطنبول ‪ ١٠‬يونيو ‪٢٠٢٢‬‬

‫‪49‬‬
‫الفهرس‬

‫ّ‬
‫أساسيات ‪4 ............................................................................................... git‬‬
‫ه ‪git‬؟ ‪5 ......................................................................................................‬‬
‫ما ي‬
‫كيف نشأت ‪ git‬و لماذا؟ ‪5 .....................................................................................‬‬
‫لماذا تستخدم ‪git‬؟ ‪5 ...........................................................................................‬‬
‫تثبيت ‪6 ...................................................................................................... :git‬‬
‫المحل ‪7 ...................................................................................‬‬
‫ي‬ ‫تعريف حساب ‪git‬‬

‫البدء باستخدام ‪8 ........................................................................................... git‬‬


‫حاالت الملفات يف ‪8 ........................................................................................ git‬‬
‫مرحلة اﻹدراج ‪10 ..................................................................................... Staging‬‬
‫إيداع المساهمات ‪11 ........................................................................... Committing‬‬
‫إيداع نفس الملف ّ‬
‫مرة أخرى! ‪12 .............................................................................‬‬
‫االطالع عل سجل اﻹيداعات ‪13 .............................................................................‬‬
‫ر‬
‫التاجع عن عملية إيداع يف ‪15 .............................................................................git‬‬
‫التفريعات ‪17 .................................................................................... Branches‬‬
‫ه التفريعات ‪branches‬؟‪18 ...............................................................................‬‬
‫ما ي‬
‫إنشاء فرع جديد يف ‪18 ......................................................................................git‬‬
‫االنتقال إىل فرع آخر يف ‪19 ................................................................................. git‬‬
‫فرع اﻹصالحات الطارئة ‪22 ........................................................................Hot fixes‬‬
‫دمج الفروع يف ‪22 ...........................................................................................Git‬‬
‫حذف الفروع يف ‪23 ......................................................................................... git‬‬
‫تعارض عمليات الدمج ‪24 ................................................................. Merge conflicts‬‬
‫حل التعارض ‪25 ........................................................................... Conflict Resolve‬‬

‫‪50‬‬
‫مدخل إىل ‪27 ....................................................................................... GitHub‬‬
‫ّ‬
‫‪ git‬أداة عمل موزع ‪28 ........................................................................... Distributed‬‬
‫تسجيل حساب جديد يف ‪28 ........................................................................ GitHub‬‬
‫إنشاء مستودع عل ‪29 ................................................................................GitHub‬‬
‫ّ‬
‫محليا ‪30 ...........................................................................‬‬ ‫تعريف المستودع البعيد‬
‫ّ‬
‫المحلية إىل المستودع البعيد ‪30 ................................................... Push‬‬ ‫إرسال تعديالتنا‬
‫ر‬
‫مباشة ‪32 ........................................................................‬‬ ‫تعديل الملفات يف ‪GitHub‬‬

‫المحل ‪33 ......................................... Pull‬‬


‫ي‬ ‫جلب تعديالت المستودع البعيد إىل المستودع‬
‫إنشاء الفروع ‪ Branches‬يف منصة ‪33 ............................................................... GitHub‬‬
‫مخطط عمل جيت هب ‪34 ........................................................... GitHub Workflow‬‬
‫خدمة ‪ GitHub Pages‬الستضافة صفحات الويب ‪35 .....................................................‬‬
‫االشتقاق يف ‪36 ........................................................................................ GitHub‬‬
‫استنساخ المستودعات ‪ Repositories Clonning‬يف ‪36 .......................................... GitHub‬‬
‫مواضيع متقدمة يف ‪39 ................................................................................. git‬‬
‫ملف التجاهل ‪40 .................................................................................. .gitignore‬‬
‫السفر يف الزمن مع ‪45 .......................................................................... git checkout‬‬
‫األمر ‪45 ................................................................................................... Reset‬‬
‫استخدام ‪48 ............................................................................... commit --amend‬‬
‫غتي! ‪48 .................................................................‬‬
‫‪ git blame‬حان وقت لوم أحد ما ر‬
‫‪ git bisect‬ر‬
‫مت حدث هذا؟ ‪49 .................................................................................‬‬
‫و اآلن‪ ،‬ماذا بعد؟ ‪49 ............................................................................................‬‬

‫‪51‬‬

You might also like