عندما يتعذر على Git دمج فرعين تلقائيًا، فإنه يتوقف مؤقتًا ويترك لك التغييرات المتعارضة لتسويتها. على جهاز Mac، استخدم git status للعثور على الملفات المتأثرة، ومقارنة كلا الإصدارين، وتعديل كل تعارض للوصول إلى نتيجة مدمجة ومدروسة، ثم تجهيز التغييرات وإنهاء الدمج. يكمن السر في الحفاظ على الغرض من كلا التغييرين، وليس قبول أحد الطرفين بشكل أعمى أو افتراض أن الاحتفاظ بكلا المقطعين سينتج عنه كود برمجي صالح للعمل.
تأكيد العملية وحماية التعديلات غير المكتملة
افتح تطبيق Terminal أو الوحدة الطرفية المدمجة في محرر النصوص لديك، وانتقل إلى المستودع، وتحقق من حالته:
cd "/path/to/repository"
git status
استخدم مسار المجلد الفعلي بدلاً من المثال. تخبرك حالة Git بالملفات غير المدمجة وما إذا كانت العملية الحالية دمجًا (merge) أو إعادة تأسيس (rebase) أو إجراءً آخر. يغطي هذا المقال عملية الدمج. في حالة الدمج العادي، يترك Git الفرع الحالي مكانه أثناء انتظاره منك لحل التعارضات؛ حيث يتم تحديث المسارات التي دُمجت بسلاسة بالفعل، بينما تتطلب المسارات المتعارضة مراجعة. وثائق git merge الخاصة بـ Git
إذا كان لديك عمل غير محفوظ بتثبيت (uncommitted) من قبل البدء في الدمج، فاحرص على عدم الكتابة فوقه أثناء التعديل. توثق Git الأمر git merge --abort كوسيلة لإيقاف الدمج، ولكنها تنوه إلى أنه قد لا يتمكن دائمًا من استعادة التغييرات غير المثبتة السابقة. إذا كانت الحالة غير واضحة، فاحفظ نسخة منفصلة من التعديلات المحلية المهمة قبل المتابعة. لا تقم بالإلغاء إلا عندما تنوي إيقاف الدمج، وتفقد الحالة الناتجة بعد ذلك. تعليمات تعارض الدمج في Git
قراءة كل تعارض كاقتراحين اثنين
افتح كل ملف وارد في القائمة داخل محرر نصوص. يتم عادةً تحديد التعارض النصي بهذا الشكل:
<<<<<<< HEAD
current branch version
=======
incoming branch version
>>>>>>> branch-name
النص الموجود أعلى ======= يمثل عمومًا إصدار الفرع الحالي؛ بينما يمثل النص الموجود أسفله عمومًا الفرع الذي يجري دمجه. قد تختلف التسميات. يسجل Git السلف المشترك وإصداري كلا الفرعين في الفهرس، ويعرض ملف العمل نتيجة تتضمن علامات التعارض لتتمكن من تعديلها. وثائق الدمج في Git
تعامل مع القسمين كدليل على التغييرات المقصودة، وليس كخيارات يجب عليك قبول أحدها بالكامل. اسأل نفسك عما كان يحاول كل تعديل تحقيقه. قد يضيف أحد الطرفين شرط تحقق من صحة البيانات بينما يغير الطرف الآخر اسم أحد الحقول؛ قد يعني الحفاظ على كليهما دمجهما في شرط واحد محدث. بالنسبة للتعارض على مستوى الملف، مثل قيام أحد الطرفين بحذف ملف بينما يعدله الآخر، حدد ما إذا كان يجب الإبقاء على الملف، وقم بتضمين التعديلات المطلوبة إذا كان الأمر كذلك. إذا لم يكن القصد واضحًا من الأسطر، فتحقق من الكود المحيط به أو اسأل صاحب التغيير قبل اتخاذ القرار.
أزل جميع علامات التعارض واكتب إصدارًا نهائيًا متماسكًا. لا تترك كلا المقطعين متتاليين لمجرد دمجهما إلا إذا كان هذا هو ما يجب أن يحتويه البرنامج أو المستند. فالإبقاء على كليهما قد يؤدي إلى تكرار التعريفات، أو تجاوز السلوك البرمجي، أو كتابة صياغة برمجية غير صالحة. وفي المقابل، فإن اختيار مقطع واحد فقط قد يؤدي إلى تجاهل عمل مفيد من الفرع الآخر. يعتمد الحل الصحيح على سياق الملف والغرض من كل تغيير.
مراجعة الملفات المحلولة وتجهيزها (Stage)
احفظ الملف المعدل، ثم عاين التغييرات. بالنسبة للملف المتعارض، يعرض git diff عمل حل التعارض الذي لا يزال موجودًا في شجرة العمل لديك. تحقق من السياق المحيط بالكامل، وليس فقط الأسطر التي احتوت على التعارض. ابحث عن أي علامات متبقية باستخدام خاصية البحث في المحرر، أو استخدم هذا الأمر داخل المستودع:
git grep -n -E '^(<<<<<<<|=======|>>>>>>>)'
إذا عثر على تطابقات، فراجعها: قد تحتوي المستندات الرسمية أو بيانات الاختبار على هذه النصوص، لذا لا تحذف التطابقات دون تمييز. بمجرد أن تصبح نتيجة الملف صحيحة، قم بتجهيزه بتمرير مساره الموضوع بين علامتي اقتباس إلى git add، على سبيل المثال git add "Sources/Example.swift". يخبر التجهيز Git بأنه تم حل التعارض في الملف؛ ولكنه لا يثبت صحة النتيجة برمجياً. تتمثل تعليمات Git في تعديل كل تعارض، وإضافة المسارات المحلولة، ثم تثبيت الدمج أو متابعته. وثائق دمج Git
لسير عمل مرئي على نظام Mac، يعرض Visual Studio Code الملفات المتعارضة ضمن Merge Changes في قسم Source Control. افتح الملف واستخدم إجراءات حل التعارض المضمنة أو Open in Merge Editor لفحص الطرف الحالي والطرف القادم والنتيجة. يؤدي إجراء Accept Both Changes في المحرر إلى الاحتفاظ بكلا القسمين بالتسلسل؛ راجع الملف الناتج وادمج المحتوى أو عدله عند الحاجة. احفظ النتيجة وجهز الملف في Source Control. تنطبق عناصر التحكم هذه على VS Code؛ وقد تستخدم برامج التحرير الأخرى تسميات أو ميزات مختلفة. دليل تعارضات الدمج في VS Code
إنهاء الدمج والتحقق من النتيجة
بعد حل وتجهيز كل ملف متعارض، تحقق من الحالة مرة أخرى:
git status
git diff --cached
راجع الفروقات المجهزة للتأكد من ظهور كلا الإسهامين المقصودين بشكل نهائي سليم ومن عدم تضمين أي تعديلات غير ذات صلة. قم بتشغيل الاختبارات والفحوصات ذات الصلة بالمشروع إن وجدت؛ إذ لا يمكن لـ Git تحديد ما إذا كان المنطق المدمج يعمل على النحو المنشود أم لا.
بالنسبة للدمج عبر سطر الأوامر، أكمل العملية باستخدام git merge --continue (أو ثبت الدمج عند توجيه Git لك للقيام بذلك). يتحقق الأمر --continue الخاص بـ Git من وجود عملية دمج قيد التنفيذ قبل إنشاء التثبيت. ثم شغّل git status مرة أخرى للتأكد من انتهاء عملية الدمج. إذا أبلغ Git عن المزيد من التعارضات، فقم بحل تلك الملفات وتجهيزها أيضًا. تعليمات الدمج في Git
يُعتبر التعارض محلولاً بأمان عندما يراعي الملف النهائي عن قصد العمل المطلوب من كلا الفرعين، وتتطابق الفروقات المجهزة مع تلك النتيجة، ويكتمل الدمج. عندما يتعذر عليك تحديد ما كان يهدف إليه أحد الطرفين، توقف مؤقتًا وافهم السياق المطلوب قبل تجاهله أو إعادة كتابته.
المصادر
Git - توثيق git-merge — Git
حل تعارضات الدمج في VS Code — Microsoft