ماهو Git & GitHub ؟
بقلم: غدير قلعص - أمل مير
أصبحنا نسمع كثيرًا عن أهمية Git و مشاركة أعمالنا و الأكواد عن طريق موقع GitHub. و حتى عند التقديم على فرص في المجال التقني, فإن من ضمن الأمور المهمة إرفاق حسابنا على GitHub.
بدايةً ماهو Git؟
يصادف في مشاريع الجامعة أو خارجها العمل ضمن فريق على أكواد, ويكون هناك صعوبة في متابعة التغييرات و كثرة الملفات المتناقلة بين أفراد المجموعة و ضياع الأكواد, لذلك أتى الحل *الرهيب* مايسمى بِــ Git , حيث يستطيع جميع أفراد الفريق العمل في ذات الوقت على جميع الملفات و التعديل عليها من غير ضياع أو فقدان لأي جزء من الأجزاء. ببساطة Git = حياة سهلة :")
أي أنه يُسهل عملية العمل على مشروع صغير أو كبير مع فريق أو بشكل فردي لمتابعة التغييرات. كما يمكنك وضع نسخة من المشروع أو بما يسمى بالمستودع داخل الجهاز مع خاصية التحديث المستمر. و هذا الخاصية تسمى بالمستودع المحلي (Local Repository) – سيتم توضيح النقطة هذه و كيفية عملها لاحقاً –
و أيضا وضع المستودع على منصة أخرى، و هو ما يسمى بالمستودع البعيد ( Remote Repository ) -. في معظم الحالات يتم تخزين هذا المستودع البعيد على خدمة استضافة البرمجيات مثل GitHub .
يأتي سؤال ماهو GitHub؟
دور GitHub في هذه العملية جوهري و يعتبر نقطة الوصل, حيث أن ملفات المشاريع تتم مشاركتها عن طريقه, و يتم التحكم به عن طريق Git و يتم أيضًا تخزين أكواد المشاريع التي تعمل عليها. كما يمكنك جعل المستودع ظاهر للجميع بحيث يمكنهم تحميل الملفات والتعديل عليها, أو يمكنك جعله شخصي فقط, كما يتم وضع مشاريع مفتوحة المصدر والتي يمكن المشاركة فيها و العمل عليها مع أشخاص لا تعرفهم.
إنشاء مستودع (Repository)خاص أو عام على GitHub:
المستودع هو الموقع الخاص بالمشروع والذي يحتوي على كل الملفات الخاصة بالمشروع بالإضافة إلى ملف التمهيدي (README) و الذي يتضمن توثيق المشروع وطريقة تشغيله. سنستعرض تفاصيل أكثر في نهاية المقال.
لإنشاء مستودع جديد، نقوم بفتح حساب GitHub، ثم اختيار Repositories، ثم New، كما هو موضح بصورة 1.
ستظهر صفحة مثل الموضحة في الصورة 2، تطلب بعض البيانات الأساسية للمشروع وهي:
اسم المشروع Repository name
وصف المشروع Description
- غير إلزامي ولكنه عنصر مهم، حيث يعطي نبذة مختصرة جدًا عن المشروع -
هل ترغب بإنشاء مستودع خاص Private أو عام Public؟
إذا كان المستودع عام، فبإمكان أي شخص الاطلاع على حسابك واستعراض ملفات المشروع وتنزيلها، أما إذا كان خاصًا، فلن يستطيع أي شخص استعراض ملفات المشروع إلا إذا كان من المساهمين في مستودع المشروع (Contributors). وبصفة عامة، لا يمكن لأي شخص التعديل على أي مستودع إلا إذا كان من المساهمين فيه سواءً كان هذا المستودع عامًا أو خاصًا.
إنشاء ملف تمهيدي مع المستودع (Initialize this repository with a README)
عند الضغط على مربع الخيار بجانب العبارة السابقة، سوف يُنشأ الملف التمهيدي (README) الذي يحتوي على اسم المشروع ووصفه المُضافان بأول خانتين. ليتم بعد ذلك التعديل على هذا الملف لتوضيح تفاصيل المشروع بشكل أوضح مع طريقة تشغيله. وسنتطرق لهذه المرحلة في الأقسام القادمة من هذه التدوينة.
عند النقر على Create repository ستظهر صفحة المستودع وستحتوي بعض الأوامر المطلوبة لرفع ملفات المشروع، أو يظهر ملف README في حال النقر على مربع إنشاء ملف تمهيدي.
التعامل مع الملفات
سنجد أن لدينا العديد من الطرق لإنشاء مستودع محلي (Local Repository)، والتعامل مع الملفات، ورفع الملفات إلى مستودع بعيد ( Remote Repository )، سنجد أن لدينا العديد من الطرق. ومن أشهر هذه الطرق الثلاثة التالية:
موجه الأوامر (Command prompt) في نظام ويندوز، أو الوحدة الطرفية (Terminal) في نظام ماك.
برنامج Git Bash
برنامج GitHub desktop
تعتمد الطريقتان الأولى على الأوامر (Commands)، بينما تعتمد الطريقة الثالثة على الواجهات والتعامل مع الأيقونات.
سنستعرض في هذا القسم كيفية العمل على git bash والتي لا تختلف كثيرًا عن الطريقة الأولى.
أولًا: نقوم بتنزيل برنامج Git
ثانيًا: بعد تثبيت و فتح البرنامج، نقوم بالانتقال إلى مسار المجلد الذي يحتوي على ملفات المشروع و ذلك عن طريق الأمر cd ، اختصارًا ل Change directory، متبوعًا بمسار المجلد. قد يتطلب منك الأمر في بعض الأحيان تغيير كل علامات \ الموجودة في المسار إلى / كما هو موضح في صورة 3.
لمعرفة مسار المجلد في نظام ويندوز، نقوم بفتح مجلد المشروع ثم نقوم بالنقر بزر الفأرة اليمين على أعلى الشريط و نقوم بإختيار copy address as text كما في صورة 4.
صورة 5 توضح طريقة معرفة مسار المجلد بالنسبة لنظام ماك، وذلك بالنقر بزر الفأرة اليمين على أي ملف داخل المجلد مع الضغط على option في لوحة المفاتيح، وسيظهر خيار Copy “FileName” as Pathname لنسخ مسار الملف. - لن يظهر هذا الخيار إذا لم يتم الضغط على مفتاح option في لوحة المفاتيح -.
وكبديل أسرع لكلا النظامين، يمكن فتح برنامج git bash على مسار المجلد بشكل مباشر، وذلك بالنقر بزر الفأرة اليمين على المجلد، ثم اختيار git bash here كما هو موضح في صورة 6.
أيًا كانت الطريقة المستخدمة، يمكن التأكد من صحة الخطوات بتغير المسار الحالي إلى مسار المجلد المطلوب. كما يظهر في صورة 7.
عند الوصول إلى هذه النقطة، يمكننا الآن التعامل مع ملفات المشروع، وسنستعرض هنا أهم هذه الاستخدامات:
إنشاء مستودع محلي
git init سيقوم هذا الأمر بإنشاء مستودع محلي في جهازك لمتابعة التغييرات. وكما نرى في صورة 8 ستظهر كلمة master بجانب مسار الملف بعد تنفيذ هذا الأمر.
إضافة ملف gitignore.
تُرفع في بعض المشاريع ملفات كثيرة و يمكن تجاهلها حتى لا تُرفع ملفات بهذا العدد, لذلك وجدت خاصية gitignore. ليتم تجاهل هذه الملفات و لا يتم رفعها للمستودع، يتم وضع ملف gitignore. داخل ملف المستودع للمشروع أو يتم إنشاء ملف gitignore. عام بحيث إذا كان لديك أكثر من مستودع تستطيع أن تضع جميع أسماء الملفات التي تود تجاهلها في جميع المستودعات داخله.
طريقة إنشاء ملف gitignore.
أنشئ ملف نصي و أعطه اسم gitignore. – لابد من وضع نقطة قبل كتابة gitignore-
كل ملف تود أن تتجاهله يجب أن يوضع في سطر منفصل. و تستخدم علامة # لكتابة تعليقات داخل الملف بهذه الطريقة:
# ignore node_modules folder
node_modules
# ignore all text files
*.txt
إضافة الملفات إلى المستودع
”git add “FileName —> لإضافة ملف محدد
. git add —> لإضافة جميع الملفات كما في صورة 9، مع ملاحظة وجود مسافة بين add و النقطة.
في هذه الخطوة، ستُضاف التعديلات على هذه الملفات إلى المستودع المحلي.
حفظ التغييرات باسم
”git commit -m “commit message
سيتم تسمية آخر التغييرات التي تمت إضافتها بعد آخر أمر commit باسم الرسالة الموجودة في commit message ، مما يساعد على تتبع التغييرات و التراجع إلى نقطة معينة إن لزم الأمر. صورة 10 تبين طريقة حفظ التغيرات.
رفع التغييرات إلى المستودع البعيد
إذا رغبت برفع تغييراتك على github، يستلزم عليك إضافة المستودع البعيد أولًا و تسميته، ثم رفع التغييرات عليه.
لإضافة المستودع البعيد، نستخدم الأمر التالي:
git remote add origin https://github.com/user_name/repository_name.git
حيث user_name هو اسم المستخدم في github، و repository_name هو اسم المستودع البعيد، كما في صورة 11.
origin هو الاسم المختصر للمستودع البعيد، بمعنى أنه لا داعي لكتابة https://github.com/user_name/repository_name.git عند الرغبة بالتعامل مع هذا المستودع بعد تنفيذ هذا الأمر، ويمكن استبداله ب origin
لرفع التغييرات إلى المستودع البعيد نستخدم الأمر كما في صورة 12
git push -u origin master
حيث origin هو الاسم المُختصر للمستودع، و master هو اسم الفرع (branch) والذي يمكن تغييره عند الرغبة في رفع التعديلات إلى فرع آخر. سيأتي تفصيل أكثر للفروع في جزء العمل كفريق.
بعد تنفيذ هذا الأمر، قم بتحديث صفحة المستودع في github وستجد أن التغييرات تمت إضافتها.
الرجوع إلى نقطة تغيير معينة
ذكرنا أن الأمر commit يساعدنا في تسمية مجموعة التغييرات حتى يسهل الرجوع إليها.
لنفترض أننا أنشأنا 3 مجموعات من التغييرات على أحد ملفات المشروع وأسميناها
First commit, second commit and third commit كما هو موضح في صورة 13.
إذا لم تحقق التغييرات الأخيرة النتائج المطلوبة ورغبنا في العودة إلى أول تغيير، سنقوم بما يلي:
- git log
و الذي سيقوم بإظهار جميع commits باسمها، كما سيظهر عنوان commit كمجموعة من الأرقام و الأحرف بجانب كلمة commit بأول سطر، توضح صورة 14 ذلك.
- git reset -- hard COMMIT_ADDRESS
سيقوم هذا الأمر بإعادة جميع الملفات في الجهاز إلى الcommit الموجود عنوانه، أي في هذه الحالة، سيظهر لنا الملف و محتواه First Change.
العمل ضمن فريق
Coming together is a beginning, staying together is progress, and working together is success.
Henry Ford
كما ذكرنا أن Git مفيد جدًا للعمل ضمن فريق، أي أن المشاكل العديدة التي تعاني منها الفرق من حيث مشاركة الملفات والأكواد البرمجية ستختفي مع استخدام Git. أيضًا إذا كان المشروع شخصي أو بمجال عملك و تم حذف ملف أو أكثر بالخطأ من جهازك الشخصي, ستتمكن من استرجاع ملفاتك الضائعة مع آخر تحديث قمت بعمله.
لذلك سنناقش في هذا الجزء دور وطريقة التعامل مع Git للفرق:
أولاً: إضافة مساهمين (Contributors) لمستودع المشروع
عند العمل كفريق على مشروع واحد، يجب إضافة جميع أعضاء الفريق كمساهمين في مستودع المشروع و ذلك باتباع الخطوات الموضحة في صورة 15، وهي كالتالي:
Settings
Manage access
Invite collaborate
ثم إدخال اسم المستخدم لحساب GitHub للشخص المساهم في المشروع.
ثانيًا: Git clone
هذه الخاصية مهمة عند العمل مع فريق, عند الرغبة في استدعاء الملفات لجهازك لابد من عمل استنساخ للملفات (Git clone) , هذا الأمر ينقل الملفات من المستودع البعيد (Remote Repository) لجهازك الشخصي. ولتنفيذ هذا الأمر نتبع الخطوات التالية:
1. نسخ رابط المستودع من المستودع البعيد (Remote Repository)، صورة 16.
2. تغيير الموقع الحالي في Git Bash للمسار الذي نريد أن يكون الملف فيه باستخدام الأمر cd ووضع الامتداد. - تم ذكر هذه الخطوة سابقًا، جزء التعامل مع الملفات -
3. كتابة git clone في Git Bash مع إضافة الرابط الذي قمت بنسخه في الخطوة الأولى. كما في صورة 17.
ثالثًا: Git pull
هذه الخاصية مهمة جدًا عند العمل مع الفريق, لابد من عمل سحب لتحديث التغييرات التي قام بها أعضاء الفريق قبل البدء بإكمال العمل على المشروع, أو عند رفع تغييرات قمت بها في فرع محدد – سيتم الحديث عن الفروع –
1. في الحالة الأولى فقط تكتب git pull
2. الحالة الثانية git pull REMOTE-NAME BRANCH-NAME
رابعًا: Branches
توجد نقطة مهمة و هي الفرع أو الفروع (Branch). يوجد فرع افتراضي و ينشأ تلقائيًا مع إنشاء المستودع و يُسمى الفرع الرئيسي ( master branch) , و لتجنب المشاكل عند العمل على branch واحد فقط من ضياع أسطر عند الرفع, توجد خاصية إنشاء فروع متعددة و العمل عليها, و هنا سيتم توضيح كيفية عمل فرع و التعامل معها جميعها, كالتالي:
1. المستودع سيكون على الفرع الرئيسي (master branch)
2. إنشاء و تغيير الفرع
في هذه الخطوة فقط نقوم بإدخال اسم الفرع الجديد و الضغط على زر الإدخال Enter للتبديل بين الفروع.
و يستطيع كل عضو من أعضاء الفريق انشاء فرع خاص به و العمل عليه حتى لا يصبح تعارض في الملفات والتغييرات، كما يمكن التنقل بين الفروع (branches). وبعد الانتهاء يمكن عمل دمج بين الفروع (merge).
التعامل مع الفروع عن طريق Git Bash:
صورة 20: التعامل مع الفروع.
خامسًا: Conflicts
عند دمج فرع مع الفرع الرئيسي master branch، قد تواجه مشكلة التعارض (Conflict).
تحصل هذه المشكلة عندما يعمل أكثر من شخص على نفس السطر في فروع مختلفة. فمثلًا إذا قمت بالتعديل على السطر رقم 35 في الفرع الخاص بك، وقام شخص آخر بالتعديل على نفس السطر في فرع الmaster، ستحدث مشكلة التعارض. يمكن حل هذه المشكلة بسهولة في Github عن طريق الخطوات التالية:
1. من خانة pull requests ، قم بالتوجه إلى الطلب الذي ترغب بدمجه إلى فرع الmaster، ثم انقر على resolve conflicts، كما هو موضح في صورة 21.
2. ستظهر لك التغيير الذي قمت بها، متبوعةً بالتغيير الموجود في فرع الmaster،
قم بمسح التغييرات التي لا تريدها و إبقاء ما تريده. ثم امسح علامات التعارض <<<<<<<, =======, >>>>>>> ، توضح صورة 22 مثال للتعارض الذي قد يواجهك.
ستمكنك هذه الخاصية من إبقاء تغييرات أحد الفروع أو دمج تغييرات من كلا الفرعين.
قد يكون لديك أكثر من تعارض في نفس الملف، قم بتكرار هذه الخطوة مع جميع التعارضات.
3. بعد الانتهاء من حل جميع التعارضات، قم بالنقر على Mark as resolved ثم Commit merge لدمج الملف إلى فرع الرئيسي master، كما في صورة 23
هنا مصدر إضافي للإستزادة في جزئية Conflicts.
سادسًا: الملف التمهيدي (README)
الملف التمهيدي في github يعتبر من أهم الملفات التي يجب عملها و تعطي انطباعًا جيدًا لأي شخص يود التعرف على المشاريع الخاصة بك.
في هذا الملف تُعرض تفاصيل المشروع , من وصف للمشروع و كيفية تشغيل المشروع، محررات الأكواد، و أعضاء الفريق و أمور أخرى, سنستعرض أهم مايجب وضعه في الملف التمهيدي:
عنوان المشروع
بالإضافة لوصف المشروع، ويكون مباشرة أسفل العنوان.
كيفية البدء
هنا يتم توضيح التعليمات وكيفية تشغيل المشروع على جهازك الخاص لغرض تطوير أو اختبار المشروع.
المتطلبات الأساسية
في هذا الجزء يتم ذكر الأدوات التي تحتاجها لتثبيت البرنامج وكيفية تثبيته.
التثبيت
يندرج تحت هذا المحور، الخطوات اللازمه لتشغيل بيئة التطوير بشكل مفصل. لتُسهِل للمطورين الاستفادة من ذلك المشروع بتتبع تلك الخطوات.
بناء المشروع
تذكر في هذا الجزء كل الأنظمة و frameworks المستخدمة في المشروع.
المساهمة في المشروع
وصف كيفية قبول مساهمين آخرين في المشروع و التعديل عليه.
الإصدار
ذكر إصدار محررات الأكواد مثلًا.
الفريق
أسماء أعضاء الفريق.
هنا قالب تعليمي يوضح الفكرة المذكورة أعلاها عن كيفية كتابة الملف التمهيدي.
هنا مساعدة في تنسيق شكل الملف التمهيدي و كيفية استخدام tags.