سرفصل‌های آموزشی
آموزش کاربردی گیت برای برنامه نویسان
استراتژی های Git Merge

استراتژی های Git Merge

ادغام هنگام ترکیب دو شاخه اتفاق می افتد. گیت دو یا چند نشانگر commit را دریافت کرده و تلاش می کند بین آنها یک commit پایه مشترک پیدا کند. گیت چند روش مختلف برای پیدا کردن یک commit پایه دارد، این روش ها "استراتژی های ادغام" نامیده می شوند. هنگامی که گیت یک commit پایه مشترک را پیدا می کند یک "merge commit" جدید ایجاد می کند که تغییر ها را باهم ادغام می کند. از لحاظ فنی، merge commit یک commit عادی است که فقط دو والد دارد.

git merge به طور خودکار یک استراتژی ادغام را انتخاب می کند، مگر اینکه به صراحت برای آن مشخص کنیم. دستورات git merge و git pull می توانند گزینه ی  s- (استراتژی) را بپذیرند. گزینه s- را می توان با نام استراتژی ادغام مورد نظر استفاده کرد. اگر به صراحت مشخص نشده باشد، گیت مناسب ترین استراتژی ادغام ارائه شده بر اساس شاخه ها را انتخاب می کند. در ادامه لیستی از استراتژی های ادغام را معرفی می کنیم.

  • Recursive
git merge -s recursive branch1 branch2
  • Resolve
git merge -s resolve branch1 branch2
  • Octopus
git merge -s octopus branch1 branch2 branch3 branchN
  • Ours
git merge -s ours branch1 branch2 branchN
  • Subtree
git merge -s subtree branchA branchB

این استراتژی توسعه یافته ی استراتژی recursive است. هنگام ادغام شاخه ی A و B، اگر B یک زیر شاخه از A باشد، B ابتدا به روز می شود تا منعکس کننده ساختار درخت A باشد. این به روز رسانی در درخت اجداد مشترک که بین A و B به اشتراک گذاشته شده است نیز انجام می شود.

انواع استراتژی های git merge

ادغام صریح

ادغام صریح نوع پیش فرض ادغام است. بخش "صراحت" برای این است که آنها یک commit جدید ایجاد می کنند. این commit تاریخچه ی گیت را تغییر می دهد و به صراحت نشان می دهد که یک ادغام صورت گرفته است. محتوای ادغام شده نیز در این واقعیت صریح است که نشان می دهد که چه commit هایی والدین commit merge هستند. بعضی از تیم ها از ادغام صریح اجتناب می کنند، زیرا مسلما Merge Commit شلوغی ای را به تاریخچه ی پروژه اضافه می کند.

گزینه های استراتژی Recursive Git Merge

استراتژی recursive که در بالا معرفی شد، دارای زیرمجموعه خود از گزینه های عملیاتی است. 

ours

با استراتژی ادغام ours  اشتباه گرفته نشود. این یک گزینه برای حل کردن تداخل ها به صورت خودکار با توجه به نسخه ی ما است که تداخل ها را به نفع نسخه ما حل می کند.

theirs

 گزینه ی theirs مخالف استراتژی ours است و تداخل ها را به نفع درخت ادغام بیرونی حل می کند.

patience

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

diff-algorithim
ignore-*

    ignore-space-change
    ignore-all-space
    ignore-space-at-eol
    ignore-cr-at-eol

مجموعه ای از گزینه هایی که کاراکترهای فضای سفید را هدف قرار می دهند. هر خطی که با زیرمجموعه گزینه پاس داه شده مطابقت داشته باشد نادیده گرفته خواهد شد. 

renormalize

زمانی که ادغام  سه طرفه باشد این گزینه روی تمام درختان، check-out و check-in را اجرا می کند. این گزینه با در نظر گرفتن وضعیت check-in/check-out از روش متفاوتی برای ادغام شاخه ها استفاده می کند.

no-normalize

گزینه renormalize را غیرفعال می کند. این کار متغیر پیکربندی merge.renormalize را بازنویسی می کند.

no-renames

این گزینه فایل هایی که نام آن ها تغییر داده شده را در طول ادغام نادیده خواهد گرفت. 

find-renames=n

این رفتار پیش فرض است. در ادغام recursive تغییر نام مهم است. از پارامتر n می توان برای آستانه ای برای تغییر نام مشابه استفاده کرد. مقدار پیش فرض n، برابر با ۱۰۰٪  است.

find-renames=n

 این گزینه از استراتژی 'subtree' قرض می گیرد. جایی که استراتژی بر روی دو درخت عمل می کند و نحوه مطابقت آن ها بر روی یک پدر و اجداد مشترک را اصلاح می کند، این گزینه به جای آن بر روی metadata مسیر درخت عمل می کند تا آن ها با هم مطابقت داشته باشند.

online-support-icon