دليلك الشامل لـ Git و GitHub: أساسيات التحكم بالإصدار وأدوات المطورين

دقائق القراءة: 11

مقدمة إلى عالم Git و GitHub: أدوات لا غنى عنها للمطورين

في رحلة كل مطور برمجيات، تبدأ البرامج بسيطة وتتطور لتصبح معقدة ومتشابكة. قد تجد نفسك بحاجة إلى التراجع عن تغييرات قمت بها، أو ربما ترغب في دمج عمل زملائك في مشروعك بسلاسة بينما تواصل أنت العمل على أجزاء أخرى. هنا يبرز دور التحكم بالإصدار (Version Control)، وهو مهارة أساسية يتوقعها أي صاحب عمل من المطورين. هذه الأنظمة ليست حكراً على البرمجة؛ بل هي مفيدة لأي شخص يعمل على محتوى يتغير بمرور الوقت، سواء كان برنامجاً حاسوبياً، وصفة طعام، أو حتى رواية.

ما هو التحكم بالإصدار (Version Control)؟

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

ما هو Git؟

Git هو نظام تحكم بالإصدار موزع ومفتوح المصدر، تم تطويره بواسطة لينوس تورفالدس (نفس المطور الذي أنشأ نواة نظام التشغيل Linux) في عام 2005. يساعد Git المطورين على تتبع حالة التعليمات البرمجية الخاصة بهم ويتيح التعاون الفعال على نفس قاعدة الكود.

التحقق من تثبيت Git

إذا كنت ترغب في متابعة الشرح العملي، ستحتاج إلى تثبيت Git على جهاز الكمبيوتر الخاص بك. افتح الطرفية (Terminal) أو موجه الأوامر (Command Prompt) واكتب الأمر التالي:

git --version

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

فهم آلية عمل Git

إذا كنت قد استخدمت برنامجاً حاسوبياً أو لعبة فيديو ولاحظت أنه يمكنك العودة إلى نسخة محفوظة مسبقاً، فأنت تفهم بشكل فطري الحاجة إلى Git. إنه ببساطة يحفظ لقطة (snapshot) لبرنامجك في نقطة زمنية معينة. ولكن بدلاً من تتبع كل سطر من التعليمات البرمجية، فإنه يسجل التغييرات بين الكود الحالي وآخر مرة قمت فيها بالحفظ. يحتفظ Git بسجل مستمر لآخر مرة تم فيها حفظ كل سطر من التعليمات البرمجية، ويخزنها في مجلد مخفي خاص.

لنأخذ برنامج JavaScript بسيط كمثال. يقوم هذا البرنامج بطباعة ثلاثة أسطر إلى وحدة التحكم (console) التي يمكنك رؤيتها في متصفحك أو طرفيتك:

console.log('Hello, this is a git example!');
console.log('And here is another!');
console.log('And yet a third');

أوامر Git الأساسية

git init: تهيئة مستودع Git

إذا أردت حفظ إصدارات من عملي باستخدام Git، فإن الخطوة الأولى هي تهيئة المستودع (repository). أكتب الأمر git init في طرفيتي لبدء استخدام Git. سيؤدي هذا إلى إنشاء مجلد مخفي باسم .git، حيث سيقوم Git بتخزين جميع ملفاته وبيانات التحكم بالإصدار.

git init

git add: إضافة الملفات إلى منطقة التجهيز

بعد إنشاء الملفات، يجب أن نخبر Git بأننا نريد تتبع التغييرات فيها. الأمر git add . سيضيف جميع الملفات في برنامجنا إلى منطقة التجهيز (staging area). إذا قمت بـ git init بعد إنشاء ملف، أو في أي وقت تقوم فيه بإنشاء ملفات جديدة، ستحتاج إلى استخدام هذا الأمر لتوجيه Git لبدء تتبع التغييرات فيها.

git add .

git commit: حفظ الإصدارات

الخطوة التالية هي حفظ نسخة من الكود الخاص بنا باستخدام الأمر git commit. سأكتب:

git commit -am "Initial commit"

git commit هو الأمر الذي يحفظ إصداراً من الكود. -am هي اختصارات تسمى flags (علامات) وتشير إلى إجراءات اختيارية نريد اتخاذها مع هذا الالتزام (commit). العلامة a تعني أننا سنحفظ جميع التغييرات (All). أما العلامة m فتشير إلى أننا سنقدم رسالة (Message) بعد ذلك، وهي في هذه الحالة "Initial commit". يمكنك كتابة أي شيء تريده هنا، ويُنصح بكتابة رسائل التزام واضحة وموجزة.

