Git & GitHub

Pull Requests في Git — دليل شامل 2026

📅 2026-11-27⏱ 8 دقائق قراءة
في المقال السابق، تعلمت أساسيات GitHub. الآن سنتعلم **Pull Requests** — وهي **قلب العمل الجماعي** في GitHub. في هذا الدليل العملي، سنأخذك خطوة بخطوة لفهم Pull Requests، مع تمارين وحلول. ## ما هو Pull Request؟ **Pull Request (PR)** هو **طلب** لدمج فرع في فرع آخر. **تشبيه بسيط:** تخيل أنك تعمل في شركة: - تكتب مسودة تقرير (فرع). - ترسلها للمدير (PR). - المدير يراجعها ويقترح تعديلات (Review). - يوافق عليها (Approve). - تُنشر رسمياً (Merge). **PR يوفر:** - **مراجعة الكود** من الفريق. - **مناقشة** التغييرات. - **اختبارات** تلقائية. - **تاريخ** للقرارات. ## متى تستخدم Pull Request؟ - ✅ **مشاريع جماعية:** دائماً. - ✅ **مشاريع مفتوحة:** للمساهمة. - ✅ **مشاريع فردية:** للميزات الكبيرة (للمراجعة الذاتية). - ❌ **إصلاحات سريعة:** يمكن الدفع المباشر (نادراً). ## دورة حياة PR <table> <thead> <tr> <th>المرحلة</th> <th>الوصف</th> </tr> </thead> <tbody> <tr> <td><strong>1. إنشاء فرع</strong></td> <td>فرع جديد للميزة</td> </tr> <tr> <td><strong>2. العمل</strong></td> <td>كتابة الكود + commits</td> </tr> <tr> <td><strong>3. رفع</strong></td> <td>رفع الفرع لـ GitHub</td> </tr> <tr> <td><strong>4. فتح PR</strong></td> <td>إنشاء Pull Request</td> </tr> <tr> <td><strong>5. المراجعة</strong></td> <td>الفريق يراجع الكود</td> </tr> <tr> <td><strong>6. التعديل</strong></td> <td>الاستجابة للملاحظات</td> </tr> <tr> <td><strong>7. الموافقة</strong></td> <td>Approve</td> </tr> <tr> <td><strong>8. الدمج</strong></td> <td>Merge</td> </tr> <tr> <td><strong>9. الحذف</strong></td> <td>حذف الفرع</td> </tr> </tbody> </table> ## الخطوة 1: إنشاء فرع ```bash git checkout main git pull git checkout -b feature/add-search ``` **قواعد التسمية:** - `feature/` — ميزة جديدة. - `fix/` — إصلاح خطأ. - `docs/` — توثيق. - `refactor/` — إعادة هيكلة. ## الخطوة 2: العمل على الميزة ```bash # أضف الملفات echo "search" > search.js git add . git commit -m "feat: إضافة ميزة البحث" # عدّل echo "styles" >> search.js git add . git commit -m "style: تنسيق البحث" ``` ## الخطوة 3: رفع الفرع ```bash git push -u origin feature/add-search ``` **النتيجة:** ``` Enumerating objects: 5, done. ... To https://github.com/USERNAME/REPO.git * [new branch] feature/add-search -> feature/add-search ``` ## الخطوة 4: فتح PR على GitHub ### 1. اذهب إلى المستودع `github.com/USERNAME/REPO` ### 2. اضغط Compare & pull request **النتيجة:** GitHub يعرض زراً أصفر. ### 3. املأ المعلومات **العنوان:** ``` feat: إضافة ميزة البحث ``` **الوصف:** ```markdown ## ما هذا PR؟ إضافة ميزة البحث للمقالات. ## ما الذي تغيّر؟ - إضافة شريط البحث - إضافة دالة البحث - إضافة تنسيقات ## كيف أختبر؟ 1. افتح الصفحة الرئيسية 2. اكتب في شريط البحث 3. النتائج تظهر فوراً ## Screenshots ![screenshot](url) ## Checklist - [x] الكود يعمل - [x] تم اختباره - [x] التوثيق محدث - [x] لا توجد أخطاء ``` ### 4. اختر Reviewers - **Reviewers:** الفريق المراجع. - **Assignees:** أنت (المسؤول). - **Labels:** `enhancement`. - **Projects:** اللوحة. ### 5. اضغط Create pull request **🎉 PR مفتوح!** ## الخطوة 5: المراجعة ### كمراجع: 1. **Files changed:** عرض التغييرات. 2. **إضافة تعليقات:** اضغط على السطر. 3. **اختر:** - **Comment:** تعليق عام. - **Approve:** موافقة. - **Request changes:** طلب تعديلات. ### الملاحظات الشائعة: ```markdown 💡 اقتراح: يمكن استخدام map بدلاً من forEach هنا. 🐛 خطأ: هذا السطر قد يسبب crash إذا كان input فارغاً. ❓ سؤال: لماذا اخترت هذا النهج؟ ✅ جيد: تنسيق ممتاز! ``` ## الخطوة 6: التعديل **بعد الملاحظات:** ```bash # عدّل الكود # ... git add . git commit -m "fix: الاستجابة للملاحظات" git push ``` **النتيجة:** PR يتحدّث **تلقائياً**. ## الخطوة 7: الدمج **على GitHub:** 1. **Merge pull request**. 2. اختر: - **Create a merge commit:** commit يوضح الدمج. - **Squash and merge:** commit واحد. - **Rebase and merge:** سجل خطي. 3. اضغط **Confirm merge**. ## الخطوة 8: حذف الفرع **على GitHub:** اضغط **Delete branch**. **محلياً:** ```bash git checkout main git pull git branch -d feature/add-search ``` ## أنواع الدمج <table> <thead> <tr> <th>النوع</th> <th>الوصف</th> <th>الاستخدام</th> </tr> </thead> <tbody> <tr> <td><strong>Merge commit</strong></td> <td>commit إضافي</td> <td>الافتراضي</td> </tr> <tr> <td><strong>Squash and merge</strong></td> <td>commit واحد</td> <td>سجل نظيف</td> </tr> <tr> <td><strong>Rebase and merge</strong></td> <td>سجل خطي</td> <td>احترافي</td> </tr> </tbody> </table> ## مثال عملي كامل ### السيناريو: إضافة ميزة "Dark Mode" **الخطوة 1: ابدأ من main** ```bash git checkout main git pull ``` **الخطوة 2: أنشئ فرعاً** ```bash git checkout -b feature/dark-mode ``` **الخطوة 3: اعمل** ```bash # أنشئ ملف echo "// dark mode" > dark-mode.js git add . git commit -m "feat: إضافة Dark Mode" # عدّل echo "// styles" >> dark-mode.js git add . git commit -m "style: تنسيق Dark Mode" ``` **الخطوة 4: ارفع** ```bash git push -u origin feature/dark-mode ``` **الخطوة 5: افتح PR على GitHub** - املأ المعلومات. - أضف Screenshots. - اختر Reviewer. - Create pull request. **الخطوة 6: بعد المراجعة** ```bash # إذا طُلب تعديل echo "// fix" >> dark-mode.js git add . git commit -m "fix: تحسين الأداء" git push ``` **الخطوة 7: الدمج على GitHub** - Merge pull request. - Delete branch. **الخطوة 8: محلياً** ```bash git checkout main git pull git branch -d feature/dark-mode ``` **🎉 مبروك!** ## PR Template **أنشئ `.github/pull_request_template.md`:** ```markdown ## الوصف <!-- وصف مختصر للتغييرات --> ## نوع التغيير - [ ] إصلاح خطأ - [ ] ميزة جديدة - [ ] تغيير كاسر - [ ] توثيق ## Checklist - [ ] الكود يعمل محلياً - [ ] تم اختباره - [ ] لا توجد تحذيرات - [ ] التوثيق محدّث - [ ] تم تحديث CHANGELOG ## Screenshots <!-- إذا كان تغيير بصري --> ## Related Issues Closes #123 ``` **النتيجة:** كل PR جديد يستخدم هذا القالب. ## أفضل الممارسات ### 1. PR صغير - ✅ **أقل من 400 سطر**. - ✅ **ميزة واحدة** فقط. - ✅ **commit واحد** إذا أمكن. ### 2. وصف واضح - ✅ **ماذا** و **لماذا**. - ✅ **كيف** تختبر. - ✅ **Screenshots** إذا بصري. ### 3. عنوان جيد ``` ✅ feat: إضافة تسجيل الدخول ✅ fix: إصلاح خطأ في Header ✅ docs: تحديث README ❌ تحديثات ❌ fix bug ❌ asdf ``` ### 4. راجع بنفسك أولاً - اقرأ PR **قبل** رفعه. - تحقق من **Files changed**. ### 5. استجب بسرعة - الرد على المراجعين **خلال 24 ساعة**. - لا تترك PR **معلقاً**. ### 6. اربط Issues في الوصف: ``` Closes #123 Fixes #456 Related to #789 ``` **الفائدة:** عند الدمج، **تُغلق Issue تلقائياً**. ## أنواع المراجعات <table> <thead> <tr> <th>النوع</th> <th>المعنى</th> </tr> </thead> <tbody> <tr> <td><strong>Comment</strong></td> <td>تعليق عام</td> </tr> <tr> <td><strong>Approve</strong></td> <td>موافقة</td> </tr> <tr> <td><strong>Request changes</strong></td> <td>طلب تعديلات</td> </tr> </tbody> </table> ## تمارين عملية ### تمرين 1: فرع و PR أنشئ فرعاً، اعمل، وافتح PR. **الحل:** ```bash git checkout -b feature/test echo "test" > test.txt git add . && git commit -m "feat: test" git push -u origin feature/test # افتح PR على GitHub ``` ### تمرين 2: وصف PR اكتب وصفاً احترافياً. **الحل:** (راجع القالب أعلاه) ### تمرين 3: مراجعة راجع PR. **الحل:** - Files changed. - اضغط على سطر. - أضف تعليق. - Comment / Approve. ### تمرين 4: الاستجابة عدّل PR بناءً على الملاحظات. **الحل:** ```bash # عدّل git add . git commit -m "fix: استجابة" git push ``` ### تمرين 5: Squash ادمج بـ Squash. **الحل:** - على GitHub → Squash and merge. ### تمرين 6: Rebase ادمج بـ Rebase. **الحل:** - على GitHub → Rebase and merge. ### تمرين 7: حذف الفرع احذف الفرع بعد الدمج. **الحل:** ```bash git checkout main git pull git branch -d feature/test ``` ### تمرين 8: مشروع كامل أنشئ PR كامل مع كل الميزات. **الحل:** (راجع المثال أعلاه) ## حل المشاكل الشائعة ### 🔴 المشكلة 1: `This branch has conflicts` **الحل:** ```bash git checkout main git pull git checkout feature/branch git merge main # حل التعارضات git add . git commit -m "merge: حل التعارضات" git push ``` ### 🔴 المشكلة 2: PR لا يظهر **السبب:** لم ترفع الفرع. **الحل:** ```bash git push -u origin feature/branch ``` ### 🔴 المشكلة 3: `Required status checks` **السبب:** اختبارات تلقائية فاشلة. **الحل:** أصلح الكود حتى تنجح الاختبارات. ### 🔴 المشكلة 4: `Merge blocked` **السبب:** مراجعة مطلوبة. **الحل:** انتظر المراجعة أو اعمل على ملاحظات. ### 🔴 المشكلة 5: PR قديم **الحل:** ```bash git checkout main git pull git checkout feature/branch git rebase main git push --force ``` ## جدول أوامر PR <table> <thead> <tr> <th>الأمر/الإجراء</th> <th>الوظيفة</th> </tr> </thead> <tbody> <tr> <td><code>git checkout -b feature/x</code></td> <td>إنشاء فرع</td> </tr> <tr> <td><code>git push -u origin feature/x</code></td> <td>رفع الفرع</td> </tr> <tr> <td>Compare & pull request</td> <td>فتح PR</td> </tr> <tr> <td>Files changed</td> <td>عرض التغييرات</td> </tr> <tr> <td>Review changes</td> <td>إرسال مراجعة</td> </tr> <tr> <td>Merge pull request</td> <td>دمج</td> </tr> <tr> <td>Delete branch</td> <td>حذف الفرع</td> </tr> </tbody> </table> ## قائمة تحقق نهائية <table> <thead> <tr> <th>المهمة</th> <th>الحالة</th> </tr> </thead> <tbody> <tr> <td>فهم Pull Requests</td> <td>⬜</td> </tr> <tr> <td>إنشاء فرع</td> <td>⬜</td> </tr> <tr> <td>رفع الفرع</td> <td>⬜</td> </tr> <tr> <td>فتح PR</td> <td>⬜</td> </tr> <tr> <td>المراجعة</td> <td>⬜</td> </tr> <tr> <td>الدمج</td> <td>⬜</td> </tr> <tr> <td>حل التمارين الثمانية</td> <td>⬜</td> </tr> </tbody> </table> ## ماذا بعد هذا المقال؟ الآن بعد أن أتقنت Pull Requests، أنت جاهز للمقال التالي: 1. **حل التعارضات** — Conflict Resolution. 2. **Workflow احترافي** — Git Flow. 3. **مشروع تعاوني**. ## الخلاصة في هذا المقال، تعلمت: - ✅ ما هو Pull Request. - ✅ دورة حياة PR. - ✅ إنشاء PR. - ✅ المراجعة. - ✅ الدمج (3 أنواع). - ✅ أفضل الممارسات. - ✅ حل 8 تمارين عملية. **تذكر:** PR هو **مكان النقاش والمراجعة** — استخدمه بحكمة.