ادغام هنگام ترکیب دو شاخه اتفاق می افتد. گیت دو یا چند نشانگر 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 مسیر درخت عمل می کند تا آن ها با هم مطابقت داشته باشند.