اگر تا به حال روی تیمی کار کرده‌اید که روی یک پایگاه کد بزرگ کار می‌کند، احتمالاً هنگام ایجاد یک درخواست کشش یا ادغام دو شاخه، تداخل ادغام را تجربه کرده‌اید.

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

در این مقاله، با تداخل های ادغام در Git و انواع تداخل های ادغام که ممکن است با آن مواجه شوید آشنا خواهید شد. مهمتر از همه، شما یاد خواهید گرفت که چگونه تضادهای ادغام را در GitHub و با ویرایشگر ادغام سه طرفه VS Code حل کنید.

آنچه را پوشش خواهیم داد

  • تضاد ادغام در Git چیست؟
  • در هنگام بروز تضادهای ادغام چه باید کرد
  • انواع تضادهای ادغام در Git چیست؟
    • تضاد ادغام محتوا
    • تضاد ادغام ساختاری
  • چگونه تضادهای ادغام را در Git حل کنیم
    • نحوه حل تضادهای ادغام در Git با رابط GitHub
    • نحوه حل تضادهای ادغام در Git با کد VS
    • نحوه حل تضادهای ادغام در Git با ویرایشگر ادغام سه طرفه VS Code
  • بسته بندی

تضاد ادغام در Git چیست؟

در Git، یک تضاد ادغام زمانی رخ می دهد که شما یا هر یک از اعضای تیمتان تغییرات متناقضی را در یک فایل از دو شاخه مختلف ایجاد کنید.

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

در بسیاری از موارد، Git به طور خودکار ادغام را برای شما انجام می دهد. اما اگر تغییرات متناقضی در همان فایل ایجاد می کنید، باید آنها را به صورت دستی حل کنید.

یک سناریوی نمونه از تضاد ادغام می تواند به شکل زیر باشد:

  • تو شعبه کار میکنی main و مثلاً در خط 1 یک فایل mytext.txt تغییراتی ایجاد می کنید Hi world.
  • شما به شعبه تغییر می کنید new-feature و شما تغییری در همان خط دو ایجاد می کنید mytext.txt، گفتن Hello earth.

اگر می خواهید شعبه را ادغام کنید new-feature به main، Git نمی تواند به طور خودکار تصمیم بگیرد که کدام یک را بپذیرد Hi world و Hello earth. بنابراین، Git یک خطای تضاد ادغام را ایجاد می کند و به شما می گوید که تضاد را به صورت دستی حل کنید.

در هنگام بروز تضادهای ادغام چه باید کرد

اگر در حین کار تضادهای ادغام رخ دهد، پایان دنیا نیست. Git فقط به شما می گوید “من می خواهم این ادغام را برای شما انجام دهم، اما یک کاری وجود دارد که باید ابتدا برای من انجام دهید”.

