انتقل إلى محتوى الدرس
الدرس 22
دورة Version Control

دمج الفروع عبر الأمر git mergeGit Merge

ادمج فروع الميزات المكتملة إلى الفرع الرئيسي عبر الأمر git merge، وميّز بين الدمج السريع Fast-Forward والدمج الثلاثي Three-Way Merge وتنظيف الفروع.
أقسام الدرس
6
الأمثلة
5
اللغة
العربية
تاريخ النشر
غير محدد
المشاهدات
0
محتوى الدرس
في هذا الدرس 6تصفّح المواضيع

بعد الانتهاء من تطوير الميزة واختبارها داخل فرعها المعزول، نستخدم الأمر git merge لضم تلك الالتزامات إلى الفرع الرئيسي. وقبل تنفيذ أي عملية دمج، التزم دائماً بـ القاعدة الذهبية للدمج:

  1. انتقل أولاً إلى الفرع المستقبِل: يدمج الأمر git merge <branch> الفرع المحدد داخل الفرع النشط حالياً (HEAD)؛ فإذا أردت دمج الفرع feat-search داخل main، يجب أن تنفذ git switch main أولاً.
  2. تأكد من نظافة مجلد العمل: شغّل git status للتأكد من عدم وجود تعديلات معلقة غير محفوظة قبل بدء الدمج.
Shell
# Step 1: Switch to the receiving branch (main)
git switch main

# Step 2: Confirm working tree is clean before merging
git status -s -b

عندما تنشئ الفرع feat-search انطلاقاً من main، وتضيف التزامات جديدة في فرع الميزة دون أن يشهد الفرع main أي التزامات جديدة خلال تلك الفترة، يكون التزام main سلفاً مباشراً لآخر التزام في فرع الميزة.

في هذه الحالة الخطية البسيطة، ينفذ Git ما يُعرف بـ الدمج السريع (Fast-Forward Merge)؛ فبدلاً من إنشاء كائن التزام جديد، يحرك مؤشر الفرع main للأمام مباشرة ليشير إلى نفس الالتزام الذي يقف عنده الفرع feat-search.

Shell
# Merge feat-search into main via Fast-Forward
git switch main
git merge feat-search
git log --oneline --decorate -n 3

في المشاريع النشطة، غالباً ما يستقبل الفرع main التزامات جديدة أثناء عملك المتوازي داخل فرع الميزة. ولأن مساري الفرعين قد تفرعا، لا يمكن الاكتفاء بتحريك المؤشر خطياً.

يلجأ Git تلقائياً إلى خوارزمية الدمج الثلاثي (Three-Way Merge) عبر مقارنة ثلاث لقطات رئيسية:

  1. الجد المشترك الأخير (Merge Base): آخر التزام اشترك فيه الفرعان قبل افتراقهما.
  2. قمة الفرع المستقبِل الحالي (main).
  3. قمة الفرع المراد دمجه (feat-ui).

ينتج عن هذه العملية إنشاء التزام دمج جديد (Merge Commit) يتميز بامتلاكه والدين اثنين يربطان تاريخ الفرعين معاً.

Shell
# Merge diverged branch with an explicit message
git switch main
git merge feat-ui -m "Merge branch feat-ui into main"
git log --oneline --graph -n 4
مخطط يقارن بين الدمج السريع بتحريك المؤشر والدمج الثلاثي بإنشاء التزام دمج ذي والدين في Git

في كثير من الفرق الهندسية، يُطلَب الاحتفاظ بسجل واضح في الرسم البياني git log --graph يبين أن مجموعة التزامات معينة طُورت معاً كفرع ميزة مستقل حتى لو كان الدمج السريع ممكناً:

  • فرض التزام الدمج (git merge --no-ff): يمنع الدمج السريع ويُلزم Git بإنشاء التزام دمج ذي والدين يوثق حدود الميزة بوضوح.
  • اشتراط الدمج السريع (git merge --ff-only): ينفذ العكس تماماً؛ إذ يقبل الدمج فقط إذا كان المسار خطياً، ويرفض العملية إذا تطلب الأمر إنشاء التزام دمج.
Shell
# Force a merge commit to preserve branch topology
git switch main
git merge --no-ff feat-cards -m "Merge feat-cards"
git log --oneline --graph -n 4