كيف يحفظ Git التغييرات؟ (git diff)

إذا أجرينا تغييراً على برنامجنا (مثل تغيير النص في السطر الأول)، فقد نرغب في حفظ هذا الإصدار. يمكننا حتى التبديل بين الإصدارات إذا أردنا رؤية كيف تطور برنامجنا بمرور الوقت.

console.log('Now I have changed the first line.');
console.log('And here is another!');
console.log('And yet a third');

لمعرفة التغييرات التي طرأت، نستخدم الأمر git diff. سيعرض Git لك الفرق بين الكود الحالي وآخر مرة تم حفظه فيها. قد يبدو الأمر معقداً بعض الشيء في البداية، لكن الرموز - تشير إلى عمليات الحذف (deletions) والرموز + تشير إلى عمليات الإضافة (insertions). في مثالنا، قمنا بإزالة النص "Hello, this is a git example!" وأضفنا النص "Now I have changed the first line.". هذه هي الطريقة التي يتتبع بها Git ما تغير بين الإصدارات.

diff --git a/git.js b/git.js
index eb0f1d1..8dbf769 100644
--- a/git.js
+++ b/git.js
@@ -1,3 +1,3 @@
+console.log( 'Now I have changed the first line.' )
-console.log( 'Hello, this is a git example!' )
 console.log( 'And here is another!' )
 console.log( 'And yet a third' )

الآن بعد أن راجعنا التغييرات التي سنلتزم بها، يمكننا المضي قدماً وإجراء التزام ثانٍ:

git commit -am 'Update first console log'

سيؤدي هذا إلى حفظ التغييرات التي أجريتها على السطر الأول من النص.

git log: مراجعة سجل الالتزامات

يمكننا مراجعة الالتزامات التي قمنا بها باستخدام الأمر git log. إذا قمت بتشغيله في برنامجي الآن، سأحصل على هذا الإخراج:

commit 67627dd44e84a3106a18a19e94cf9f3723e59b3c (HEAD -> master)
Author: amberwilkie <amber@amberwilkie.com>
Date: Wed Apr 22 16:55:39 2020 -0400

    Update first console log

commit 49fe4152f474a9674a83e2b014a08828209d2690
Author: amberwilkie <amber@amberwilkie.com>
Date: Wed Apr 22 16:54:59 2020 -0400

    Initial commit

نرى رسائل الالتزام الخاصة بنا، ووقت الالتزام، ومعرفاً فريداً لكل التزام، والذي يمكننا استخدامه للرجوع إلى الالتزامات في المستقبل.

git checkout: التبديل بين الإصدارات والفروع

إذا أردنا العودة ورؤية التغييرات على الكود الخاص بنا من التزام سابق، فسنفعل ذلك باستخدام الأمر git checkout متبوعاً بمعرف الالتزام. على سبيل المثال:

git checkout 49fe4152f474a9674a83e2b014a08828209d2690

سيضع Git الكود الخاص بنا في حالة مؤقتة حتى نتمكن من عرض شكل الكود في تلك اللقطة الزمنية. لقد نسخت معرف أول التزام لي. إذا قمت بتشغيل هذا الأمر، فسيقول برنامجي "Hello, this is a git example!" في السطر الأول. للعودة إلى أحدث كود، ستكتب git checkout master.

الفروع (Branches) في Git

إذا لاحظت أعلاه، كان علينا كتابة master للعودة إلى الحالة الحالية لكودنا. لماذا؟ لأن master هو الاسم الافتراضي للفرع الرئيسي – المكان الذي يكون فيه الكود الخاص بنا هو الأكثر حداثة. يعتمد Git على الفروع للحفاظ على الكود الخاص بنا. يمكنك اعتبار master بمثابة جذع شجرة الكود الخاص بك. قد تنفصل وتجري بعض التغييرات، لكن الهدف النهائي هو دائماً إعادتها إلى الجذع، إلى master.

يمكنك استخدام git checkout لإنشاء فرع جديد، وليس فقط للتحقق من الإصدارات السابقة من الكود الخاص بك. جرب:

git checkout -b new-branch

تُستخدم العلامة -b عندما ننشئ فرعاً جديداً (Branch) وبعد العلامة نكتب اسم فرعنا الجديد. يمكننا إجراء العديد من الالتزامات على هذا الفرع ثم إعادتها لاحقاً إلى master بعملية تسمى الدمج (merging).

