كيفية استخدام Git merge
نشرت: 2023-01-03تستخدم Git الفروع لعزل تدفقات التطوير ، لمنع تلوث فرع التحرير المستقر. إن إدخال العمل في فرع إلى التيار الرئيسي يعني دمج الفروع. إليك كيف تفعل ذلك.
ما هو الدمج في Git؟
التحضير لدمج فرع في Git
تنفيذ الدمج
إجراء دمج سريع للأمام في Git
كيفية حل تعارضات الدمج في Git
كل شيء يندمج في النهاية
ما هو الدمج في Git؟
تم تصميم Git لجعل التفرع بسيطًا وسريعًا. على عكس أنظمة التحكم في الإصدارات الأخرى ، فإن التفرع على Git هو أمر تافه. في المشاريع متعددة المطورين على وجه الخصوص ، يعد التفريع أحد الأدوات التنظيمية الأساسية لشركة Git.
جهود تطوير آلية الفروع الجديدة بحيث يمكن تعديل الكود أو إضافته دون التأثير على الكود في الفروع الأخرى ، وخاصة الفرع الرئيسي أو الرئيسي. يحتوي هذا عادةً على الإصدار الثابت من قاعدة التعليمات البرمجية الخاصة بك.
إن عزل هذه التغييرات عن إصدار الكود الثابت الخاص بك أمر منطقي تمامًا. ولكن عاجلاً أم آجلاً ، سيتم اختبار الرمز الجديد ومراجعته وختمه بالمطاط ليتم إدخاله في الفرع الرئيسي. في هذه المرحلة ، تحتاج إلى دمج فرعك في الفرع الرئيسي.
في الواقع ، يمكن أن يكون للفروع فروع فرعية لذلك قد تقوم بدمج فرعك في فرع آخر بدلاً من الفرع الرئيسي. فقط تذكر أن عمليات الدمج تأخذ دائمًا فرعًا واحدًا وتدمجها في فرع مستهدف ، مهما كان هذا الفرع. إذا كنت ترغب في دمج فرعك الرئيسي في فرع آخر ، يمكنك القيام بذلك أيضًا.
مثل معظم الإجراءات في Git ، تقوم بإجراء عمليات دمج في مستودعك المحلي وتدفعها إلى مستودعك البعيد.
التحضير لدمج فرع في Git
لدينا مشروع تطوير صغير مع مستودع Git محلي ومستودع Git بعيد. أنشأنا فرعًا يسمى "bugfix14" من الفرع "الرئيسي" وعملنا على إيجاد حل لخلل ما.
اكتمل هذا العمل ، واختبرنا الكود الخاص بنا. كل شيء يعمل كما هو متوقع. نريد إدخال هذه التغييرات في الفرع الرئيسي بحيث يكون الإصلاح الخاص بنا جزءًا من الإصدار التالي من البرنامج.
هناك القليل من التحضير قبل إجراء الدمج. نحتاج إلى التأكد من أن الفرع المستهدف - في هذه الحالة الفرع "الرئيسي" - والفرع الذي سنقوم بدمجه فيه محدثان.
للقيام بذلك سنستخدم الأمر git status
.
حالة بوابة
- على فرع bugfix14 : هذا هو فرعنا الحالي.
- تم تحديث فرعك بـ "origin / bugfix" : يمتلك الفرع الموجود في المستودع المحلي الخاص بنا نفس محفوظات الالتزام مثل الفرع الموجود في المستودع البعيد. هذا يعني أنهما متطابقان.
- لا شيء للالتزام به لا توجد تغييرات في منطقة التدريج لم يتم الالتزام بها.
- شجرة العمل نظيفة : لا توجد تغييرات غير مُدرجة في دليل العمل.
كل ذلك يشير إلى أن الفرع محدث ، ومن الواضح أننا سنمضي قدمًا. إذا أشار أي من هذه التغييرات إلى وجود تغييرات ، فسنحتاج إلى تنظيمها وتنفيذها ودفعها إلى جهاز التحكم عن بُعد. إذا عمل شخص آخر على هذه الملفات ، فقد نحتاج إلى سحب تغييراته من المستودع البعيد.
فحص الفرع الذي سنقوم بدمجه يبسط عملية الدمج. كما يسمح لنا بالتحقق من تحديثه. دعونا نلقي نظرة على الفرع الرئيسي.
بوابة الخروج سيد
حالة بوابة
نحصل على نفس التأكيدات بأن الفرع "الرئيسي" محدث.
ذات صلة: كيفية اختيار نموذج Git Workflow & Branching Model المناسب لفريقك
تنفيذ الدمج
قبل أن ندمج ، تبدو التزاماتنا هكذا.
كان فرع "bugfix14" متفرّعًا من الفرع "الرئيسي". كان هناك التزام بالفرع "الرئيسي" بعد إنشاء فرع "bugfix14". كان هناك زوجان من الالتزامات في فرع "bugfix14".
لقد تأكدنا من تحديث فرعين لدينا ، وقمنا بفحص الفرع "الرئيسي". يمكننا إصدار الأمر بدمج فرع "bugfix14" في الفرع "الرئيسي".
بوابة دمج bugfix14
يتم الدمج. لا يزال الفرع "bugfix14" موجودًا ، ولكن تم الآن دمج التغييرات التي تم إجراؤها في هذا الفرع في الفرع "الرئيسي".
في هذه الحالة ، ينفذ أمر الدمج دمجًا ثلاثي الاتجاهات . لا يوجد سوى فرعين ، ولكن هناك ثلاث التزامات متضمنة. هم رئيس أي من الفرعين ، والالتزام الثالث الذي يمثل إجراء الدمج نفسه.
لتحديث مستودعنا البعيد ، يمكننا استخدام الأمر git push .
دفع بوابة
يفضل بعض الأشخاص حذف الفروع الجانبية بمجرد دمجهم. يهتم الآخرون بالحفاظ عليها كسجل لتاريخ التنمية الحقيقي للمشروع.
إذا كنت تريد حذف الفرع ، فيمكنك القيام بذلك باستخدام الأمر git branch
مع الخيار -d
(حذف).
فرع git -d bugfix14
لحذف الفرع في المستودع البعيد ، استخدم هذا الأمر:
أصل دفع بوابة - حذف bugfix14
سيكون لديك سجل التزام خطي ، لكنه لن يكون التاريخ الحقيقي.
ذات صلة: كيفية حذف فروع Git على المستودعات المحلية والبعيدة
إجراء دمج سريع إلى الأمام في Git
إذا لم تكن قد قدمت أي التزامات للفرع "الرئيسي" ، فإن سجلك سيبدو هكذا. سيبدو هذا أيضًا إذا قمت بإعادة تأسيس فرع التطوير الخاص بك بحيث يتم إرفاقه بنهاية الفرع "الرئيسي".
نظرًا لعدم وجود التزامات في الفرع "الرئيسي" ، لدمج فرع "bugfix15" ، كل ما يتعين على Git فعله هو توجيه مؤشر الرأس "الرئيسي" إلى آخر التزام لفرع "bugfix15".
يمكننا استخدام الأمر git merge
المعتاد:
بوابة دمج bugfix15
هذا يعطينا هذه النتيجة.
وهو نفس هذا:
وهو بالضبط نفس هذا:
سيقوم Git بإجراء دمج سريع إلى الأمام كلما أمكن ذلك . إذا كانت الالتزامات إلى الفرع "الرئيسي" تعني أن الدمج السريع غير ممكن ، فسيستخدم Git دمجًا ثلاثي الاتجاهات .
لا يمكنك فرض دمج التقديم السريع - قد لا يكون ذلك ممكنًا ، في النهاية - ولكن يمكنك إعلان أنه سيكون دمجًا سريعًا أو لا شيء. هناك خيار يوجه Git لاستخدام دمج التقديم السريع إذا كان ذلك ممكنًا ، ولكن ليس للقيام بدمج ثلاثي الاتجاهات إذا لم يستطع ذلك. الخيار --ff-only
(دمج التقديم السريع فقط).
يدمج هذا الفرع "bugfix15" في الفرع "الرئيسي" ، ولكن فقط إذا كان من الممكن دمج التقديم السريع.
git merge - fff-only bugfix15
سوف يشتكي Git ويخرج إذا لم يكن ذلك ممكنًا.
git merge - fff-only bugfix16
في هذه الحالة ، كانت هناك التزامات للفرع "الرئيسي" ، لذلك لا يمكن دمج التقديم السريع.
كيفية حل تعارضات الدمج في Git
إذا تم تغيير نفس الأجزاء من نفس الملف في كلا الفرعين ، فلا يمكن دمج الفروع. مطلوب تفاعل بشري لحل التعديلات المتضاربة.
هنا ، أجرينا تغييرات على ملف يسمى "rot.c" في فرع يسمى "bugfix17" نريد دمجه مع الفرع "الرئيسي". ولكن تم تغيير "rot.c" في الفرع "الرئيسي" أيضًا.
بوابة دمج bugfix17
عندما نحاول دمجها ، نتلقى تحذيرًا من وجود تعارضات. يسرد Git الملفات المتضاربة ، ويخبرنا بفشل الدمج. يمكننا التراجع تمامًا باستخدام الخيار --abort
:
git merge --abort
لكن حل عمليات الدمج ليس مخيفًا كما يبدو. قام Git ببعض الأعمال لمساعدتنا. إذا قمنا بتحرير أحد الملفات المتضاربة - في حالتنا ، لدينا واحد فقط - فسنجد أقسام التعليمات البرمجية المتضاربة مميزة لنا.
يحد كل تعارض بسبعة أحرف أقل من " <<<<<<<
" وسبعة أحرف أكبر من " >>>>>>>
" ، مع سبعة علامات تساوي " =======
" بينهما .
- الكود الموجود أعلى علامات التساوي هو من الفرع الذي تدمج فيه .
- الكود الموجود أسفل علامة التساوي هو رمز الفرع الذي تحاول دمجه .
يمكنك البحث بسهولة عن مجموعة من المجموعات المكونة من سبعة أحرف والانتقال من تعارض إلى تعارض خلال ملفك. لكل تعارض ، تحتاج إلى اختيار مجموعة التعديلات التي ستحتفظ بها. يجب عليك تحرير الكود الذي ترفضه ، والأسطر المكونة من سبعة أحرف التي أضافها Git.
سنحتفظ بالشفرة من فرع "bugfix17". بعد التحرير ، ملفنا يبدو هكذا.
يمكننا الآن الاستمرار في الدمج. لكن لاحظ أننا نستخدم أمر commit
للقيام بذلك ، وليس أمر merge
.
نلتزم بالتغيير من خلال تنظيم الملف والقيام به كالمعتاد. سوف نتحقق من الحالة قبل إجراء الالتزام النهائي.
git add rot.c
حالة بوابة
git الالتزام -m "Merged bugfix17"
تم الدمج. يمكننا الآن دفع هذا إلى مستودعنا البعيد.
ذات صلة: كيفية الإصلاح أو التحرير أو التراجع عن التزامات Git (تغيير سجل Git)
كل شيء يندمج في النهاية
يجب دمج جميع الفروع ، في النهاية ، حتى لا تصبح التغييرات التي تطرأ عليها يتيمة ونسيانًا.
يعد دمج الفروع أمرًا سهلاً ، لكن التعامل مع النزاعات يمكن أن يصبح معقدًا في الفرق الكبيرة والمشغولة. قد يتطلب حل التعارضات مدخلات من كل مطور فقط لشرح ما يفعله الكود الخاص بهم ولماذا قاموا بإجراء تغييراتهم. يجب أن تفهم ذلك ، قبل أن تتمكن من اتخاذ قرار مستنير بشأن التعديلات التي يجب الاحتفاظ بها.
للأسف ، لا تستطيع Git المساعدة في ذلك.
ذات صلة: هل يجب عليك استخدام عميل واجهة المستخدم الرسومية Git؟