هنگامی که این تضادها رخ می دهد و شما سعی می کنید آنها را حل کنید، Git به طور خودکار خطوط متضاد را با علامت کوچکتر برای شما حاشیه نویسی می کند (<علامت مساوی (=و بزرگتر از نماد (>) مثل این:

<<<<<<< 
=======
>>>>>>> 

اسکرین شات-2023-03-28-at-16.36.58

همه چیز بین کمتر از (<) و علائم مساوی (=) تغییر در شاخه فعلی (شاخه ای که در حال ادغام با آن هستید) است. همه چیز بین برابر (=) و بزرگتر از (>) signs تغییر ورودی از شاخه ای است که می خواهید به شاخه دیگری ادغام کنید.

پیشنهاد می‌کنیم بخوانید:  Git Change Commit Message – نحوه ویرایش پیام های Commit با Git Amend

این به شما واگذار می شود که آن حاشیه نویسی ها را حذف کنید و تصمیم بگیرید که می خواهید خطوط متضاد چگونه باشند – می توانید یکی از تغییرات یا هر دوی آنها را بپذیرید.

بنابراین، به‌جای اینکه به تضادهای ادغام به‌عنوان یک مانع نگاه کنید، می‌توانید آنها را فقط به‌عنوان حاشیه‌هایی که باید حذف کنید و چیزهایی که باید بپذیرید یا رد کنید ببینید.

به خواندن این مقاله ادامه دهید تا بتوانید نحوه حل تعارض ادغام را ببینید. اما قبل از آن، بیایید انواع تضادهای ادغام را بررسی کنیم.

انواع تضادهای ادغام در Git چیست؟

دو نوع تضاد ادغام وجود دارد. آن ها هستند تضاد محتوا و تضاد ساختاری.

تضاد ادغام محتوا

تضاد محتوا زمانی اتفاق می‌افتد که تغییراتی که در دو شاخه مختلف ایجاد می‌کنید روی خطوط کد یکسانی در یک فایل تأثیر بگذارد. این منجر به تغییرات متناقضی می شود که نمی توانند به طور خودکار توسط Git ادغام شوند.

به عنوان مثال، شما تغییر را ایجاد کنید display: flex به خط 2 در یک شاخه و تغییر دیگری text-align: center به همان خط 2 در همان فایل در یک شاخه دیگر.

زمانی که این تضاد محتوا اتفاق می افتد، Git روند ادغام را متوقف می کند و از شما می خواهد قبل از حرکت به جلو، تنظیماتی را در کد انجام دهید.

تضاد ادغام ساختاری

تضاد ساختاری زمانی اتفاق می‌افتد که تغییراتی که در دو شاخه مختلف ایجاد می‌کنید روی یک فایل تأثیر می‌گذارند اما خط به خط با یکدیگر تضاد ندارند. در عوض، تغییرات بر ساختار یا سازماندهی فایل تأثیر می گذارد، مانند تغییر نام یک متغیر، یا تابع، یا جابجایی یک بلوک از کد.

اگر این تضاد ساختاری اتفاق بیفتد، Git نمی‌تواند تعیین کند که کدام یک از تغییرات را بپذیرد و از شما می‌خواهد تصمیم بگیرید که کدام تغییرات را می‌خواهید.

چگونه تضادهای ادغام را در Git حل کنیم

برای اینکه به شما نشان دهم چگونه تضادهای ادغام را حل کنید، Git را در یک پوشه کاری (پوشه) با اجرا مقداردهی اولیه کردم git init. من همچنین یک شعبه جدید ایجاد کرده ام new-feature با دویدن git checkout -b new-feature.

در حال دویدن git branch نشان می دهد که من شعبه دارم main و new-feature:

اسکرین شات-2023-03-28-at-11.51.38

من همچنین هر دو شاخه را به GitHub هل داده ام، بنابراین می توانم به شما نشان دهم که چگونه تضادهای ادغام را در GitHub حل کنید:

اسکرین شات-2023-03-28-at-11.52.10

من مقداری کد به فایل های HTML و جاوا اسکریپت در دایرکتوری اضافه کرده ام. من چند درگیری را در دو فایل ایجاد کردم و برخی از تعهدات را انجام دادم:

اسکرین شات-2023-03-28-at-11.53.19

نحوه حل تضادهای ادغام در Git با رابط GitHub

از آنجایی که من فشار داده ام new-feature به GitHub شعبه کنید، GitHub از من می خواهد که یک درخواست کشش ایجاد کنم new-feature شعبه به ادغام خواهد شد main:

اسکرین شات-2023-03-28-at-12.00.23

در این حالت، بلافاصله روی “مقایسه و کشیدن” کلیک کنید، خواهید دید که امکان ادغام خودکار وجود ندارد زیرا یک تضاد وجود دارد:

اسکرین شات-2023-03-28-at-13.10.15

این به این معنی است که یک درگیری وجود دارد که باید حل کنید. درخواست کشش را ایجاد کنید و به پایین بروید تا ببینید کجا می‌توانید تضاد را حل کنید، سپس روی دکمه «رفع تداخل‌ها» کلیک کنید:

اسکرین شات-2023-03-28-at-13.12.39

هنگامی که روی “رفع تداخل ها” کلیک می کنید، یک ویرایشگر دریافت می کنید و در سمت راست، لیست فایل هایی را خواهید دید که دارای تداخل هستند:

اسکرین شات-2023-03-28-at-13.15.12

در ویرایشگر، خطوطی را می بینید که در آن تضادها رخ داده است:

اسکرین شات-2023-03-28-at-13.16.24

می بینید که تغییرات در شاخه ورودی بین کمتر از (<) و برابر با (=) نشانه ها، در حالی که تغییرات در شاخه ای که می خواهید در آن ادغام شوید با بیش از () احاطه شده است.>) و برابر با (=) نشانه ها

پیشنهاد می‌کنیم بخوانید:  روش نصب Git بر روی CentOS 7

خط مورد نظر خود را انتخاب کنید، حاشیه نویسی ها را بردارید و روی «علامت گذاری به عنوان حل شده» در گوشه بالا سمت راست کلیک کنید:

اسکرین شات-2023-03-28-at-13.20.10

همین فرآیند را برای هر فایل دیگری که دارای تضاد(ها) است نیز تکرار کنید.

اگر بخواهید می توانید هر دو خط را نگه دارید. فقط مطمئن شوید که حاشیه نویسی را حذف کرده اید.

پس از انجام این کار، روی “Commit merge” در گوشه سمت راست بالا کلیک کنید:

اسکرین شات-2023-03-28-at-13.23.46

اکنون، دیگر نباید تضاد ادغام وجود داشته باشد:

اسکرین شات-2023-03-28-at-13.24.30

نحوه حل تضادهای ادغام در Git با کد VS

بسیاری از ویرایشگرهای کد محبوب دارای رابط هایی برای حل یک تضاد ادغام زمانی هستند که می خواهید به صورت محلی ادغام شوید.

هنگامی که به شاخه ای که می خواهید در آن ادغام شده و اجرا کنید جابجا می شوید git merge branch-to-merge، از شما خواسته می شود تا برخی از درگیری ها را حل کنید (در صورت وجود). اگر تداخل هایی برای حل وجود داشته باشد، رابط در VS Code به این شکل است:

اسکرین شات-2023-03-28-at-12.21.03

در این مرحله، اگر برای حل تضادها آماده نیستید، می توانید با اجرا کردن، ادغام را لغو کنید git merge --abort.

اما اگر می‌خواهید تضادها را حل کنید، می‌توانید تغییرات ورودی را بپذیرید، تغییر فعلی را بپذیرید یا هر دو تغییر را بپذیرید.

اگر یکی از این سه مورد را انتخاب کنید، تضاد(های) ادغام حل خواهد شد. پس از آن، فایل را اضافه کنید و آن را به روش معمول انجام دهید:

git add .
git commit -m "<commit message>"

نحوه حل تضادهای ادغام در Git با ویرایشگر ادغام سه طرفه VS Code

همچنین می‌توانید تداخل را با ویرایشگر ادغام سه‌طرفه VS Code تغییر دهید.

بعد از دویدن git merge <branch-to-merge>، روی دکمه “Resolve in Merge Editor” کلیک کنید

خواهید دید که اکنون 3 بازدید دارید. تغییرات شاخه ورودی را در سمت راست، تغییرات شاخه ای که می خواهید در آن ادغام شوید در سمت راست (شاخه فعلی) و پیش نمایش زیر این دو را مشاهده خواهید کرد:

اسکرین شات-2023-03-28-at-14.32.49-کپی

اکنون با انتخاب هر یک از گزینه های موجود، شروع به حل تضادها کنید:

  • پذیرش ورودی
  • پذیرش ترکیب (ابتدا ورودی)
  • فعلی را بپذیرید
  • پذیرش ترکیب (اول فعلی)

ورودی تغییر در شاخه‌ای است که می‌خواهید در شاخه هدف ادغام کنید، و فعلی تغییری است که قبلاً در شاخه‌ای که می‌خواهید در آن ادغام شوید.

به هر فایل سوئیچ کنید، روی دکمه “Resolve in Merge Editor” کلیک کنید و هر یک از گزینه ها را در آنجا انتخاب کنید.

اسکرین شات-2023-03-28-at-14.31.34

همچنین می توانید با وارد کردن کد مناسب در هر یک از فایل ها، تضادها را برطرف کنید.

هنگامی که راضی شدید، در هر ویرایشگر ادغام، روی “Complete Merge” کلیک کنید:

اسکرین شات-2023-03-28-at-14.32.49

شما باید فایل ها را دوباره اضافه کنید و آنها را commit کنید:

git add .
git commit -m "<commit-message>"

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

اسکرین شات-2023-03-28-at-15.01.54

بسته بندی

همانطور که دیدید، داشتن تضاد Git آنقدرها هم که به نظر می رسد ترسناک نیست و حل آن کار غیرممکنی نیست. شما معمولاً می توانید آن را مستقیماً در GitHub یا در ویرایشگر متن خود حل کنید. ویرایشگر ادغام 3 طرفه VS Code نیز یک راه مناسب برای حل تعارض ادغام است.

اگر یک PR برای یک پایگاه کد بزرگ ایجاد کرده‌اید و با یک تضاد ادغام مواجه هستید، راه دیگری که می‌توانید آن را حل کنید ممکن است با اجرای مجدد با main استفاده کنید. git pull --rebase upstream main (به عنوان مورد ممکن است). پس از آن، یک رابط برای حل تداخل ها و فایل های حاوی تداخل ها به شما نمایش داده می شود. وقتی کارتان تمام شد، بدوید git add .، git rebase --continue، و سپس فشار را به شاخه خود فشار دهید.