طلبات السحب Pull Requests: العمل الجماعي على GitHub
تعلمت الفروع والدمج على جهازك، والرفع إلى GitHub. لكن في الفرق الحقيقية لا يدمج أحد عمله في main مباشرة. الكود يمر أولاً على زميل يقرؤه ويعلّق عليه، ثم يُدمج. هذه العملية تتم عبر طلب السحب (Pull Request، واختصاره PR)، وهو قلب العمل الجماعي على GitHub وأساس المساهمة في المشاريع مفتوحة المصدر. في هذا الدرس ستتعلم الدورة كاملة.
ما هو طلب السحب؟
Section titled “ما هو طلب السحب؟”طلب السحب رسالة تقول لفريقك: «أنهيت عملاً على هذا الفرع، راجعوه من فضلكم وادمجوه في main». وهو صفحة على GitHub تجمع في مكان واحد:
- التغييرات: كل سطر أُضيف أو حُذف، ملوّناً بالأخضر والأحمر.
- النقاش: تعليقات المراجعين وردودك، حتى على سطر بعينه.
- الفحوصات: نتائج الاختبارات الآلية إن وُجدت.
- زر الدمج: يُضغط بعد الموافقة.
الأمر مثل مراجعة بحث مدرسي قبل تسليمه: زميلك يقرؤه، ويقترح تصحيحات، وبعد التعديل يُعتمد. عينان أفضل من عين واحدة.
الخطوة 1: فرع جديد للمهمة
Section titled “الخطوة 1: فرع جديد للمهمة”كل مهمة تبدأ بفرع من main المحدَّث:
git switch maingit pullgit switch -c add-footerSwitched to a new branch 'add-footer'اختر اسماً يصف المهمة: add-footer أو fix-login-error، لا test ولا new.
الخطوة 2: اعمل واحفظ وارفع
Section titled “الخطوة 2: اعمل واحفظ وارفع”git add footer.htmlgit commit -m "تحديث التذييل بحقوق النشر"git push -u origin add-footerTo https://github.com/sara/my-site.git * [new branch] add-footer -> add-footerbranch 'add-footer' set up to track 'origin/add-footer'.* [new branch]: الفرع أُنشئ على GitHub لأول مرة.-u: ربطت الفرع المحلي بنظيره البعيد، فيكفي بعدهاgit pushوحدها.
ومع الرفع الأول يطبع GitHub في الطرفية رابطاً جاهزاً لفتح طلب السحب.
للتأكد من الربط:
git branch -vv* add-footer 1a92d4b [origin/add-footer] تحديث التذييل بحقوق النشر main 757f10c [origin/main] حل تعارض note.mdالخطوة 3: افتح طلب السحب
Section titled “الخطوة 3: افتح طلب السحب”افتح صفحة المستودع على GitHub. ستجد شريطاً يذكر فرعك المرفوع حديثاً وبجانبه زر Compare & pull request. اضغطه، ثم:
- تأكد من الاتجاه: من
add-footer(compare) إلىmain(base). - اكتب عنواناً واضحاً: «تحديث التذييل بحقوق النشر».
- اكتب وصفاً: ماذا غيّرت؟ ولماذا؟ وكيف يجرّبه المراجع؟
- اضغط Create pull request.
قبل الفتح يمكنك أن ترى من الطرفية ما سيحتويه الطلب بالضبط:
git log --oneline main..add-footer1a92d4b تحديث التذييل بحقوق النشرmain..add-footer تعني: الـ commits الموجودة في فرعي وليست في main.
الخطوة 4: المراجعة والتعديل
Section titled “الخطوة 4: المراجعة والتعديل”يفتح زميلك تبويب Files changed، ويقرأ التغييرات، ويكتب ملاحظاته. ثم يختار واحداً من ثلاثة: Approve (موافق)، أو Request changes (مطلوب تعديلات)، أو Comment (تعليق فقط).
طلب منك إضافة سطر. لا تفتح طلباً جديداً! عدّل على الفرع نفسه وارفع:
git commit -am "إضافة سطر الحقوق بعد المراجعة"git pushTo https://github.com/sara/my-site.git 1a92d4b..409b59c add-footer -> add-footerطلب السحب يتحدث تلقائياً ويعرض الـ commit الجديد:
git log --oneline main..add-footer409b59c إضافة سطر الحقوق بعد المراجعة1a92d4b تحديث التذييل بحقوق النشرطلب السحب مرتبط بالفرع لا بـ commit معيّن: كل ما ترفعه إلى الفرع يظهر فيه.
الخطوة 5: الدمج
Section titled “الخطوة 5: الدمج”بعد الموافقة يضغط صاحب الصلاحية Merge pull request ثم Confirm merge، فيُدمج الفرع في main على GitHub. ويظهر بعدها زر Delete branch لحذف الفرع البعيد الذي انتهت مهمته.
الخطوة 6: حدّث جهازك ونظّف
Section titled “الخطوة 6: حدّث جهازك ونظّف”الدمج حدث على GitHub، وجهازك لا يعلم به بعد:
git switch maingit pullUpdating 757f10c..1089b5eFast-forward footer.html | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)git log --oneline --graph -3* 1089b5e Merge pull request #1 from sara/add-footer|\| * 409b59c إضافة سطر الحقوق بعد المراجعة| * 1a92d4b تحديث التذييل بحقوق النشر|/الـ commit الأعلى أنشأه GitHub عند الضغط على زر الدمج، وفيه رقم الطلب #1. والآن التنظيف:
git branch -d add-footergit fetch --pruneDeleted branch add-footer (was 409b59c).From https://github.com/sara/my-site - [deleted] (none) -> origin/add-footergit branch -d حذفت الفرع المحلي، و git fetch --prune أزالت من جهازك الإشارة إلى الفرع البعيد المحذوف. انتهت الدورة، والمهمة التالية تبدأ بفرع جديد.
الدورة في سطور
Section titled “الدورة في سطور”git switch -c featureمنmainمحدَّث.- اعمل، ثم
commit، ثمgit push -u origin feature. - افتح طلب السحب على GitHub بعنوان ووصف.
- عدّل حسب المراجعة وارفع إلى الفرع نفسه.
- الدمج على GitHub بعد الموافقة.
git switch mainثمgit pull، واحذف الفرع.
هذه الطريقة اسمها GitHub Flow، وتعمل بها أغلب الفرق.
المساهمة في مشاريع الآخرين: Fork
Section titled “المساهمة في مشاريع الآخرين: Fork”في مشروع مفتوح المصدر لا تملك صلاحية الرفع إلى مستودعه. الحل هو التفريع (Fork): نسخة كاملة من المستودع في حسابك تملك عليها كل الصلاحيات.
- اضغط زر Fork في صفحة المشروع.
- انسخ نسختك إلى جهازك بـ
git clone. - أنشئ فرعاً، واعمل، وارفعه إلى نسختك.
- افتح طلب سحب من فرعك إلى المستودع الأصلي.
ولمتابعة جديد المشروع الأصلي تضيفه كمستودع بعيد ثانٍ، والعُرف تسميته upstream:
git remote add upstream https://github.com/original-owner/my-site.gitgit remote -vorigin https://github.com/sara/my-site.git (fetch)origin https://github.com/sara/my-site.git (push)upstream https://github.com/original-owner/my-site.git (fetch)upstream https://github.com/original-owner/my-site.git (push)origin نسختك التي ترفع إليها، و upstream الأصل الذي تسحب منه: git pull upstream main.
جرّب بنفسك
Section titled “جرّب بنفسك”- في مستودعك على GitHub من درس
pushوpull، أنشئ فرعاًupdate-readmeوعدّل فيهREADME.md. - ارفع الفرع وافتح طلب سحب بعنوان ووصف واضحين.
- افتح تبويب Files changed، وأضف تعليقاً على سطر، ثم ارفع commit ثانياً ولاحظ تحديث الطلب.
- ادمج الطلب، واحذف الفرع من GitHub، ثم حدّث
mainعلى جهازك ونظّف بـgit branch -dوgit fetch --prune.
أخطاء شائعة
Section titled “أخطاء شائعة”- العمل على main مباشرة: لا يبقى فرع تفتح منه طلباً. ابدأ كل مهمة بفرع.
- طلب سحب ضخم: ألف سطر في طلب واحد لا يراجعه أحد بتركيز. قسّم العمل إلى طلبات صغيرة، كل منها فكرة واحدة.
- نسيان تحديث main قبل التفريع: فرع مبني على نسخة قديمة يزيد احتمال التعارض. نفّذ
git pullأولاً. - أخذ الملاحظات بشكل شخصي: المراجعة تنتقد الكود لا صاحبه، وهي أسرع طريق لتتعلم.
اختبر نفسك
Section titled “اختبر نفسك”سؤال
طلب منك المراجع تعديلاً على طلب سحب مفتوح. ماذا تفعل؟
طلب السحب مرتبط بالفرع، فأي commit ترفعه إليه يظهر في الطلب تلقائياً.
سؤال
في المساهمة عبر Fork، إلى ماذا يشير الاسم upstream عُرفاً؟
origin نسختك التي ترفع إليها، و upstream المستودع الأصلي الذي تجلب منه التحديثات.
الخلاصة
Section titled “الخلاصة”- طلب السحب يعرض عملك على الفريق للمراجعة قبل دمجه في
main. - الدورة: فرع، ثم commits، ثم
push، ثم طلب سحب، ثم مراجعة، ثم دمج، ثم تنظيف. - التعديلات بعد المراجعة تُرفع إلى الفرع نفسه فيتحدث الطلب تلقائياً.
- بعد الدمج:
git pullعلىmain، وgit branch -d، وgit fetch --prune. - مبروك! أنهيت كورس Git و GitHub، وصرت جاهزاً للعمل في فريق والمساهمة في المشاريع مفتوحة المصدر.