بعد دمج فرع الميزة بنجاح داخل main، تصبح جميع التزاماته جزءاً دائماً من تاريخ الفرع الرئيسي، ولم تعد هناك حاجة للاحتفاظ بمؤشر الفرع القديم حتى لا تزدحم قائمة الفروع:

  • فحص الفروع المدمجة: يعرض الأمر git branch --merged جميع الفروع التي دُمجت التزاماتها بالكامل في الفرع الحالي، بينما يعرض git branch --no-merged الفروع التي لا تزال تحتوي على عمل غير مدمج.
  • حذف المؤشر بأمان: احذف مؤشر الفرع المكتمل عبر git branch -d <branch-name> دون أن تفقد أي التزام من السجل.
Shell
# List branches already merged into main
git branch --merged

# Delete the completed feature branch pointer safely
git branch -d feat-cards

يلخص الجدول التالي الفروق الهندسية بين أنماط وخيارات الأمر git merge وتأثير كل منها على شجرة الالتزامات:

صيغة الأمر أو نمط الدمجمتى يعمل هذا النمطالنتيجة في شجرة سجل الالتزامات
git merge <branch> (الدمج السريع)لم يستقبل الفرع الهدف أي التزامات منذ التفرعيحرك مؤشر الفرع خطياً للأمام دون التزام جديد
git merge <branch> (الدمج الثلاثي)تفرع المساران بوجود التزامات جديدة في كليهماينشئ التزام دمج جديداً بوالدين يربط الفرعين
git merge --no-ff <branch>عند طلب توثيق حدود فرع الميزة صراحةًينشئ التزام دمج بوالدين حتى لو أمكن الدمج السريع
git merge --ff-only <branch>عند اشتراط بقاء السجل خطياً فقطينفذ الدمج السريع إن أمكن أو يلغي العملية
git merge --squash <branch>عند الرغبة في تلخيص التزامات فرع تجريبييجهز محصلة التعديلات لحفظها بالتزام مفرد
خلاصة المعرفة ومحطة الانتقال

ملخص الدرس

حصاد الدرس

مراجعة مركّزة لأهم المفاهيم والقواعد الهندسية التي أتقنتها في هذا الدرس قبل التطبيق العملي

ماذا تعلّمت في هذا الدرس؟

أتقنت في هذا الدرس القاعدة الذهبية للتحضير قبل الدمج، والفرق بين الدمج السريع Fast-Forward والدمج الثلاثي Three-Way Merge، وكيفية حفظ أثر التفرع بالخيار --no-ff وتنظيف الفروع المدمجة بأمان. الخطوة التالية: انتقل الآن إلى الدرس رقم 23 «فهم وحل تعارضات الدمج Merge Conflicts خطوة بخطوة» لتعلّم كيفية حسم تضارب الأسطر بين الفروع.

مشاركة

هل كان هذا الدرس مفيدًا؟

جارٍ تحميل الآراء…

ابنِ لغتك البرمجية

المصطلحات4

راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.

0 / 4 مفهومةأول بطاقة، أول خطوة
01 Fast-Forward Merge الدمج السريع
تحريك مؤشر الفرع المستقبِل للأمام مباشرة نحو قمة الفرع المدمج عند عدم وجود التزامات متفرعة.
للمراجعة
02 Three-Way Merge الدمج الثلاثي
دمج فرعين متفرعين عبر مقارنة قمة كل فرع مع لقطة الجد المشترك الأخير بينهما.
للمراجعة
03 Merge Commit التزام الدمج
كائن التزام ينتج عن الدمج الثلاثي أو الخيار --no-ff ويحتوي على إشارة إلى التزامين والدين.
للمراجعة
04 Merge Base الجد المشترك للدمج
أحدث التزام مشترك انطلق منه الفرعان قبل أن يسلك كل منهما مساراً مستقلاً.
للمراجعة

اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.

حروف قليلة. معنى كامل.

الاختصارات4

راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.

0 / 4 مفهومةأول بطاقة، أول خطوة
01 FF FF
Fast-Forward
اختصار الدمج السريع الذي يقدّم مؤشر الفرع خطياً دون إنشاء التزام دمج إضافي.
للمراجعة
02 ORT ORT
Ostensibly Recursive's Twin
محرك خوارزمية الدمج الافتراضي السريع المعتمد في Git منذ الإصدار 2.34.
للمراجعة
03 DAG DAG
Directed Acyclic Graph
الرسم البياني الموجه غير الدوري للالتزامات حيث تلتقي مسارات الفروع عند عقد التزام الدمج.
للمراجعة
04 HEAD HEAD
Current Receiving Branch Reference
مؤشر الفرع النشط المستقبِل الذي يصب فيه الأمر git merge تعديلات الفرع الآخر.
للمراجعة

اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.

من الفهم للتطبيق

مهامك قبل الاختبار

خطوة صغيرة كل مرة. وإنجاز تقدر ترجع له.

0/2مهام منجزة
  1. انتقل إلى الفرع الرئيسي عبر git switch main، وادمج فرع الميزة الخطي عبر git merge feat-header، ثم تحقق من تقدم المؤشر بسجل الالتزامات.

  2. نفّذ git merge --no-ff feat-cards -m "Merge feat-cards"، واعرض شجرة السجل بالخيار --graph، ثم احذف الفرع المدمج بأمان عبر git branch -d.

تأشير المهمة إقرار منك بإتمامها، وليس تصحيحًا آليًا للكود. يُحفظ تقدمك في حسابك.

مساحة التحدي

اختبر فهمك.
ووصلها للإتقان.

كل سؤال خطوة لقدّام. اختار، اكتب كود، وشوف نتيجتك فورًا.

10أسئلة 2أنواع تحديات 100%هدف الإتقان
تصحيح تلقائي. فرص بلا حدود.

أكمل المهام، واجمع كل الإجابات الصحيحة. أقل من 100%؟ راجع وأعد المحاولة.

الأسئلة متاحة للاطلاع. سجّل الدخول للتفاعل وحفظ تقدمك.

لمحة عن التحدي10 أسئلة تنتظرك
01

إذا أردت دمج الفرع feat-login داخل الفرع main، فأي فرع يجب أن يكون نشطاً (HEAD) قبل تشغيل git merge؟

يجب الانتقال أولاً إلى الفرع المستقبِل (main) عبر git switch main ثم تنفيذ git merge feat-login.

02

متى ينفذ نظام Git الدمج السريع (Fast-Forward Merge) افتراضياً؟

عندما لا يحتوي الفرع المستقبِل على أي التزامات جديدة منذ لحظة تفرع الفرع الآخر منه.

03

ينشئ الدمج السريع (Fast-Forward) دائماً كائن التزام دمج جديداً له والدان.

خطأ؛ يكتفي الدمج السريع بتحريك مؤشر الفرع للأمام ولا ينشئ أي كائن التزام جديد.

04

كم التزاماً والداً (Parent Commits) يمتلك التزام الدمج الناتج عن الدمج الثلاثي القياسي؟

يمتلك التزام الدمج القياسي والدين اثنين: قمة الفرع المستقبِل وقمة الفرع المدمج.

05

ما اللقطات الثلاث التي يقارنها نظام Git أثناء عملية الدمج الثلاثي (Three-Way Merge)؟

يقارن Git لقطة الجد المشترك الأخير (Merge Base) مع لقطتي قمتي الفرعين.

06

أي خيار يُلزم Git بإنشاء التزام دمج صريح حتى عندما يكون الدمج السريع ممكناً؟

يمنع الخيار --no-ff الدمج السريع ويُنشئ التزام دمج يحفظ أثر الفرع في السجل.

07

أي أمر يعرض قائمة بجميع الفروع المحلية التي دُمجت التزاماتها بالفعل داخل الفرع الحالي؟

يعرض الأمر git branch --merged الفروع التي تم دمج عملها بالكامل في الفرع النشط.

08

يؤدي حذف مؤشر الفرع بالأمر git branch -d بعد دمجه في main إلى مسح جميع الالتزامات التي كُتبت داخله.

خطأ؛ فجميع تلك الالتزامات أصبحت جزءاً من تاريخ الفرع main، وحذف الفرع يزيل ملف المؤشر فقط.

09

ماذا يفعل الأمر git merge --ff-only <branch> إذا كان المساران قد تفرعا بالتزامات مستقلة؟

يرفض إنشاء التزام دمج ويوقف العملية بأمان لأن المسار ليس خطياً.

10

أي تركيبة من خيارات git log ترسم مسارات الفروع والتزامات الدمج بيانياً داخل الطرفية؟

يرسم الأمر git log --oneline --graph --decorate شجرة التفرع والدمج بوضوح.