| # | القسم |
|---|---|
| 1 | ما طلب السحب؟ |
| 2 | إنشاء طلب سحب |
| 3 | مراجعة الشفرة |
| 4 | دمج طلب سحب |
| 5 | ممارسات طلب السحب الجيدة |
| 6 | اختبار — طلبات السحب |
| 7 | تطبيق عملي — فتح طلب سحب ودمجه |
| 8 | الخلاصة |
طلب السحب (pull request، PR)، ويُسمّى أيضاً merge request على GitLab، هو طلب دمج: «هذا عملي على فرع، أرجو مراجعته ثم دمجه في main». هو نقطة اللقاء بين الشفرة والفريق.
طلب السحب ليس مجرد زر «دمج». هو فضاء نقاش حول الشفرة: تعليقات، اقتراحات، اختبارات آلية، موافقة. هنا تُحسَم الجودة.
| يخدم طلب السحب… | عملياً |
|---|---|
| طلب مراجعة الشفرة | يكتشف زميل أخطاءً وتحسينات |
| تشغيل CI | اختبارات + بناء آلي على الفرع |
| توثيق التغيير | العنوان + الوصف يشرحان «لماذا» |
| تتبّع القرار | من وافق، متى، لماذا |
قبل فتح طلب سحب، يجب دفع فرعك إلى GitHub.
الخطوة 1 — دفع الفرع :
git switch feature/recherche
git push -u origin feature/rechercheالخطوة 2 — فتح طلب السحب (خياران) :
main) والفرع المقارَن (feature/recherche).# إنشاء طلب السحب دون مغادرة الطرفية
gh pr create --base main --head feature/recherche \
--title "إضافة البحث" \
--body "تنفيذ شريط البحث مع مرشحات."وصف طلب سحب جيد يحتوي :
| القسم | المحتوى |
|---|---|
| ماذا | ما يفعله طلب السحب في جملة |
| لماذا | المشكلة أو الحاجة المحلولة |
| كيف نختبر | خطوات التحقق |
| رابط | رقم القضية المرتبطة (مثال Closes #42) |
العنوان والوصف يقرأهما بشر مستعجلون. كن صريحاً: «يصحّح انهيار تسجيل الدخول» أفضل ألف مرة من «fix bug».
تمرين مصغّر — من الفرع الحالي feature/recherche، أنشئ طلب سحب نحو main بـ gh، بعنوان واضح.
gh pr create --base main --head feature/recherche \
--title "إضافة البحث" --body "تنفيذ شريط البحث."مراجعة الشفرة (code review) قلب طلب السحب: زميل أو أكثر يقرأون التعديلات، يسألون، يقترحون تحسينات، ثم يوافقون أو يطلبون تغييرات.
الأحكام الثلاثة الممكنة على GitHub :
| الحكم | المعنى |
|---|---|
| Approve | الشفرة جيدة، يمكن الدمج |
| Request changes | تصحيحات لازمة قبل الدمج |
| Comment | ملاحظات بلا حظر ولا موافقة |
من جهة المؤلف، بعد التعليقات، نصحّح وندفع من جديد: يتحدّث طلب السحب تلقائياً.
# التصحيح بعد المراجعة
git switch feature/recherche
# ... تعديلات ...
git commit -am "أخذ ملاحظات المراجعة في الحسبان"
git push # يتحدّث طلب السحب وحدهما ينظر إليه مراجع جيد :
مراجعة الشفرة ليست حكماً على الشخص، بل تحسين جماعي للمنتج. ننتقد الشفرة، لا المؤلف. ونبرز أيضاً ما أُحسن عمله.
بعد الموافقة على طلب السحب واخضرار CI، ندمجه. يقترح GitHub ثلاث طرائق، تغيّر شكل السجل.
| الطريقة | ماذا تفعل | متى تُستخدم |
|---|---|---|
| Create a merge commit | تنشئ إيداع دمج، وتبقي كل إيداعات الفرع | تتبّع الفرع كله |
| Squash and merge | تضغط كل الإيداعات في واحد نظيف | سجل main واضح ومختصر |
| Rebase and merge | تعيد تشغيل الإيداعات على main بلا إيداع دمج | سجل خطي صارم |
# الدمج من الطرفية بـ GitHub CLI
gh pr merge 42 --squash --delete-branchبعد الدمج، ننظّف :
# حذف الفرع البعيد (غالباً تلقائي)
git push origin --delete feature/recherche
# تحديث المحلي
git switch main
git pull origin main
# حذف الفرع المحلي
git branch -d feature/rechercheSquash and merge شائع جداً: ميزة = إيداع نظيف واحد في
main. يصبح السجل قائمة مقروءة من الميزات، لا فوضى «wip» و «fix typo» و «oups».
تمرين مصغّر — بـ gh، ادمج طلب السحب رقم 42 بـ squash واحذف الفرع في العملية نفسها. اكتب الأمر.
gh pr merge 42 --squash --delete-branch
طلب سحب فعّال هو طلب صغير وواضح ومختبَر. هذه عادات الفرق المتقدّمة.
| الممارسة الجيدة | لماذا |
|---|---|
| طلبات صغيرة (< 400 سطر) | أسهل وأسرع في المراجعة |
| طلب سحب = موضوع واحد | لا خلط «ميزة + إعادة هيكلة + خطأ مطبعي» |
| عنوان + وصف واضحان | يفهم المراجع دون تخمين |
ربط القضية (Closes #N) | يتتبّع الحاجة ويغلق القضية عند الدمج |
| CI أخضر قبل طلب المراجعة | لا نطلب مراجعة شفرة معطّلة |
| الرد على كل التعليقات | لا شيء يبقى بلا جواب |
# ربط قضية تلقائياً في الوصف
gh pr create --title "إضافة تصدير CSV" \
--body "يسمح بتصدير البيانات بصيغة CSV. Closes #57"طلب سحب من 1 000 سطر ينال «LGTM» (looks good to me) بلا مراجعة حقيقية — لا أحد يملك شجاعة قراءة الكل. طلب من 50 سطراً ينال ملاحظات ثمينة. الصغير = مراجعة جدية.
تمرين مصغّر — أي كلمة مفتاح تضيفها في وصف طلب سحب لإغلاق القضية #57 تلقائياً عند الدمج؟
Closes #57 (تعمل أيضاً Fixes #57 أو Resolves #57).
السؤال 1: لماذا يُستخدم طلب السحب؟
a) لحذف فرع
b) لطلب مراجعة فرع ودمجه في فرع آخر
c) لتثبيت Git
d) لاستنساخ مستودع
الإجابة: b) — يطلب طلب السحب مراجعة شفرة فرع ثم دمجها (غالباً في main).
السؤال 2: ماذا يجب فعله قبل فتح طلب سحب على GitHub؟
a) حذف main
b) دفع الفرع نحو المستودع البعيد (git push)
c) إغلاق الطرفية
d) تعطيل CI
الإجابة: b) — يجب أن يوجد الفرع على البعيد؛ ندفعه بـ git push -u origin nom-de-branche.
السؤال 3: ماذا يعني « Request changes » أثناء مراجعة؟
a) الشفرة موافَق عليها
b) تصحيحات لازمة قبل الدمج
c) حُذف طلب السحب
d) أُنشئ مستودع جديد
الإجابة: b) — يطلب المراجع تعديلات؛ يصحّح المؤلف ويدفع من جديد، فيتحدّث طلب السحب.
السؤال 4: أي طريقة دمج تضغط كل إيداعات الفرع في واحد؟
a) Create a merge commit
b) Squash and merge
c) Rebase and merge
d) Cherry-pick
الإجابة: b) — Squash and merge يضغط كل الإيداعات في إيداع نظيف واحد في main.
السؤال 5: لماذا نفضّل طلبات سحب صغيرة؟
a) تستهلك مساحة قرص أقل
b) تُراجَع أسرع وبجدية أكبر
c) GitHub يفرضها
d) تغني عن كتابة اختبارات
الإجابة: b) — طلب صغير يُراجَع بانتباه وسرعة؛ طلب ضخم ينال غالباً «LGTM» بلا مراجعة حقيقية.
أنهيت ميزة على الفرع feature/footer. نفّذ دورة طلب السحب كاملة بـ GitHub CLI (gh) :
main بعنوان واضح ورابط قضية (Closes #12).# 1. دفع الفرع
git switch feature/footer
git push -u origin feature/footer
# 2. فتح طلب السحب
gh pr create --base main --head feature/footer \
--title "إضافة تذييل الموقع" \
--body "يضيف تذييلاً متجاوباً مع روابط وإشارات قانونية. Closes #12"
# 3. بعد الموافقة: دمج squash + حذف الفرع
gh pr merge --squash --delete-branch
# 4. تحديث المحلي
git switch main
git pull origin main
git branch -d feature/footerالنتيجة المتوقعة :
| الخطوة | التحقق |
|---|---|
| أُنشئ طلب السحب | gh pr list يعرض طلباً مفتوحاً نحو main |
| قضية مرتبطة | الوصف يحتوي Closes #12 (سيغلق القضية عند الدمج) |
| دمج squash | إيداع واحد «إضافة تذييل الموقع» يظهر في main |
| حُذف الفرع | git branch لم يعد يسرد feature/footer |
$ git log --oneline -1
a1b2c3d Ajout du pied de page du site (#13)الرقم بين قوسين (
#13) يضيفه GitHub تلقائياً: رقم طلب السحب. النقر عليه يعيد إلى كامل نقاش المراجعة. تتبّع تام.
gh pr create.تتقن دورة المساهمة على مستودعك. الدرس 04 — سير العمل التعاوني يفتح تعاوناً أوسع: fork، clone، القضايا، وممارسات الفريق الجيدة.
جميع الحقوق محفوظة. يُحظَر نسخ هذه الدورة أو نشرها أو استخدامها أو تكييفها، كلياً أو جزئياً، دون إذن كتابي مسبق من الدكتور هيثم رحومة.
دورة من إعداد الدكتور هيثم رحومة — تطوير ونشر حلول البيانات