روش Squash کردن کامیت ها در Git

روش Squash کردن کامیت ها در Git

به این نکته دقت کنید که دستور مستقلی به نام git squash نداریم. در واقع اسکوآش کردن یک تکنیک است که می توان آن را با استفاده از ابزار موجود مثل rebase و merge پیاده سازی کرد.

چه زمانی کامیت ها را اسکوآش کنیم؟

همانطور که در مقدمه گفتم اسکوآش کردن یعنی ترکیب چند کامیت موجود به یک کامیت. اما آیا باید این کار را انجام دهیم یا از آن دوری کنیم: برای مثال در برخی از تیم ها اسکوآش کردن کامیت ها روش ترجیحی برای مرج کردن یک feature branch به یک branch پایدار مثل master یا main است.

اما دقیقا چرا این کار را می کنیم؟ بیاید یه مثال کلاسیک از یک توسعه feature را در نظر بگیریم: به طور مثال شما روی یک برنچ feature جدا کار کردید و تعدادی کامیت هم در این زمینه انجام داده اید. بسته به پیچیدگی زمانی کار شما ممکن است تعداد کامیت های شما خیلی زیاد باشد. در همین نقطه شما می خواهید کار خود را به برنچ main مرج کنید. در اینجا شما باید تصمیم بگیرید که آیا اسکوآش کنید یا خیر:

الف) اگر شما تصمیم بگیرید که قبل از مرج کردن اسکوآش کنید آنگاه همه کامیت های منحصربفرد از برنچ feature به یک کامیت تکی ترکیب می شوند. تاریخچه کامیت اصلی فقط یک کامیت تکی برای این یکپارچگی نمایش می دهد.

ب) اگر شما تصمیم بگیرید برخلاف اسکوآشینگ را انجام دهید همه کامیت های تکی شما مثل معمول حفظ می شود.

برخی تیم ها با توجه به مزایی که روش الف برای آنها دارد ترجیح می دهند از اسکوآشینگ استفاده کنند: به جای کامیت های منحصر به فرد زیاد که ممکن است بلااستفاده باشند و موجب گیج شدن شوند فقط یک کامیت تکی در تاریخچه کامیت اصلی نمایش داده می شود. این می تواند در حفظ ترتیب موارد کمک کننده باشد.

هر چند نمی شود گفت الف یا ب روشی صحیحی برای انجام کارهاست. مزایا و معایبی برای هر دو روش وجود دارد. لذا بیشتر یک موضوع قراردادی و ترجیحی است که از کدام استفاده کنیم.

چطور کامیت های خود را اسکوآش کنیم؟

روش ها و ابزارهای  مختلفی برای اسکوآش کردن کامیت ها وجود دارد. در این پست در رابطه با Interactive Rebase و Merge به عنوان دو روش اصلی برای اسکوآش کردن کامیت ها صحبت می کنیم.

Interactive Rebase

شما می توانید کامیت های خود را به صورت دستی در هر زمان با استفاده از ویژگی Interactive Rebase  اسکوآش کنید. در این مقاله به ذکر مثالی ساده از این روش بسنده می کنیم اما اگر کنجکاو هستید که اطلاعات بیشتری کسب کنید می توانید از این لینک کمک بگیرید.

بیاید فرض کنیم که شما در مرحله ای از کار خودتون هستید که برنچ feature رو کامل کردید (در مثال زیر feature/login) و حالا قصد دارید آن را با برنچ main مرج کنید. اما قبل از این کار شما قصد دارید کامیت های فعلی را به یک کامیت تکی اسکوآش کنید:

برای انجام این کار بایستی یک  Interactive Rebase Session را آغاز کنیم:

git rebase -i HEAD~3

بعد از اجرای این دستور یک پنجره ویرایشگر باز می شود که در آن شما انتخاب می کنید چطوری می خواهید بخش انتخاب شده از تاریخچه کامیت خود را دستکاری کنید. در نظر داشته باشید که Interactive Rebase به شما اجازه می دهد تا اکشن های مختلف زیادی را در تاریخچه کامیت اجرا کنید، در مثال فعلی اکشنی که ما به دنبال آن هستیم squash است. اگر شما یک یا چند خط را به صورت squash علامت گذاری کنید آنها با هم ترکیب خواهند شد. 

بعد از وارد کردن پیام commit برای کامیت ترکیبی جدید Interactive Rebase کامل می شود و سه کامیت قدیمی به یک کامیت اسکوآش خواهند شد.

Merge

موقع استفاده از دستور merge میتوان از سوئیچ squash استفاده کرد:

$ git merge --squash feature/login

Auto-merging imprint.html
Removing img/iconBlog.png
Auto-merging about.html
Squash commit -- not updating HEAD
Automatic merge went well; stopped before committing as requested

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

در پایان این دستور باعث می شود جلوی کامیت خودکار که بر اثر مرج رخ می دهد جلوگیری شود. ماحصل اجرای این دستور معادل یک کامیت واحد خواهد بود.

Pull Requests 

این استراتژی - استفاده از اسکوآش در زمیان مرج کردن اغلب وقتی که Pull Request بسته است استفاده می شود. پلتفرم های میزبان کد مثل Github, GitLab یا Bitbucket این گزینه را در زمان مرج کردن Pull Request پشتیبانی می کنند:

 

 

مرجع مقاله