سلام به همگی !
احتمالاً موقع کار روی یک پروژه تیمی یا وقتی میخواستید برای یک پروژه Open-source یک Pull Request یا Merge Request باز کنید، به اصطلاح Squash برخورد کردهاید.

ماجرا از این قرار است که گاهی برای اعمال یک تغییر ساده در پروژه چندین کامیت مختلف ثبت میکنیم (که هر کدام تغییرات خیلی کوچکی دارند) این موضوع اصلاً برای مدیران پروژه خوب نیست چون بررسی کدها و دیباگ کردن را سخت میکنه و تاریخچه (History) پروژه را برای یک تغییر کوچک، بیش از حد طولانی و شلوغ میکنه.گیت برای این مشکل یک راهحل ساده داره: Squash.
Squashing در واقع به معنی فشردهسازی چندین کامیت و تبدیل آنها به یک کامیت واحد است. این کار باعث میشود تاریخچه گیت شما همیشه تمیز و مرتب باقی بمونه.روش کار:به عنوان مثال، برای Squashing سه کامیت آخر از HEAD میتوانید از دستور Interactive Rebase استفاده کنید:
git rebase -i HEAD~3
با اجرای این دستور، یک ویرایشگر باز میشود که لیست کامیتها را با برچسب pick نشان میدهد. کافیست اولین کامیت را روی حالت pick باقی بگذارید و بقیه را به squash (یا به اختصار s) تغییر دهید. در نهایت، هر سه کامیت با هم ادغام شده و تبدیل به یک کامیت واحد میشوند.
اسکرینشاتهایی از لاگِ گیت (قبل و بعد از Squashing) و نحوه squash کردن


نکات مهم:
استفاده از Squash بسیار کاربردی است، اما چون باعث بازنویسی تاریخچه (Rewriting History) میشود نباید در استفاده از آن زیادهروی کنید بهخصوص اگر آن تغییرات را قبلاً Push کردهاید و با همتیمیهایتان به اشتراک گذاشتهاید.Squashing روی شاخههای مشترک میتواند باعث ایجاد Conflict یا به هم ریختن تاریخچه برای دیگران شود. پس بهتره فقط روی کامیتهای خودتان (قبل از انتشار نهایی) این کار را انجام دهید.
امیدوارم این مطلب برایتان مفید بوده باشد. اگر سوالی داشتید یا پیشنهادی برای کاملتر شدن این بحث دارید خوشحال میشم بهم بگین .