في الرسم البياني أدناه، تمثل النقاط الالتزامات. تم إنشاء فرعين "خارج" من master. في تطوير البرمجيات، غالباً ما نسمي هذه الفروع "feature" (فروع الميزات)، على عكس الفرع الرئيسي master. تم دمج الفرع الأزرق مرة أخرى في master، بينما لا يزال الفرع الأصفر قيد التطوير. لاحظ أنه على الرغم من إنشاء الفرع الأصفر بعد الفرع الأزرق، إلا أن التغييرات من master فقط ستكون مرئية في هذا الفرع. إذا أنشأنا فرعاً ثالثاً في وقت ما في المستقبل، فستكون التغييرات من master والفرع الأزرق موجودة في الفرع الثالث الجديد.

تصور لعملية التفرع (Branching) في Git

git merge: دمج الفروع

الأمر git merge سيأخذ جميع الالتزامات التي قمت بها على هذا الفرع ويدمجها في فرع master، مما يحفظ عملك.

لماذا نستخدم الفروع؟

إذا كنت تعمل بمفردك، فقد لا يبدو تقسيم عملك إلى فروع منطقياً جداً. لماذا لا تحفظ كل شيء على master؟ تتضح فائدة التفرع عندما نبدأ في التفكير في العمل ضمن فريق من المطورين. إذا كان الجميع يقومون بالالتزام (committing) مباشرة إلى فرع master في كل مرة يجرون فيها تغييراً، فستصبح الأمور فوضوية جداً بسرعة كبيرة. سيكون من الصعب أيضاً التحكم في الكود الذي ينتقل إلى "production" (الذي يصبح متاحاً للعملاء) والكود الذي لا يزال قيد الاختبار أو العمل عليه. بهذه الطريقة، يمكن لكل مطور أن يكون لديه فرعه الخاص (أو على الأرجح، فروع متعددة)، ويعمل على ميزته للمدة التي يحتاجها، ويدمجها عندما يحين الوقت المناسب.

ما هو GitHub؟

GitHub هو منصة مجانية (للاستخدام الشخصي)، مستضافة على السحابة لتخزين التعليمات البرمجية. تعمل مع Git على أجهزة الكمبيوتر الخاصة بك وزملائك، وتعمل كـ origin (المصدر الأصلي)، وهي مصدر الحقيقة لأي شخص يعمل على الكود. تقوم أنت والمتعاونون معك بتحميل الكود الخاص بهم إلى GitHub بشكل دوري، ويوفر GitHub أدوات للمساعدة في إدارة التغييرات على الكود بمرور الوقت.

رفع الكود الخاص بك إلى GitHub

أولاً، ستحتاج إلى إنشاء حساب GitHub. ستستخدم هذا الحساب طوال مسيرتك المهنية في البرمجة، لذا نصيحة مهمة: التزم باسم احترافي، ويفضل أن يتضمن اسمك الحقيقي. بمجرد تسجيل الدخول، ابحث عن الرمز + في الزاوية العلوية. انقر على "New Repository" (الاسم المستخدم لمجلدات Git، ويُختصر إلى "repo"). أعطه اسماً – ربما نفس اسم المجلد الذي أنشأته سابقاً حيث حفظت التزاماتك. ثم انقر على "Create Repository".

يمكنك الآن نسخ عنوان URL الذي تتم إعادة توجيهك إليه، ويمكننا تعيين origin لكودنا. ستكون هناك خطوة مصادقة في مرحلة ما هنا – ما عليك سوى اتباع التعليمات. Git جيد جداً في إعطائنا تعليمات واضحة حول الخطوات التالية التي يجب اتخاذها.

git remote add origin: ربط المستودع المحلي بالبعيد

الآن سنخبر قاعدة الكود الخاصة بنا (المجلد الذي يوجد فيه الكود الخاص بنا) بمكان تخزين الكود الخاص بنا في السحابة. سنكتب الأمر git remote add origin <your-url>، والذي سيقوم بتعيين origin لمستودعنا. الآن يمكننا الدفع (push) إلى origin الخاص بنا لتخزين الكود الخاص بنا على GitHub.

git remote add origin <your-url>

git push: دفع التغييرات إلى GitHub

بافتراض أننا لا نزال في فرع master الخاص بنا (أي أننا لم ننتقل إلى فرع آخر)، يمكننا الآن كتابة git push وسينتقل الكود الخاص بنا إلى GitHub.

git push

عرض الكود الخاص بك على GitHub

