مقدمة
جيت هو نظام مفتوح المصدر للتحكم في الإصدارات الموزعة، مما يجعل إدارة مشاريع البرمجيات التعاونية أكثر سهولة. تخزن العديد من المشاريع ملفاتها في مستودع جيت، وقد سهّلت منصات مثل جيت هاب مشاركة التعليمات البرمجية والمساهمة فيها، وجعلتها قيّمة وفعّالة.
تستفيد المشاريع مفتوحة المصدر المستضافة في المستودعات العامة من مساهمات مجتمع المطورين الأوسع من خلال طلبات السحب، والتي تطلب من المشروع قبول التغييرات التي أجريتها على مستودع التعليمات البرمجية الخاص به.
سيرشدك هذا البرنامج التعليمي خلال عملية تقديم طلب سحب إلى مستودع Git عبر سطر الأوامر حتى تتمكن من المساهمة في مشاريع البرمجيات مفتوحة المصدر.
المتطلبات الأساسية
يجب تثبيت Git على جهازك المحلي. سيساعدك هذا الدليل على التحقق من تثبيت Git على جهاز الكمبيوتر الخاص بك، وسيرشدك خلال عملية التثبيت لنظام التشغيل الخاص بك.
ستحتاج أيضًا إلى امتلاك حساب على GitHub أو إنشاء حساب جديد. يمكنك القيام بذلك من خلال موقع GitHub الإلكتروني، github.com، إما بتسجيل الدخول أو إنشاء حسابك.
اعتبارًا من نوفمبر 2020، أزالت منصة GitHub خاصية المصادقة القائمة على كلمة المرور. ولهذا السبب، للوصول إلى مستودعات GitHub عبر سطر الأوامر، ستحتاج إلى إنشاء رمز وصول شخصي أو إضافة معلومات مفتاح SSH العام الخاص بك.
وأخيرًا، عليك تحديد مشروع برمجيات مفتوحة المصدر للمساهمة فيه. يمكنك معرفة المزيد عن مشاريع البرمجيات مفتوحة المصدر من خلال قراءة هذه المقدمة.
أنشئ نسخة من المستودع
المستودع، أو repo اختصارًا، هو في الأساس الدليل الرئيسي للمشروع. يحتوي المستودع على جميع ملفات المشروع ذات الصلة، بما في ذلك التوثيق، كما يخزن سجل تعديلات كل ملف. على منصة GitHub، يمكن أن يضم المستودع عدة متعاونين، ويمكن أن يكون عامًا أو خاصًا.
للعمل على مشروع مفتوح المصدر، تحتاج أولاً إلى الحصول على نسخة خاصة بك من المستودع. وللقيام بذلك، عليك إنشاء نسخة فرعية من المستودع ثم استنساخها للحصول على نسخة عمل محلية.
قم بنسخ المستودع
يمكنك إنشاء مستودع على GitHub عن طريق الانتقال بمتصفحك إلى عنوان URL الخاص بمشروع المصدر المفتوح الذي تريد المساهمة فيه على GitHub.
تشير عناوين URL لمستودعات GitHub إلى كلٍ من اسم المستخدم المرتبط بمالك المستودع واسم المستودع. على سبيل المثال، يمتلك مجتمع DigitalOcean (اسم المستخدم: do-community) مستودع مشروع cloud_haiku، لذا فإن عنوان URL الخاص بهذا المشروع على GitHub هو:
https://github.com/do-community/cloud_haikuفي المثال أعلاه، do-community هو اسم المستخدم و cloud_haiku هو اسم المستودع.
بمجرد تحديد المشروع الذي ترغب في المساهمة فيه، يمكنك الانتقال إلى عنوان URL، والذي يكون تنسيقه كالتالي:
https://github.com/username/repositoryأو يمكنك البحث عن المشروع باستخدام شريط البحث في GitHub.
عندما تكون على الصفحة الرئيسية للمستودع، سيظهر زر "Fork" في أعلى يمين الصفحة، أسفل أيقونة المستخدم الخاصة بك:
انقر على زر "Fork" لبدء عملية النسخ. ستتلقى إشعارًا في نافذة متصفحك يفيد بأن المستودع الذي تقوم بنسخه قيد المعالجة.
بعد اكتمال العملية، سينتقل متصفحك إلى صفحة مشابهة لصفحة المستودع السابقة، باستثناء أنك سترى في الأعلى اسم المستخدم الخاص بك قبل اسم المستودع، وسترى أيضًا في عنوان URL اسم المستخدم الخاص بك قبل اسم المستودع.
لذا، في المثال أعلاه، بدلاً من do-community/cloud_haiku في أعلى الصفحة، سترى اسم المستخدم الخاص بك/cloud_haiku وسيبدو عنوان URL الجديد على النحو التالي:
https://github.com/your-username/cloud_haikuبعد إنشاء نسخة من المستودع، ستكون جاهزًا لاستنساخه للحصول على نسخة محلية من قاعدة التعليمات البرمجية.
محاكاة المستودع
لإنشاء نسختك المحلية الخاصة من المستودع الذي تريد المساهمة فيه، سنقوم أولاً بفتح نافذة طرفية.
نستخدم أمر git clone مع عنوان URL يشير إلى نسخة المستودع الخاصة بك.
سيكون هذا الرابط هو نفسه الرابط أعلاه، باستثناء أنه ينتهي الآن بـ .git. في مثال cloud_haiku أعلاه، سيبدو الرابط كالتالي، مع استبدال اسم المستخدم الفعلي باسم المستخدم الخاص بك:
https://github.com/your-username/cloud_haiku.gitيمكنك أيضًا نسخ الرابط باستخدام زر "⤓ الكود" الأخضر الموجود في صفحة المستودع التي فصلتها عن صفحة المستودع الرئيسية. بعد النقر على الزر، يمكنك نسخ الرابط بالنقر على زر الحافظة المجاور له.
بمجرد حصولنا على عنوان URL، نكون جاهزين لاستنساخ المستودع. وللقيام بذلك، ندمج أمر git clone مع عنوان URL للمستودع من سطر الأوامر في نافذة طرفية:
git clone https://github.com/your-username/repository.git
إنشاء فرع جديد
عند العمل على مشروع تعاوني، ستتبادر إلى ذهنك أنت والمطورون الآخرون المساهمون في المستودع أفكارٌ مختلفةٌ حول الميزات الجديدة أو الإصلاحات في الوقت نفسه. بعض هذه الميزات الجديدة لا يستغرق تنفيذها وقتًا طويلًا، بينما يستغرق بعضها الآخر وقتًا أطول. لهذا السبب، يُعدّ إنشاء فروع للمستودع أمرًا بالغ الأهمية لإدارة سير العمل، وعزل الكود الخاص بك، والتحكم في الميزات التي تُعاد إلى الفرع الرئيسي لمستودع المشروع.
يُطلق عادةً على الفرع الرئيسي لمستودع المشروع اسم الفرع الرئيسي. ومن الممارسات المُوصى بها اعتبار جميع محتويات الفرع الرئيسي قابلة للنشر، بحيث يمكن للآخرين استخدامها في أي وقت.
ملاحظة: في يونيو 2020، حدّثت منصة GitHub مصطلحاتها للإشارة إلى فروع الشيفرة المصدرية الافتراضية باسم "الفروع الرئيسية" بدلاً من "الفروع الرئيسية". إذا كان فرعك الافتراضي لا يزال يظهر باسم "الفرع الرئيسي"، يمكنك تحديثه إلى "الفرع الرئيسي" عن طريق تغيير إعدادات الفرع الافتراضي.
عند إنشاء فرع بناءً على مشروع قائم، يجب إنشاء الفرع الجديد من الفرع الرئيسي. كما يجب التأكد من أن اسم الفرع وصفي. فبدلاً من تسميته my-branch، يُفضل استخدام اسم مثل frontend-hook-migration أو fix-documentation-type.
لإنشاء فرع من نافذة الطرفية، ننتقل إلى مجلد المستودع. تأكد من استخدام اسم المستودع الفعلي (مثل cloud_haiku) للانتقال إلى ذلك المجلد.
cd repository
الآن، سننشئ فرعنا الجديد باستخدام أمر git branch. تأكد من تسميته باسمٍ وصفي حتى يعرف باقي أعضاء الفريق العاملين على المشروع ما تعمل عليه.
git branch new-branch
الآن وقد تم إنشاء فرعنا الجديد، يمكننا العمل عليه باستخدام أمر git checkout:
git checkout new-branch
بعد إدخال أمر git checkout، ستتلقى المخرجات التالية:
Output
Switched to branch 'new-branch'يمكنك أيضًا ضغط الأمرين السابقين عن طريق إنشاء فرع جديد والتبديل إليه، باستخدام الأمر التالي والعلامة -b:
git checkout -b new-branch
إذا كنت ترغب في العودة إلى الحالة الأصلية، يمكنك استخدام أمر checkout مع اسم الفرع الأصلي:
git checkout main
تتيح لك عملية الدفع التبديل بين فروع متعددة، حتى تتمكن من العمل على ميزات متعددة في نفس الوقت.
في هذه المرحلة، يمكنك الآن تعديل الملفات الموجودة أو إضافة ملفات جديدة إلى المشروع في فرعك.
إجراء تغييرات على المستوى المحلي
لتوضيح كيفية إنشاء طلب سحب، سنستخدم مثال مستودع cloud_haiku وننشئ ملفًا جديدًا في نسختنا المحلية. استخدم محرر النصوص المفضل لديك لإنشاء ملف جديد حتى نتمكن من إضافة قصيدة هايكو جديدة كما هو موضح في تعليمات المساعدة. على سبيل المثال، يمكننا استخدام nano وتسمية ملفنا التجريبي filename.md. يجب عليك تسمية ملفك باسمه الأصلي مع إضافة الامتداد md. (لـ Markdown).
nano filename.md
بعد ذلك، سنضيف نصًا إلى الملف الجديد، باتباع تعليمات المساعدة. سنستخدم قالب جيكيل ونضيف قصيدة هايكو بأسطر متقطعة. الملف أدناه هو ملف تجريبي، حيث ستحتاج إلى تقديم قصيدة هايكو أصلية.
--- layout: haiku title: Octopus Cloud author: Sammy --- Distributed cloud <br> Like the octopuses' minds <br> Across the network <br>
بعد إدخال النص، احفظ الملف وأغلقه. إذا كنت تستخدم محرر النصوص nano، فافعل ذلك بالضغط على CTRL + X، ثم Y، ثم ENTER.
بعد تعديل ملف موجود أو إضافة ملف جديد إلى مشروعك، يمكنك تجهيزه في مستودعك المحلي، وذلك باستخدام الأمر `git add`. في مثالنا، `filename.md`، سنكتب الأمر التالي.
git add filename.md
مررنا اسم الملف الذي أنشأناه إلى هذا الأمر لتجهيزه في مستودعنا المحلي. هذا يضمن أن ملفك جاهز للإضافة.
إذا كنت ترغب في إضافة جميع الملفات التي قمت بتغييرها إلى دليل معين، فيمكنك تجهيزها جميعًا باستخدام الأمر التالي:
git add .هنا، تضيف النقطة أو النقطة جميع الملفات ذات الصلة.
إذا كنت ترغب في إضافة جميع التغييرات بشكل متكرر، بما في ذلك التغييرات في الدلائل الفرعية، يمكنك كتابة ما يلي:
git add -A
أو يمكنك كتابة الأمر git add -all لإضافة جميع الملفات الجديدة إلى منطقة التجهيز.
من خلال تجهيز ملفنا، نريد تثبيت التغييرات التي أجريناها على المستودع باستخدام أمر git commit.
إجراء التغييرات
تُعدّ رسالة الالتزام جانبًا مهمًا من مساهمتك في الكود. فهي تُساعد القائمين على الصيانة والمساهمين الآخرين على فهم التغيير الذي أجريته، وسبب إجرائه، وأهميته. إضافةً إلى ذلك، تُوفّر رسائل الالتزام سجلًا تاريخيًا للتغييرات التي طرأت على المشروع ككل، مما يُفيد المساهمين المستقبليين.
إذا كانت لدينا رسالة قصيرة جدًا، فيمكننا حفظها باستخدام الخيار -m ووضع الرسالة بين علامتي اقتباس. في مثالنا لإضافة قصيدة هايكو، قد يبدو سجل التغييرات في Git كما يلي.
git commit -m "Added a new haiku in filename.md file"
ما لم يكن التغيير طفيفًا أو متوقعًا، فقد نرغب في إضافة رسالة التزام أطول حتى يكون المتعاونون معنا على دراية كاملة بمساهمتنا. لتسجيل هذه الرسالة الأطول، نقوم بتشغيل أمر git commit، الذي يفتح محرر النصوص الافتراضي.
git commit
عند تشغيل هذا الأمر، قد تجد نفسك في محرر النصوص vim، والذي يمكنك الخروج منه بكتابة :q. إذا كنت ترغب في ضبط محرر النصوص الافتراضي، يمكنك القيام بذلك باستخدام أمر git config وتعيين nano كمحرر افتراضي، على سبيل المثال:
git config --global core.editor "nano"
أو vim:
git config --global core.editor "vim"
بعد تشغيل أمر git commit، وبحسب محرر النصوص الافتراضي الذي تستخدمه، ستعرض نافذة الطرفية مستندًا يمكنك تعديله، وسيبدو شكله كالتالي:
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
# On branch new-branch
# Your branch is up-to-date with 'origin/new-branch'.
# Changes to be committed:
# modified: new-feature.pyأسفل التعليقات التمهيدية، يجب إضافة رسالة الالتزام إلى ملف النص.
لكتابة رسالة التزام مفيدة، ينبغي تضمين ملخص في السطر الأول، بطول 50 حرفًا تقريبًا. في هذا القسم، مقسمًا إلى فقرات سهلة الفهم، أضف شرحًا يوضح سبب إجراء التغيير، وكيفية عمل الكود، ومعلومات إضافية تُسهّل على الآخرين الذين سيراجعون العمل عند دمجه فهمه. حاول أن تكون متعاونًا ومبادرًا قدر الإمكان لضمان فهم القائمين على صيانة المشروع لمساهمتك فهمًا كاملًا.
دفع التغييرات
بعد حفظ ملف نص رسالة الالتزام والخروج منه، يمكنك التحقق مما تم التزامه بواسطة Git باستخدام الأمر التالي:
git status
بناءً على التغييرات التي أجريتها، ستحصل على مخرجات مشابهة لما يلي:
Output
On branch new-branch
nothing to commit, working tree cleanفي هذه المرحلة، يمكنك استخدام أمر git push لتطبيق التغييرات على الفرع الحالي من مستودعك المتفرع:
git push --set-upstream origin new-branch
سيوفر لك هذا الأمر مخرجات لإعلامك بالتقدم المحرز، وستكون مشابهة لما يلي:
Output
Counting objects: 3, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 336 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To https://github.com/your-username/repository.git
a1f29a6..79c0e80 new-branch -> new-branch
Branch new-branch set up to track remote branch new-branch from origin.يمكنك الآن الانتقال إلى المستودع المتفرع على صفحة الويب الخاصة بك على GitHub والانتقال إلى الفرع الذي قمت بدفعه لرؤية التغييرات التي أجريتها في المتصفح.
في هذه المرحلة، من الممكن طلب سحب إلى المستودع الرئيسي، ولكن إذا لم تكن قد فعلت ذلك بالفعل، فأنت بحاجة إلى التأكد من أن مستودعك المحلي محدث مع المستودع الرئيسي.
تحديث المستودع المحلي
أثناء العمل على مشروع مع مساهمين آخرين، عليك تحديث مستودعك المحلي باستمرار ليواكب المشروع، لأنك لا ترغب في إرسال طلب سحب لرمز برمجي قد يتسبب تلقائيًا في حدوث تعارضات (مع أن التعارضات واردة الحدوث في مشاريع الرموز البرمجية المشتركة). وللحفاظ على تحديث نسختك المحلية من قاعدة البيانات، عليك مزامنة التغييرات.
أولاً، سنقوم بضبط جهاز تحكم عن بعد للشوكة ثم نقوم بمزامنة الشوكة.
قم بضبط جهاز تحكم عن بعد للشوكة
تتيح لك المستودعات البعيدة التعاون مع الآخرين في مشروع Git. كل مستودع بعيد هو نسخة من المشروع مُستضافة على الإنترنت أو شبكة يمكنك الوصول إليها. وبناءً على صلاحيات المستخدم الخاصة بك، يجب أن يكون كل مستودع بعيد متاحًا لك للقراءة فقط أو للقراءة والكتابة.
لتمكين مزامنة التغييرات التي تُجريها في نسخة مُتفرعة مع المستودع الرئيسي الذي تعمل عليه، عليك إعداد خادم بعيد يُشير إلى المستودع الأصلي. يكفي إعداد هذا الخادم البعيد مرة واحدة فقط في المستودع الأصلي.
لنتحقق أولاً من المستودعات البعيدة التي قمت بتكوينها. سيعرض الأمر `git remote` أي مستودعات بعيدة قمت بتحديدها مسبقًا، لذلك إذا قمت باستنساخ مستودعك كما فعلنا أعلاه، فستحصل على الأقل على مخرجات لمستودع المصدر، وهو الاسم الافتراضي لـ Git للدليل المستنسخ.
من دليل المستودع في نافذة الطرفية الخاصة بك، دعنا نستخدم أمر git remote مع العلامة -v لعرض عناوين URL التي خزنها Git مع أسمائها المختصرة البعيدة المقابلة (مثل "origin"):
git remote -v
بما أننا قمنا بمحاكاة مستودع، فيجب أن تبدو مخرجاتنا مشابهة لما يلي:
Output
origin https://github.com/your-username/forked-repository.git (fetch)
origin https://github.com/your-username/forked-repository.git (push)إذا كنت قد قمت بالفعل بإعداد أكثر من جهاز تحكم عن بعد واحد، فسيقوم الأمر git remote -v بإدراجها جميعًا.
بعد ذلك، نحدد مستودعًا بعيدًا جديدًا للمزامنة مع النسخة المتفرعة. سيكون هذا هو المستودع الأصلي الذي أنشأنا منه النسخة المتفرعة. سنفعل ذلك باستخدام الأمر `git remote add`.
git remote add upstream https://github.com/original-owner-username/original-repository.git
بالنسبة لمثالنا على cloud_haiku، سيكون هذا الأمر كما يلي:
git remote add upstream https://github.com/do-community/cloud_haiku.git
في هذا المثال، يُشير "upstream" إلى الاسم المختصر الذي خصصناه للمستودع البعيد، لأنه في مصطلحات Git، يُشير "upstream" إلى المستودع الذي استنسخنا منه. إذا أردنا إضافة رابط بعيد إلى مستودع أحد المتعاونين، فقد نرغب في توفير اسم مستخدم ذلك المتعاون أو اسمًا مستعارًا مختصرًا للاسم المختصر.
باستخدام الأمر git remote -v مرة أخرى من دليل المستودع، يمكننا التحقق من إضافة مؤشرنا البعيد بشكل صحيح إلى المستودع الأصلي:
git remote -v
Output
origin https://github.com/your-username/forked-repository.git (fetch)
origin https://github.com/your-username/forked-repository.git (push)
upstream https://github.com/original-owner-username/original-repository.git (fetch)
upstream https://github.com/original-owner-username/original-repository.git (push)الآن يمكنك الرجوع إلى المصدر الرئيسي في سطر الأوامر بدلاً من كتابة عنوان URL بالكامل، وأنت جاهز لمزامنة نسختك المتفرعة مع المستودع الرئيسي.
مزامنة التفرع
بمجرد أن نقوم بتكوين جهاز بعيد يشير إلى المستودع الرئيسي والمستودع الأصلي على GitHub، نكون جاهزين لمزامنة نسخة المستودع الخاصة بنا للحفاظ عليها محدثة.
لمزامنة نسختنا المتفرعة، نستخدم من دليل المستودع المحلي في نافذة طرفية، الأمر `git fetch` لجلب الفروع مع التغييرات المقابلة لها من المستودع الأصلي. ولأننا استخدمنا الاسم المختصر "upstream" للإشارة إلى المستودع الأصلي، فإننا نمرره إلى الأمر.
git fetch upstream
قد يختلف الناتج لديك تبعًا لعدد التغييرات التي طرأت منذ إنشاء نسخة من المستودع، وقد يتضمن عدة أسطر لحساب وضغط وفك ضغط العناصر. سيكون الناتج النهائي مشابهًا للأسطر أدناه، ولكنه قد يختلف تبعًا لعدد الفروع في المشروع.
Output
From https://github.com/original-owner-username/original-repository
* [new branch] main -> upstream/mainالآن، يتم تخزين التغييرات التي يتم إجراؤها على الفرع الرئيسي في فرع محلي يسمى upstream/main.
لننتقل إلى الفرع الرئيسي المحلي لمستودعنا:
git checkout main
Output
Switched to branch 'main'الآن نقوم بدمج أي تغييرات تم إجراؤها على الفرع الرئيسي للمستودع الرئيسي، والذي سنصل إليه من خلال فرعنا المحلي الرئيسي/الرئيسي، في فرعنا الرئيسي المحلي:
git merge upstream/main
ستختلف المخرجات هنا، لكنها ستبدأ بتحديث في حال وجود تغييرات أو إذا كان المستودع مُحدّثًا بالفعل. في حال عدم وجود أي تغييرات منذ نسخك للمستودع.
أصبح الفرع الرئيسي لنسختك الآن متزامنًا مع المستودع الأصلي، والتغييرات المحلية التي أجريتها لم تضيع.
بحسب سير عملك والوقت الذي تقضيه في إجراء التغييرات، يمكنك مزامنة نسختك المتفرعة مع الكود الأصلي في المستودع الرئيسي عدة مرات حسب الحاجة. ولكن من الأفضل مزامنة نسختك المتفرعة قبل تقديم طلب السحب مباشرةً لضمان عدم دفع كود متعارض تلقائيًا.
طلب سحب
في هذه المرحلة، أنت جاهز لتقديم طلب سحب إلى المستودع الرئيسي.
عليك الذهاب إلى مستودع التفرع الخاص بك والضغط على زر طلب السحب الجديد الموجود على الجانب الأيسر من الشاشة.
في الصفحة التالية، يمكنك تغيير الفرع. على كل جانب، يمكنك تحديد المستودع المناسب من القائمة المنسدلة والفرع المناسب.
على سبيل المثال، عند تحديد فرع المستودع الرئيسي على اليسار وفرع المستودع الجديد المتفرع على اليمين، ستظهر لك شاشة تُشير إلى إمكانية دمج الفرعين. في حال عدم وجود أي كود مُنافس:
عليك إضافة عنوان وتعليق إلى الحقول المناسبة ثم الضغط على زر إنشاء طلب السحب.
في هذه المرحلة، سيقرر القائمون على صيانة المستودع الرئيسي قبول طلب السحب الخاص بك من عدمه. وقد يطلبون منك تعديل أو إصلاح الكود الخاص بك عن طريق تقديم مراجعة للكود قبل قبول طلب السحب.
نتيجة
لقد نجحتَ الآن في إرسال طلب سحب إلى مستودع برمجيات مفتوحة المصدر. بعد ذلك، عليك تحديث وتعديل الكود الخاص بك أثناء انتظار مراجعته. قد يطلب منك القائمون على المشروع إعادة صياغة الكود، لذا كن مستعدًا لذلك.
إن المشاركة في مشاريع المصادر المفتوحة، والتحول إلى مطور نشط في هذا المجال، تجربةٌ مُجزية. فالمساهمة المنتظمة في البرامج التي تستخدمها باستمرار تضمن لك أن تكون ذات قيمة عالية للمستخدمين الآخرين.














