در این مطلب مقدمهای بر Git merge و Git rebase در اختیارتون قرار میگیره و متوجه میشید که چه چیزی هستند و چه موقع باید از اونا استفاده کنید.
به عنوان Developer، در اکثر مواقع باید بین Rebase و Merge یکی رو انتخاب کنیم. بیشتر جاهایی که در اینترنت جستجو میکنیم، بیان شده که تا جایی که میتونین از Rebase استفاده نکنید، چون میتونه باعث به وجود اومدن مشکل جبران نشدنی بشه و خیلیها از اون میترسن و درصد افرادی که از Rebase استفاده میکنن خیلی کمتره.
Git merge و Git rebase تقریبا برای یک منظور مورد استفاده قرار میگیرن و با استفاده از اونا میتونین دو branch رو با هم ادغام کنید. با وجود اینکه هدف هر دو یکی هست، ولی به روشهای مختلفی انجام میشن. حالا سوالی که پیش میاد اینه که کدام روش رو انتخاب کنیم؟
فرض کنیم که یک Repository بصورت زیر داریم:
همونطور که مشاهده میکنید در Repository بالا دو شاخه با نامهای master و feature وجود داره. شاخه feature از شاخه master گرفته شده و 2 commit در اون قرار گرفته است. بعد از گرفته شدن شاخه feature تغییراتی در شاخه master نیز به وجود اومده و 2 Commit نیز در اون اضافه شده است. حالا فرض کنید که میخوایم این شاخهها رو با هم ادغام کنیم. حالا میخوایم بررسی کنیم که این متدها چطور میتونن این کار رو برای ما انجام بدن.
استفاده از Merge
زمانی که شما commit جدید رو بصورت اتوماتیک به وجود میاره و تاریخچهای از commitهای اجدادش (همون شاخههایی که قرار هست با هم ادغام بشن) رو در خودش نگه میداره. تصویر repository بعد از merge شدن بصورت زیر خواهد بود:
یک نوع merge به نام fast forward هست که commit جدیدی رو به وجود نمیاره و در عوض نشانگر یا pointer مربوط به شاخه رو به آخرین commit میبره.
نحوه merge کردن
در اینجا میخوایم با استفاده از دستورهای checkout و merge، شاخه master رو در شاخه feature ادغام یا merge کنیم. برای اینکار بصورت زیر عمل میکنیم:
$ git checkout feature $ git merge master
میبینید که در ابتدا وارد شاخه feature شدیم و بعد از اون شاخه master رو در اون merge کردیم. دستور بالا رو خلاصه شده میتونیم بصورت
مورد استفاده قرار بدیم. با اینکار شاخهها ادغام میشن و یک commit جدید در شاخه feature به وجود میاد که تاریخچهای از دو شاخه ادغام شده رو در خودش قرار میده.استفاده از Rebase
Rebase تغییرات یک شاخه رو بدون ساختن commit جدید در شاخه دیگه بازنویسی میکنه. برای هر commit ای که در شاخه feature وجود داره و در شاخه master نیست، یک commit جدید در بالا یا آخر شاخه master ساخته میشه. تصویر Repository بعد از Rebase شدن بصورت زیر خواهد شد:
نحوه Rebase کردن
با استفاده از دستورات زیر میتونین شاخه feature رو در شاخه master یا شاخه اصلی Rebase کنید.
$ git checkout feature $ git rebase master
با اینکار هر commit ای که در شاخه feature هست و در شاخه master وجود ندارد در بالا یا انتهای master قرار میگیره. برای اینکار commitهای جدیدی در master ساخته میشه که هر کدام شبیه به commit اصلی در شاخه feature هستند.
معایب و مزایای merge کردن
مزایا:
- استفاده و فهم اون راحته
- context شاخه منبع همیشه میمونه
- commitهای source branch از دیگر شاخهها جدا هست.
- تاریخچه Commitها و کارهایی که انجام دادین برقرار میمونه و با نگاه کردن به اون متوجه کارهایی که انجام دادین خواهید شد.
معایب:
- تاریخچه Commitها خیلی شلوغ و قر و قاطی میشه به دلیل اینکه افراد زیادی بصورت همزمان بر روی شاخهها کار میکنن. مثلا امکان داره تاریخچه Commitها بصورت زیر بشه که خیلی قابل فهم نیست و گیجکننده هست:
- خطایابی با استفاده از git bisect به دلیل به وجود اومدن یک commit جدید در زمان merge شدن سختتر میشه.
معایب و مزایای rebase کردن
مزایا:
- خوانایی تارخچه خیلی خوب و ساده هست
- دستکاری کردن در تاریخچه یک commit تکی از تاریخچه چند شاخه جداگانه با commitهای متنوع مربوط به خودشان، سادهتر هست.
- پیامهای commitها سادهتر هست و زودتر میتونیم خطایابی کنیم و باگها رو پیدا کنیم.
معایب:
- Rebase کردن میتونه context رو مخفی کنه.
- Rebase کردن با Pull Request کار نمیکنه به دلیل اینکه متوجه نمیشید که چه تغییراتی به وجود اومده است. بازنویسی و تغییر دادن history یا تاریخچه برای کارهای تیمی خوب نیست.
- در هنگام استفاده از Rebase کردن باید خیلی بیشتر حواستون به کارهایی که انجام میدین باشه.
- زمانی که به Conflict برخورد میکنید، نیاز به کارهای بیشتری برای انجام دادن دارید و ممکنه که چند بار مجبور باشید که conflictها رو از اول برطرف کنید.
کدام روش را انتخاب کنیم؟
زمانی که افراد تیم شما از feature based workflow استفاده میکنند و یا خیلی با rebase آشنایی ندارند و از نحوه کار کردن اون به خوبی مطلع نیستند، بهتره که از git merge استفاده کنید. مزایای استفاده از git merge برای این حالت بصورت زیر هست:
- به شما این امکان رو میده که تاریخچه مربوط به همه شاخهها و ویژگیها رو در اختیار داشته باشید و از بازنویسی شدن و از دست دادن تاریخچه نگرانی نداشته باشید. همچنین در این حالت کمتر پیش میاد که بخواید از دستورات git reset یا git revert استفاده کنید.
- ویژگیها و شاخههای مختلف از یکدیگر جدا هستند و ربطی به بقیه ندارند.
حالا اگر تیم شما اطلاعات خوب و کاملی در مورد rebase داره و میخواد که تاریخچه خطی و سادهای رو داشته باشه، میتونین از git rebase استفاده کنید و از ساخت commitهای اضافه خودداری کنید.
اگر با استفاده از Rebase تاریخچه رو اشتباه یا ناخواسته تغییر بدین باعث به وجود اومدن مشکلات حساسی میشه و شاید جبران کردنش امکان نداشته باشه و اطلاعاتتون رو از دست بدین. به همین خاطر هست که تاکید میشه حتما اطلاعات خوبی در مورد کار کردن با Rebase داشته باشید.
اولین دیدگاه این پست رو تو بنویس !