مقدمه

تداخل یا تعارض در ادغام (Merge Conflict) یکی از آن مفاهیمی است که اغلب باعث ترس توسعه‌دهندگان تازه‌کار می‌شود. اما این پدیده یک اتفاق کاملاً طبیعی و اجتناب‌ناپذیر در کار تیمی است. تداخل یک باگ یا یک خطا نیست؛ بلکه یک پیام از طرف گیت است که به شما می‌گوید: «من نمی‌توانم به تنهایی تصمیم بگیرم که کدام تغییر صحیح است، لطفاً به من کمک کن».

درک اینکه یک تداخل چرا و چگونه رخ می‌دهد و یادگیری روش حل آن، یکی از مهارت‌های ضروری برای هر کاربری است که با گیت کار می‌کند. در این درس، این مفهوم را کالبدشکافی کرده و فرآیند حل آن را به صورت گام به گام یاد می‌گیریم.

یک Merge Conflict چرا و چگونه رخ می‌دهد؟

یک تداخل زمانی اتفاق می‌افتد که شما سعی می‌کنید دو برنچ را با هم ادغام کنید و گیت با تغییرات متناقضی در یک فایل روبرو می‌شود. به طور مشخص، این حالت زمانی رخ می‌دهد که:

دو نفر، خطوط یکسانی را در یک فایل در دو برنچ مختلف تغییر داده باشند.

برای مثال، فرض کنید شما در برنچ feature، تیتر صفحه اصلی را به «خوش آمدید» تغییر می‌دهید. همزمان، همکار شما در برنچ main، همان تیتر را به «سلام دنیا» تغییر می‌دهد. وقتی شما تلاش می‌کنید main را در برنچ خود ادغام کنید (یا برعکس)، گیت نمی‌داند کدام نسخه از تیتر باید باقی بماند. این یک تداخل است.

شناسایی یک Conflict

وقتی یک تداخل رخ می‌دهد، گیت فرآیند ادغام را متوقف کرده و به شما هشدار می‌دهد. شما این هشدار را هم در خط فرمان و هم در رابط کاربری گیت‌هاب مشاهده خواهید کرد. در گیت‌هاب، دکمه سبز رنگ «Merge» غیرفعال شده و پیامی مبنی بر وجود تداخل نمایش داده می‌شود.

گیت فایل‌هایی را که دچار تداخل شده‌اند، به شکل خاصی تغییر می‌دهد. اگر فایل مورد نظر را باز کنید، محتوایی شبیه به این خواهید دید:

<<<<<<< HEAD
This is my change.
=======
This is their change.
>>>>>>> other-branch-name

گیت از این نشانگرها برای نمایش بخش‌های متناقض استفاده می‌کند:

  • <<<<<<< HEAD: هر چیزی بین این نشانگر و خط =======، محتوای مربوط به برنچ شما (برنچ فعلی که در آن هستید) است.
  • =======: این خط جداکننده بین دو نسخه متناقض است.
  • >>>>>>> other-branch-name: هر چیزی بین جداکننده و این نشانگر، محتوای مربوط به برنچ دیگر (برنچی که در حال ادغام آن هستید) است.

فرآیند گام به گام حل Conflict

حل یک تداخل به معنی ویرایش دستی فایل‌های متناقض و انتخاب نسخه نهایی است.

  1. شناسایی فایل‌ها: با اجرای دستور git status، لیستی از فایل‌هایی را که در حالت «Unmerged paths» قرار دارند، مشاهده خواهید کرد. این‌ها فایل‌های دارای تداخل شما هستند.
  2. باز کردن و ویرایش فایل: هر یک از فایل‌های متناقض را در ویرایشگر کد خود باز کنید.
  3. تصمیم‌گیری: حالا باید تصمیم بگیرید که نسخه نهایی کد چه باید باشد. شما سه انتخاب دارید:
    • تغییرات خودتان را نگه دارید و تغییرات دیگری را حذف کنید.
    • تغییرات دیگری را نگه دارید و تغییرات خودتان را حذف کنید.
    • هر دو تغییر را با هم ترکیب کنید (مثلاً بخشی از کد خودتان و بخشی از کد دیگری).
    هدف نهایی، رسیدن به یک کد معتبر و صحیح است.
  4. حذف نشانگرهای Conflict: پس از تصمیم‌گیری، باید تمام نشانگرهایی که گیت اضافه کرده (<<<<<<<, =======, >>>>>>>) را به صورت دستی از فایل پاک کنید. فایل نهایی شما باید فقط حاوی کدی باشد که می‌خواهید باقی بماند.
  5. افزودن فایل حل‌شده به Stage: پس از ویرایش و ذخیره فایل، باید آن را با دستور git add به Staging Area اضافه کنید. این کار به گیت اعلام می‌کند که شما تداخل آن فایل را حل کرده‌اید.
    git add conflicted-file.js
  6. تکمیل فرآیند ادغام: پس از اینکه تمام فایل‌های متناقض را add کردید، کافیست دستور git merge --continue (یا اگر در حین rebase بودید git rebase --continue) را اجرا کنید. گیت یک کامیت ادغام جدید ایجاد کرده و فرآیند را تکمیل می‌کند.

بسیاری از ویرایشگرهای کد مدرن مانند VS Code ابزارهای بصری بسیار خوبی برای حل تداخل ارائه می‌دهند که به شما اجازه می‌دهند با کلیک روی دکمه، نسخه مورد نظر خود را انتخاب کنید و این فرآیند را ساده‌تر می‌سازند.