تخطَّ إلى المحتوى

طلبات السحب Pull Requests: العمل الجماعي على GitHub

الدرس 10 من 10 · Git و GitHub

تعلمت الفروع والدمج على جهازك، والرفع إلى GitHub. لكن في الفرق الحقيقية لا يدمج أحد عمله في main مباشرة. الكود يمر أولاً على زميل يقرؤه ويعلّق عليه، ثم يُدمج. هذه العملية تتم عبر طلب السحب (Pull Request، واختصاره PR)، وهو قلب العمل الجماعي على GitHub وأساس المساهمة في المشاريع مفتوحة المصدر. في هذا الدرس ستتعلم الدورة كاملة.

طلب السحب رسالة تقول لفريقك: «أنهيت عملاً على هذا الفرع، راجعوه من فضلكم وادمجوه في main». وهو صفحة على GitHub تجمع في مكان واحد:

  • التغييرات: كل سطر أُضيف أو حُذف، ملوّناً بالأخضر والأحمر.
  • النقاش: تعليقات المراجعين وردودك، حتى على سطر بعينه.
  • الفحوصات: نتائج الاختبارات الآلية إن وُجدت.
  • زر الدمج: يُضغط بعد الموافقة.

الأمر مثل مراجعة بحث مدرسي قبل تسليمه: زميلك يقرؤه، ويقترح تصحيحات، وبعد التعديل يُعتمد. عينان أفضل من عين واحدة.

الخطوة 1: فرع جديد للمهمة

Section titled “الخطوة 1: فرع جديد للمهمة”

كل مهمة تبدأ بفرع من main المحدَّث:

نافذة طرفيّة
git switch main
git pull
git switch -c add-footer
الناتج
Switched to a new branch 'add-footer'

اختر اسماً يصف المهمة: add-footer أو fix-login-error، لا test ولا new.

الخطوة 2: اعمل واحفظ وارفع

Section titled “الخطوة 2: اعمل واحفظ وارفع”
نافذة طرفيّة
git add footer.html
git commit -m "تحديث التذييل بحقوق النشر"
git push -u origin add-footer
الناتج
To https://github.com/sara/my-site.git
* [new branch] add-footer -> add-footer
branch '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. اضغطه، ثم:

  1. تأكد من الاتجاه: من add-footer (compare) إلى main (base).
  2. اكتب عنواناً واضحاً: «تحديث التذييل بحقوق النشر».
  3. اكتب وصفاً: ماذا غيّرت؟ ولماذا؟ وكيف يجرّبه المراجع؟
  4. اضغط Create pull request.

قبل الفتح يمكنك أن ترى من الطرفية ما سيحتويه الطلب بالضبط:

نافذة طرفيّة
git log --oneline main..add-footer
الناتج
1a92d4b تحديث التذييل بحقوق النشر

main..add-footer تعني: الـ commits الموجودة في فرعي وليست في main.

الخطوة 4: المراجعة والتعديل

Section titled “الخطوة 4: المراجعة والتعديل”

يفتح زميلك تبويب Files changed، ويقرأ التغييرات، ويكتب ملاحظاته. ثم يختار واحداً من ثلاثة: Approve (موافق)، أو Request changes (مطلوب تعديلات)، أو Comment (تعليق فقط).

طلب منك إضافة سطر. لا تفتح طلباً جديداً! عدّل على الفرع نفسه وارفع:

نافذة طرفيّة
git commit -am "إضافة سطر الحقوق بعد المراجعة"
git push
الناتج
To https://github.com/sara/my-site.git
1a92d4b..409b59c add-footer -> add-footer

طلب السحب يتحدث تلقائياً ويعرض الـ commit الجديد:

نافذة طرفيّة
git log --oneline main..add-footer
الناتج
409b59c إضافة سطر الحقوق بعد المراجعة
1a92d4b تحديث التذييل بحقوق النشر

طلب السحب مرتبط بالفرع لا بـ commit معيّن: كل ما ترفعه إلى الفرع يظهر فيه.

بعد الموافقة يضغط صاحب الصلاحية Merge pull request ثم Confirm merge، فيُدمج الفرع في main على GitHub. ويظهر بعدها زر Delete branch لحذف الفرع البعيد الذي انتهت مهمته.

