الدمج في Git — دليل شامل Merge 2026
دليل عملي مفصل للدمج في Git — Fast-forward، Three-way merge، Squash، Rebase، مع تمارين وحلول
في المقال السابق، تعلمت الفروع. الآن سنتعلم الدمج (Merge) — كيف نُدمج الفروع ببعضها بأمان واحترافية.
في هذا الدليل العملي، سنأخذك خطوة بخطوة لفهم الدمج، مع تمارين وحلول.
ما هو الدمج (Merge)؟
الدمج هو ضم فرع إلى فرع آخر.
مثال:
- أنت على
main. - أنشأت
feature/loginوأضفت فيها صفحة تسجيل دخول. - بعد الانتهاء، تدمج
feature/loginفيmain.
أنواع الدمج
| النوع | الوصف | متى يحدث |
|---|---|---|
| Fast-forward | تقديم مباشر | عندما لا يوجد تغييرات في main |
| Three-way Merge | دمج 3 نقاط | عندما تغيّر main أيضاً |
| Squash Merge | دمج كـ commit واحد | لتبسيط السجل |
| Rebase | إعادة ترتيب | لتاريخ نظيف |
Fast-forward Merge
يحدث عندما:
mainلم يتغير منذ إنشاء الفرع.- الفرع أمام
mainبعدة commits.
مثال:
# 1. من main، أنشئ فرعاً
git checkout -b feature/login
# 2. أضف commits
echo "login" > login.html
git add .
git commit -m "feat: login"
echo "styles" > login.css
git add .
git commit -m "style: login styles"
# 3. ارجع لـ main
git checkout main
# 4. ادمج
git merge feature/login
النتيجة:
Updating abc1234..def5678
Fast-forward
login.html | 1 +
login.css | 1 +
2 files changed, 2 insertions(+)
الفائدة: سجل خطي نظيف.
Three-way Merge
يحدث عندما:
mainتغيّر منذ إنشاء الفرع.- لا يمكن "التقديم" مباشرة.
مثال:
# 1. من main، أنشئ فرعاً
git checkout -b feature/login
# 2. أضف commit
echo "login" > login.html
git add .
git commit -m "feat: login"
# 3. ارجع لـ main، وعدّل
git checkout main
echo "homepage" > index.html
git add .
git commit -m "feat: homepage"
# 4. ادمج
git merge feature/login
النتيجة:
Merge made by the 'ort' strategy.
login.html | 1 +
1 file changed, 1 insertion(+)
create mode 100644 login.html
Git يُنشئ commit جديد يجمع التغييرات.
Squash Merge
يدمج كل commits الفرع في commit واحد.
git checkout main
git merge --squash feature/login
git commit -m "feat: إضافة تسجيل الدخول"
الفائدة: سجل نظيف بدون تفاصيل صغيرة.
العيب: تفقد تاريخ الفرع.
Rebase
بديل للـ Merge، يُعيد ترتيب commits.
git checkout feature/login
git rebase main
# أو
git rebase main feature/login
النتيجة: commits الفرع تظهر بعد main.
الميزة: سجل خطي تماماً.
⚠️ تحذير: لا تستخدم rebase على commits مرفوعة.
Merge vs Rebase
| المعيار | Merge | Rebase |
|---|---|---|
| السجل | متشعب | خطي |
| Commit إضافي | ✅ نعم | ❌ لا |
| الأمان | ✅ آمن دائماً | ⚠️ خطر على commits مرفوعة |
| الاستخدام | في main | في الفروع المحلية |
القاعدة الذهبية:
mergeعلىmain.rebaseعلى الفروع المحلية قبل الدمج.
مثال عملي كامل
السيناريو: إضافة ميزة جديدة
الخطوة 1: تحديث main
git checkout main
git pull
الخطوة 2: إنشاء فرع
git checkout -b feature/search
الخطوة 3: العمل على الميزة
echo "<input type='search'>" > search.html
git add .
git commit -m "feat: إضافة شريط البحث"
echo "input { padding: 10px; }" > search.css
git add .
git commit -m "style: تنسيق شريط البحث"
الخطوة 4: رفع الفرع
git push -u origin feature/search
الخطوة 5: Pull Request على GitHub
- اذهب إلى GitHub.
- اضغط Compare & pull request.
- املأ الوصف.
- اضغط Create pull request.
الخطوة 6: بعد المراجعة، الدمج
git checkout main
git pull
git merge feature/search
git push
الخطوة 7: حذف الفرع
git branch -d feature/search
git push origin --delete feature/search
فحص ما قبل الدمج
# ما سيُدمج؟
git log main..feature/login --oneline
# الفرق بين الفرعين
git diff main feature/login
# هل سيكون fast-forward؟
git merge --no-commit --no-ff feature/login
git merge --abort
إلغاء الدمج
قبل الـ Commit:
git merge --abort
بعد الـ Commit:
git reset --hard HEAD~1
الدمج مع استراتيجيات
1. --no-ff — دائماً إنشاء commit
git merge --no-ff feature/login
الفائدة: حتى لو fast-forward، يُنشئ commit يوضح الدمج.
2. --ff-only — Fast-forward فقط
git merge --ff-only feature/login
يفشل إذا كان three-way مطلوباً.
3. --squash — دمج كـ commit واحد
git merge --squash feature/login
git commit -m "feat: login"
حل التعارضات (Conflict)
التعارض يحدث عندما:
- نفس السطر تم تعديله في فرعين.
- Git لا يعرف أي نسخة يفوز.
مثال:
git checkout main
git merge feature/login
النتيجة:
Auto-merging login.html
CONFLICT (content): Merge conflict in login.html
Automatic merge failed; fix conflicts and then commit the result.
حل التعارض:
1. افتح الملف المتعارض
<<<<<<< HEAD
<h1>الرئيسية</h1>
=======
<h1>تسجيل الدخول</h1>
>>>>>>> feature/login
التفسير:
<<<<<<< HEAD→ نسخةmain.=======→ فاصل.>>>>>>> feature/login→ نسخة الفرع.
2. احل التعارض يدوياً
<h1>الرئيسية</h1>
<h1>تسجيل الدخول</h1>
3. أضف الملف
git add login.html
4. أنشئ commit
git commit -m "merge: حل تعارض في login.html"
5. أدوات مساعدة
VS Code: يعرض التعارضات بشكل مرئي.
git mergetool:
git mergetool
أفضل الممارسات
1. حدّث main قبل الإنشاء
git checkout main
git pull
git checkout -b feature/new
2. حدّث main قبل الدمج
git checkout main
git pull
git merge feature/new
3. استخدم Pull Requests
لا تدمج مباشرة — افتح PR.
4. اختبر قبل الدمج
npm test
npm run build
5. فرع = ميزة = PR
لا تجمع ميزات متعددة في فرع واحد.
6. احذف الفروع المدمجة
git branch -d feature/done
تمارين عملية
تمرين 1: Fast-forward Merge
أنشئ فرعاً وادمجه (fast-forward).
الحل:
git checkout -b feature/a
echo "a" > a.txt
git add . && git commit -m "feat: a"
git checkout main
git merge feature/a
تمرين 2: Three-way Merge
أنشئ تعارضاً بسيطاً وحله.
الحل:
# على main
echo "main" > file.txt && git add . && git commit -m "main"
# على فرع
git checkout -b feature/b
echo "feature" > file.txt && git add . && git commit -m "feature"
# ارجع لـ main وعدّل
git checkout main
echo "main2" > file.txt && git add . && git commit -m "main2"
# ادمج
git merge feature/b
# حل التعارض يدوياً
تمرين 3: Squash Merge
ادمج فرعاً بـ --squash.
الحل:
git checkout main
git merge --squash feature/b
git commit -m "feat: b"
تمرين 4: Rebase
أعد ترتيب فرع فوق main.
الحل:
git checkout feature/b
git rebase main
تمرين 5: إلغاء الدمج
ادمج ثم ألغِ.
الحل:
git merge feature/b
git reset --hard HEAD~1
تمرين 6: --no-ff
ادمج مع --no-ff.
الحل:
git merge --no-ff feature/b
تمرين 7: عرض الفرق
اعرض الفرق قبل الدمج.
الحل:
git diff main feature/b
تمرين 8: مشروع كامل
أنشئ 3 فروع، ادمجها معاً.
الحل:
# فرع 1
git checkout -b feature/a
git commit -m "feat: a"
git checkout main
git merge feature/a
# فرع 2
git checkout -b feature/b
git commit -m "feat: b"
git checkout main
git merge feature/b
# فرع 3
git checkout -b feature/c
git commit -m "feat: c"
git checkout main
git merge feature/c
حل المشاكل الشائعة
🔴 المشكلة 1: CONFLICT
الحل: افتح الملف، حل التعارض، git add، git commit.
🔴 المشكلة 2: Merge aborted
الحل:
git merge --abort
🔴 المشكلة 3: دمج خاطئ
الحل:
git reset --hard HEAD~1
🔴 المشكلة 4: rebase فشل
الحل:
git rebase --abort
🔴 المشكلة 5: نسيت حل التعارض
الحل:
git status # يعرض الملفات المتعارضة
جدول أوامر الدمج
| الأمر | الوظيفة |
|---|---|
git merge feature | دمج |
git merge --no-ff feature | دائماً commit |
git merge --squash feature | دمج كـ commit واحد |
git merge --abort | إلغاء |
git rebase main | إعادة ترتيب |
git rebase --abort | إلغاء rebase |
git diff main feature | الفرق |
git log main..feature | commits الفرع |
قائمة تحقق نهائية
| المهمة | الحالة |
|---|---|
| Fast-forward Merge | ⬜ |
| Three-way Merge | ⬜ |
| Squash Merge | ⬜ |
| Rebase | ⬜ |
| حل التعارضات | ⬜ |
| إلغاء الدمج | ⬜ |
| حل التمارين الثمانية | ⬜ |
ماذا بعد هذا المقال؟
الآن بعد أن أتقنت الدمج، أنت جاهز للمقال التالي:
- GitHub — مقدمة في المنصة.
- Pull Requests — العمل الجماعي.
- حل التعارضات المتقدم.
الخلاصة
في هذا المقال، تعلمت:
- ✅ ما هو الدمج.
- ✅ أنواع الدمج (Fast-forward، Three-way).
- ✅ Squash و Rebase.
- ✅ حل التعارضات.
- ✅ أفضل الممارسات.
- ✅ حل 8 تمارين عملية.
تذكر: الدمج هو قلب العمل الجماعي في Git. أتقنه جيداً.
الفروع في Git — دليل شامل Branches 2026
مقدمة في GitHub — دليل شامل 2026
📚 مقالات ذات صلة
مشروع Git متكامل — تعاون على مستودع احترافي 2026
مشروع عملي شامل للتعاون على مستودع Git — فروع، PRs، مراجعة، CI/CD، وإصدارات
Git Workflow احترافي — دليل شامل 2026
دليل عملي مفصل لـ Git Workflow الاحترافي — Git Flow، GitHub Flow، Trunk-based، وأفضل الممارسات
حل التعارضات في Git — دليل شامل 2026
دليل عملي مفصل لحل التعارضات في Git — أنواع التعارضات، الأخطاء الشائعة، وأدوات المساعدة