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

## 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 هو **مكان النقاش والمراجعة** — استخدمه بحكمة.