الخطوة 6: حدّث جهازك ونظّف

Section titled “الخطوة 6: حدّث جهازك ونظّف”

الدمج حدث على GitHub، وجهازك لا يعلم به بعد:

نافذة طرفيّة
git switch main
git pull
الناتج
Updating 757f10c..1089b5e
Fast-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-footer
git fetch --prune
الناتج
Deleted branch add-footer (was 409b59c).
From https://github.com/sara/my-site
- [deleted] (none) -> origin/add-footer

git branch -d حذفت الفرع المحلي، و git fetch --prune أزالت من جهازك الإشارة إلى الفرع البعيد المحذوف. انتهت الدورة، والمهمة التالية تبدأ بفرع جديد.

  1. git switch -c feature من main محدَّث.
  2. اعمل، ثم commit، ثم git push -u origin feature.
  3. افتح طلب السحب على GitHub بعنوان ووصف.
  4. عدّل حسب المراجعة وارفع إلى الفرع نفسه.
  5. الدمج على GitHub بعد الموافقة.
  6. git switch main ثم git pull، واحذف الفرع.

هذه الطريقة اسمها GitHub Flow، وتعمل بها أغلب الفرق.

المساهمة في مشاريع الآخرين: Fork

Section titled “المساهمة في مشاريع الآخرين: Fork”

في مشروع مفتوح المصدر لا تملك صلاحية الرفع إلى مستودعه. الحل هو التفريع (Fork): نسخة كاملة من المستودع في حسابك تملك عليها كل الصلاحيات.

  1. اضغط زر Fork في صفحة المشروع.
  2. انسخ نسختك إلى جهازك بـ git clone.
  3. أنشئ فرعاً، واعمل، وارفعه إلى نسختك.
  4. افتح طلب سحب من فرعك إلى المستودع الأصلي.

ولمتابعة جديد المشروع الأصلي تضيفه كمستودع بعيد ثانٍ، والعُرف تسميته upstream:

نافذة طرفيّة
git remote add upstream https://github.com/original-owner/my-site.git
git remote -v
الناتج
origin 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.

  1. في مستودعك على GitHub من درس push و pull، أنشئ فرعاً update-readme وعدّل فيه README.md.
  2. ارفع الفرع وافتح طلب سحب بعنوان ووصف واضحين.
  3. افتح تبويب Files changed، وأضف تعليقاً على سطر، ثم ارفع commit ثانياً ولاحظ تحديث الطلب.
  4. ادمج الطلب، واحذف الفرع من GitHub، ثم حدّث main على جهازك ونظّف بـ git branch -d و git fetch --prune.
  • العمل على main مباشرة: لا يبقى فرع تفتح منه طلباً. ابدأ كل مهمة بفرع.
  • طلب سحب ضخم: ألف سطر في طلب واحد لا يراجعه أحد بتركيز. قسّم العمل إلى طلبات صغيرة، كل منها فكرة واحدة.
  • نسيان تحديث main قبل التفريع: فرع مبني على نسخة قديمة يزيد احتمال التعارض. نفّذ git pull أولاً.
  • أخذ الملاحظات بشكل شخصي: المراجعة تنتقد الكود لا صاحبه، وهي أسرع طريق لتتعلم.

سؤال

طلب منك المراجع تعديلاً على طلب سحب مفتوح. ماذا تفعل؟

سؤال

في المساهمة عبر Fork، إلى ماذا يشير الاسم upstream عُرفاً؟

  • طلب السحب يعرض عملك على الفريق للمراجعة قبل دمجه في main.
  • الدورة: فرع، ثم commits، ثم push، ثم طلب سحب، ثم مراجعة، ثم دمج، ثم تنظيف.
  • التعديلات بعد المراجعة تُرفع إلى الفرع نفسه فيتحدث الطلب تلقائياً.
  • بعد الدمج: git pull على main، و git branch -d، و git fetch --prune.
  • مبروك! أنهيت كورس Git و GitHub، وصرت جاهزاً للعمل في فريق والمساهمة في المشاريع مفتوحة المصدر.