كيفية حل تعارض الدمج في Git
- Mohamed ali CHAABANI
- 3 يوليو 2024
- 4 دقيقة قراءة

المقدمة
عند استخدام Git للتحكم في الإصدارات، قد تحدث تعارضات الدمج عندما يتم إجراء تغييرات مختلفة على نفس الجزء من الملف في فروع مختلفة. يحدث هذا عندما يتعذر على Git حل الفروق تلقائيًا ويتطلب تدخلًا يدويًا لتحديد التغييرات التي يجب الاحتفاظ بها. هذه الحالة شائعة في المشاريع التعاونية حيث يعمل العديد من المساهمين على نفس قاعدة الشفرة.
فيما يلي أسباب معاناة Git أحيانًا مع عمليات الدمج ولماذا قد تظهر تعارضات في ملفك:
قرارات الدمج غير التلقائية: يمكن لـ Git دمج التغييرات تلقائيًا فقط عندما تكون في أجزاء مختلفة من الملف أو تكون غير متعارضة. إذا تداخلت التغييرات أو تعارضت (أي تم تغيير نفس السطور بشكل مختلف في الفروع التي يتم دمجها)، لا يمكن لـ Git تحديد الإصدار الذي يجب الاحتفاظ به ("الخاص بنا" أو "الخاصة بهم") دون تدخل بشري.
التغييرات المعقدة: التغييرات المعقدة مثل إعادة الهيكلة أو إعادة تسمية الملفات أو إعادة هيكلة الشفرة بشكل كبير يمكن أن تؤدي إلى سيناريوهات دمج أكثر تعقيدًا حيث قد لا تكفي قدرات الدمج التلقائي لـ Git.
التعديلات المتزامنة: عندما يقوم عدة مطورين بتعديل نفس سطور الشفرة ويحاولون دمج هذه التغييرات، فمن المرجح أن تحدث تعارضات. هذا سيناريو شائع في المشاريع النشطة.
استراتيجيات الدمج المختلفة: لدى Git استراتيجيات مختلفة للدمج (مثل recursive، resolve، إلخ)، وأحيانًا قد لا تكون الاستراتيجية الافتراضية هي الأفضل لسيناريو دمج معين، مما قد يؤدي إلى تعارضات غير متوقعة.
التعامل الخاص بالأدوات: الأدوات مثل GitHub Desktop أو عملاء Git الآخرين قد تتعامل مع عمليات الدمج بشكل مختلف قليلاً. تعتمد هذه الأدوات عمومًا على آليات الدمج الداخلية لـ Git ولكن قد تحتوي على طبقات إضافية من المعالجة أو الواجهات لحل التعارضات.
علامات التعارض: عندما يحدث تعارض، يقوم Git بوضع علامات التعارض (<<<<<<<، =======، >>>>>>>) في الملف لتمثيل التغييرات المتعارضة بصريًا. تحدد هذه العلامات التغييرات من الفروع المختلفة، ويجب عليك تحرير الملف يدويًا لحل التعارض.
لحل هذه التعارضات في أداة مثل Visual Studio Code، عادةً تقوم بـ:
فتح الملف المتعارض.
البحث عن علامات التعارض.
تحديد التغييرات التي يجب الاحتفاظ بها (من "الخاص بنا"، "الخاصة بهم"، أو مزيج من الاثنين).
إزالة علامات التعارض.
حفظ الملف.
تهيئة الملف (git add) والقيام بدمج الالتزام(commit).
فهم وحل تعارضات الدمج هو مهارة أساسية في تطوير البرمجيات التعاوني. من الجيد دائمًا المزامنة والدمج بشكل متكرر لتقليل احتمالية حدوث تعارضات كبيرة ومعقدة.
علامات الدمج
في أنظمة التحكم في الإصدارات مثل Git، تشير علامات <<<<<<<، =======، و >>>>>>> إلى مناطق مختلفة في تعارض الدمج. لنوضح الغرض منها:
>>>>>>>: تشير هذه العلامة إلى بداية التغييرات المتعارضة من الفرع الحالي. بعد هذه العلامة، ستجد التغييرات التي في فرعك الحالي (الذي تحاول دمجه مع فرع آخر أو الفرع الذي كنت عليه عند حدوث تعارض الدمج).
=======: تقسم هذه العلامة بين تغييراتك والتغييرات في الفرع الآخر. إنها حدود تفصل بين مجموعتين مختلفتين من التغييرات.
: تشير هذه العلامة إلى نهاية التغييرات المتعارضة من الفرع الآخر (الفرع الذي تحاول الدمج معه أو الذي يحتوي على تغييرات تتعارض مع تغييراتك). بعد هذه العلامة، ستجد التغييرات التي في الفرع الآخر.
عندما يحدث تعارض الدمج، يتعذر على Git حل الفروق في الشفرة بين فرعين تلقائيًا لأن التغييرات في نفس أجزاء الملفات. لذلك، يقدم Git كلا الإصدارين للمستخدم، محاطين بهذه العلامات، حتى تتمكن من حل التعارض يدويًا.
لحل تعارض الدمج، عادةً تقوم بـ:
النظر في الشفرة بين ======= و >>>>>>> لفهم التغييرات في الفرع الحالي.
النظر في الشفرة بين <<<<<<< و ======= لفهم التغييرات في الفرع الآخر.
تحديد الشكل النهائي للشفرة. قد يتضمن ذلك اختيار مجموعة واحدة من التغييرات على الأخرى، أو دمج عناصر من كلتا المجموعتين، أو إجراء تغييرات جديدة تمامًا.
إزالة علامات التعارض (<<<<<<<، =======، و >>>>>>>) والتأكد من أن الشفرة في الحالة النهائية المطلوبة.
بمجرد حل التعارض، تقوم بعد ذلك بإضافة الملف إلى منطقة التهيئة والالتزام بالتغييرات لإكمال عملية الدمج.
تذكر، حل تعارضات الدمج هو جزء شائع من العمل مع أنظمة التحكم في الإصدارات، وهي مهارة مهمة لتطويرها لضمان تناسق الشفرة ومنع الأخطاء.
استراتيجيات الدمج
يقدم Git العديد من استراتيجيات الدمج للتعامل مع سيناريوهات مختلفة عند دمج الفروع. تحدد هذه الاستراتيجيات كيفية محاولة Git دمج التغييرات. الاستراتيجيات الأكثر استخدامًا هي:
Resolve:
هذه هي الاستراتيجية الافتراضية للدمج غير الأكتوبوسي (أي عند دمج رأسين). إنها جيدة للحالات التي لا تتباعد فيها الفروع بشكل كبير. تحاول استراتيجية resolve اكتشاف غموض دمج متقاطع بعناية وتعتبر الخيار الأكثر أمانًا، حيث تتوقف وتطلب تدخلًا بشريًا عند العثور على تعارضات.
Recursive:
هذه هي الاستراتيجية الافتراضية عند دمج أكثر من رأسين (دمج أكتوبوسي). إذا كانت هناك عدة أسلاف مشتركة، فإنها تنشئ شجرة مدمجة للأسلاف المشتركة ثم تستخدم تلك كمرجع للدمج ثلاثي الاتجاهات. يمكن لهذه الاستراتيجية التعامل بفعالية مع عمليات الدمج المعقدة مع أكثر من سلف مشترك.
Octopus:
تستخدم هذه الاستراتيجية لدمج أكثر من فرعين. إنها استراتيجية تقدم سريع ترفض دمج التغييرات التي تؤدي إلى تعارضات. تُستخدم استراتيجية الأكتوبوسي أساسًا لتوحيد عدة فروع موضوعية في فرع واحد.
Ours:
تستخدم هذه الاستراتيجية لقمع تغييرات المحتوى من فرع آخر. تحتفظ بمحتوى الفرع الحالي وتتجاهل التغييرات من الفرع الآخر الذي يتم دمجه. إنها مفيدة في السيناريوهات التي تريد فيها تسجيل الدمج دون فعليًا دمج التغييرات، مثل في أنواع معينة من إدارة الفروع أو استراتيجيات سير العمل.
Theirs:
على العكس من استراتيجية "الخاص بنا"، تحتفظ هذه الاستراتيجية بمحتوى الفرع الذي يتم دمجه وتتجاهل التغييرات من الفرع الحالي. نادرًا ما تُستخدم هذه الاستراتيجية ولكنها يمكن أن تكون مفيدة في سيناريوهات محددة، مثل تجاوز التغييرات المحلية بالإصدار من فرع بعيد.
Subtree:
تعد هذه الاستراتيجية مفيدة بشكل خاص عند دمج المشاريع التي لها تاريخ مشترك ولكن تم فصلها إلى مستودعات مختلفة. تحاول ضبط المسارات في الشجرة لتتناسب مع هيكل الدليل ويمكن استخدامها لدمج مستودع آخر في دليل فرعي من المستودع الحالي.
الخاتمة
لكل من هذه الاستراتيجيات حالة استخدام خاصة بها ويمكن اختيارها باستخدام خيار -s أو --strategy في أمر git merge. على سبيل المثال، يمكنك استخدام git merge -s ours other-branch لتنفيذ دمج باستخدام استراتيجية "الخاص بنا".
من المهم اختيار استراتيجية الدمج الصحيحة بناءً على متطلبات سيناريو الدمج المحدد. في كثير من الحالات، تعمل استراتيجيات "recursive" أو "resolve" الافتراضية بشكل جيد، ولكن في السيناريوهات الأكثر تعقيدًا أو سير العمل المحدد، قد تحتاج إلى اختيار استراتيجية مختلفة.
Comments