الآن أصبح الكود الخاص بك موجوداً على GitHub! إليك كيف يبدو مثالي بعد اتباع خطوات GitHub التي شرحتها:

مستودع GitHub لمثال Git في هذا المقال

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

طلبات السحب (Pull Requests)

توجد العديد من الميزات الأخرى في GitHub، ولكن الأهم في التعاون مع الزملاء هو طلب السحب (Pull Request). طلب السحب (غالباً ما يُختصر إلى PR) هو طريقة لإدارة التغييرات الواردة إلى قاعدة الكود. لإنشاء طلب سحب، ستقوم بإنشاء فرع جديد على جهاز الكمبيوتر المحلي الخاص بك، وإنشاء التزام واحد على الأقل على هذا الفرع، ثم استخدام الأمر git push origin head لإرسال هذا الفرع إلى GitHub. (يمكنك وضع اسم فرعك بدلاً من head، ولكنه مفيد للحفاظ على كل شيء متطابقاً تماماً).

git push origin head

الآن عندما تعود إلى GitHub، يجب أن ترى فرعك متاحاً لإنشاء طلب سحب.

GitHub يطالبك تلقائياً بإنشاء طلبات سحب من الفروع الجديدة

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

إنشاء طلب سحب على GitHub

لاحظ أننا نقارن الفروع. هنا نطلب إضافة التغييرات من هذا الفرع (pr-example) إلى فرع master. ولكن يمكننا استهداف أي من الفروع الأخرى في مستودعنا. في الوقت الحالي، يكفي أن تفهم أن master ليس الفرع الوحيد الذي يمكنك "إنشاء طلب سحب ضده". عندما تنقر على "Create Pull Request"، سترى هذه الشاشة:

مثال على طلب سحب مكتمل

يمكنك رؤية جميع الالتزامات في هذا الفرع (لدي التزام واحد فقط – "Change third line of program")، ويمكنك أيضاً دمج طلب السحب الخاص بك. هل تتذكر كيف يمكننا دمج الكود الخاص بنا محلياً عندما تحدثنا عن Git؟ يمكننا تنفيذ نفس الإجراء مع الكود المستضاف على السحابة في GitHub. إذا نقرت على الزر الأخضر "Merge pull request"، فسيتم دمج تغييراتك في master.

git pull: سحب التغييرات من المستودع البعيد

آخر أمر تحتاج إلى معرفته الآن هو git pull. إذا قمت بدمج طلب السحب الخاص بك في فرع master على GitHub، فهناك الآن تغييرات على origin لم تحصل عليها بعد على جهاز الكمبيوتر المحلي الخاص بك. إذا قمت بالانتقال إلى فرع master، ثم استخدمت الأمر git pull origin master، فستكون التغييرات التي قمت بدمجها للتو موجودة على جهاز الكمبيوتر المحلي الخاص بك.

➜ git-example git:(master) git pull origin master
From https://github.com/AmberWilkie/git-example
 * branch            master     -> FETCH_HEAD
Updating 67627dd..38ad2da
Fast-forward
 git.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

يشير "Fast-forward" إلى أن فرع master المحلي الخاص بنا "يلحق بالركب" مع فرع origin على GitHub. لقد أكملنا الدورة:

  • تغييرات محلية
  • دفع إلى GitHub وإنشاء طلب سحب (PR)
  • دمج طلب السحب في master
  • سحب التغييرات من master إلى جهاز الكمبيوتر المحلي

بمجرد أن تصبح مرتاحاً لهذه الخطوات، ستكون قد قطعت 80% من الطريق لإتقان Git و GitHub!

الخلاصة التقنية

يُعد Git العمود الفقري للتحكم بالإصدار الحديث، حيث يوفر للمطورين القدرة على تتبع كل تغيير، والتعاون بفعالية، والعودة إلى أي نقطة زمنية في تاريخ المشروع. بينما Git هو المحرك، يأتي GitHub ليكون الواجهة السحابية التي تحول هذا المحرك إلى منصة تعاون عالمية. من خلال فهم الأوامر الأساسية مثل init و add و commit، وإتقان مفاهيم الفروع وطلبات السحب، يمكن للمطورين ضمان سير عمل منظم، وتقليل الأخطاء، وتسريع عملية تطوير البرمجيات بشكل كبير. هذه الأدوات ليست مجرد خيارات، بل هي ضرورة حتمية في بيئة التطوير المعاصرة لضمان جودة الكود واستمرارية المشروع.

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *