في هذا الدرس 6تصفّح المواضيع
بعد الانتهاء من تطوير الميزة واختبارها داخل فرعها المعزول، نستخدم الأمر git merge لضم تلك الالتزامات إلى الفرع الرئيسي. وقبل تنفيذ أي عملية دمج، التزم دائماً بـ القاعدة الذهبية للدمج:
- انتقل أولاً إلى الفرع المستقبِل: يدمج الأمر
git merge <branch>الفرع المحدد داخل الفرع النشط حالياً (HEAD)؛ فإذا أردت دمج الفرعfeat-searchداخلmain، يجب أن تنفذgit switch mainأولاً. - تأكد من نظافة مجلد العمل: شغّل
git statusللتأكد من عدم وجود تعديلات معلقة غير محفوظة قبل بدء الدمج.
# 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.
# 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) عبر مقارنة ثلاث لقطات رئيسية:
- الجد المشترك الأخير (Merge Base): آخر التزام اشترك فيه الفرعان قبل افتراقهما.
- قمة الفرع المستقبِل الحالي (
main). - قمة الفرع المراد دمجه (
feat-ui).
ينتج عن هذه العملية إنشاء التزام دمج جديد (Merge Commit) يتميز بامتلاكه والدين اثنين يربطان تاريخ الفرعين معاً.
# 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 log --graph يبين أن مجموعة التزامات معينة طُورت معاً كفرع ميزة مستقل حتى لو كان الدمج السريع ممكناً:
- فرض التزام الدمج (
git merge --no-ff): يمنع الدمج السريع ويُلزم Git بإنشاء التزام دمج ذي والدين يوثق حدود الميزة بوضوح. - اشتراط الدمج السريع (
git merge --ff-only): ينفذ العكس تماماً؛ إذ يقبل الدمج فقط إذا كان المسار خطياً، ويرفض العملية إذا تطلب الأمر إنشاء التزام دمج.
# 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>دون أن تفقد أي التزام من السجل.
# 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
راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.
- 01 Fast-Forward Merge الدمج السريع
- تحريك مؤشر الفرع المستقبِل للأمام مباشرة نحو قمة الفرع المدمج عند عدم وجود التزامات متفرعة.
- للمراجعة
- 02 Three-Way Merge الدمج الثلاثي
- دمج فرعين متفرعين عبر مقارنة قمة كل فرع مع لقطة الجد المشترك الأخير بينهما.
- للمراجعة
- 03 Merge Commit التزام الدمج
- كائن التزام ينتج عن الدمج الثلاثي أو الخيار --no-ff ويحتوي على إشارة إلى التزامين والدين.
- للمراجعة
- 04 Merge Base الجد المشترك للدمج
- أحدث التزام مشترك انطلق منه الفرعان قبل أن يسلك كل منهما مساراً مستقلاً.
- للمراجعة
لا توجد بطاقات تطابق البحث والتصفية.
اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.
الاختصارات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 تعديلات الفرع الآخر.
- للمراجعة
لا توجد بطاقات تطابق البحث والتصفية.
اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.
مهامك قبل الاختبار
خطوة صغيرة كل مرة. وإنجاز تقدر ترجع له.
-
انتقل إلى الفرع الرئيسي عبر git switch main، وادمج فرع الميزة الخطي عبر git merge feat-header، ثم تحقق من تقدم المؤشر بسجل الالتزامات.
-
نفّذ git merge --no-ff feat-cards -m "Merge feat-cards"، واعرض شجرة السجل بالخيار --graph، ثم احذف الفرع المدمج بأمان عبر git branch -d.
تأشير المهمة إقرار منك بإتمامها، وليس تصحيحًا آليًا للكود. يُحفظ تقدمك في حسابك.
اختبر فهمك.
ووصلها للإتقان.
كل سؤال خطوة لقدّام. اختار، اكتب كود، وشوف نتيجتك فورًا.
أكمل المهام، واجمع كل الإجابات الصحيحة. أقل من 100%؟ راجع وأعد المحاولة.
الأسئلة متاحة للاطلاع. سجّل الدخول للتفاعل وحفظ تقدمك.
لمحة عن التحدي10 أسئلة تنتظرك +
إذا أردت دمج الفرع feat-login داخل الفرع main، فأي فرع يجب أن يكون نشطاً (HEAD) قبل تشغيل git merge؟
يجب الانتقال أولاً إلى الفرع المستقبِل (main) عبر git switch main ثم تنفيذ git merge feat-login.
متى ينفذ نظام Git الدمج السريع (Fast-Forward Merge) افتراضياً؟
عندما لا يحتوي الفرع المستقبِل على أي التزامات جديدة منذ لحظة تفرع الفرع الآخر منه.
ينشئ الدمج السريع (Fast-Forward) دائماً كائن التزام دمج جديداً له والدان.
خطأ؛ يكتفي الدمج السريع بتحريك مؤشر الفرع للأمام ولا ينشئ أي كائن التزام جديد.
كم التزاماً والداً (Parent Commits) يمتلك التزام الدمج الناتج عن الدمج الثلاثي القياسي؟
يمتلك التزام الدمج القياسي والدين اثنين: قمة الفرع المستقبِل وقمة الفرع المدمج.
ما اللقطات الثلاث التي يقارنها نظام Git أثناء عملية الدمج الثلاثي (Three-Way Merge)؟
يقارن Git لقطة الجد المشترك الأخير (Merge Base) مع لقطتي قمتي الفرعين.
أي خيار يُلزم Git بإنشاء التزام دمج صريح حتى عندما يكون الدمج السريع ممكناً؟
يمنع الخيار --no-ff الدمج السريع ويُنشئ التزام دمج يحفظ أثر الفرع في السجل.
أي أمر يعرض قائمة بجميع الفروع المحلية التي دُمجت التزاماتها بالفعل داخل الفرع الحالي؟
يعرض الأمر git branch --merged الفروع التي تم دمج عملها بالكامل في الفرع النشط.
يؤدي حذف مؤشر الفرع بالأمر git branch -d بعد دمجه في main إلى مسح جميع الالتزامات التي كُتبت داخله.
خطأ؛ فجميع تلك الالتزامات أصبحت جزءاً من تاريخ الفرع main، وحذف الفرع يزيل ملف المؤشر فقط.
ماذا يفعل الأمر git merge --ff-only <branch> إذا كان المساران قد تفرعا بالتزامات مستقلة؟
يرفض إنشاء التزام دمج ويوقف العملية بأمان لأن المسار ليس خطياً.
أي تركيبة من خيارات git log ترسم مسارات الفروع والتزامات الدمج بيانياً داخل الطرفية؟
يرسم الأمر git log --oneline --graph --decorate شجرة التفرع والدمج بوضوح.