سجاد
خواندن ۴ دقیقه·۳ ماه پیش

یه کامند قوی git به نام stash

امروز رو یه پروژه کار میکردم. روی برنچ master بودم ولی فکر میکردم روی برنچ redesign-shots هستم. واسه همین یه سری تغییرات دادم که نباید در برنچ مستر میبود. کلی فایل آپدیت کردم و کد جدید اضافه کردم. بعد خواستم کامیتشون کنم. اما فهمیدم روی برنچ masterـم. کلی ناله کردم که ای وای حالا چیکار کنم؟ فایل رو دونه دونه کپی کنم و اونجا توی برنچی که میخواستم پیست کنم؟ نه. خیلی زیاد بودن.

ای وای حالا چه کنیم؟ نمیذاره حتی برنج رو تغییر بدیم:=====
ای وای حالا چه کنیم؟ نمیذاره حتی برنج رو تغییر بدیم:=====

اگه تو همچین موقعیتی گیر کردین هیچوقت دستپاچه نشین و یه بار با آرامش پیام گیت رو بخونین. همینی که بالا هست:

Please commit your changes or stash them before you switch branches.

نمیتونین برین به برنچ مورد نظر. یعنی گیت این اجازه رو نمیده. حتی اگه نخواین تغییرات رو اعمال کنین بازم نمیذاره. اما گیت هیچوقت تو کار کسی دخالت نمیکنه. گیت فقط یه ابزاره. و تا وقتی یه دستور نگیره کاری نمیکنه. نه کد رو خودکار حذف میکنه نه برنچ رو خودکار مرج میکنه و نه دسترسی برنامه نویس رو از یه برنچ قطع میکنه. پس حتما یه راهی هست. چون گیت هیچوقت دردسر نیست. گیت فقط دستیاره.

همونطور که تو عکس بالا میبینین دو راه داریم: یکی اینکه تغییرات رو کامیت کنیم(که من نمیخوام اینو). یا اینکه تغییرات رو stash کنیم. خب ببینیم کامیت و استش چی ین.

کامیت یا commit

وقتی با گیت کار میکنیم، گیت همیشه نگاه فایلای ما میکنه تا ببینه چی تغییر کرده و چی تغییر نکرده. پس هر تغییری که ما توی پروژه مون میدیم زیر نظر گیته. و وقتی میخوایم یه تغییر یا آپدیت یا حذف یا اضافه کردن رو ثبت کنیم، از یه چیزی به نام کامیت استفاده میکنیم. مثلا وقتی میخوایم بگیم باگی که تو بخش پرداخت ها بود رو درست(فیکس) کردم میایم کامیتش میکنیم. اینطوری اگه یه نفر صد سال بعد به پروژه ما که ده برابر بزرگتر شده نگاه کنه وقتی میاد این گزارش ما رو میبینه میفهمه که اینجا چه اتفاقی افتاده. کامیت کردن کار راحتیه، صرفا باید یه دستوری بزنیم:

git commit -m "bug fix in payment"

اینطوری تغییراتمون رو ثبت میکنیم، و همزمان میگیم که چیکار کردیم. چون موضوع بلاگ چیزی غیر از کامیت کردنه، پس از این مرحله به همین مقدار بسنده میکنیم.

استش یا stash

یه راه دوم که گیت بهمون پیشنهاد داده بود، استش کردن تغییرات بود. معنی لغویش مهم نیست، اما کاری که انجام میده مهمه. استش کردن یعنی ذخیره تغییرات به صورت موقت یا به صورت شناور. یعنی میتونیم تغییرات رو بین برنچ ها شناور کنیم و هر تغییری که میخوایم رو هرجا تو هربنچی ببریم. مثلا من امروز میخواستم همون تغییراتی که روی برنچ master ایجاد کردم رو ببرم به برنچ redesign-shots. پس میتونم از استش استفاده کنم. نحوه کارش هم آسونه:

git stash && git status
git stash && git status

تنها کاری که لازمه بکنم اینه که بگم:

git stash

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

درواقع باید بریم به برنچی که میخوایم:

git checkout redesigne-screen-shots
git checkout redesigne-screen-shots
git checkout redesigne-screen-shots

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

git stash pop

اینجا یه انتخاب دیگه هم داریم. اینکه از

git stash apply

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

حالا تغییرات رو دقیقا به همون شکلی که توی برنچ master داشتیم توی این یکی برنچ هم داریم. و فقط کافیه همون کارایی که همیشه میکردیم بکنیم:

git add .
git commit -m "commit message"

خب حالا تموم شد. تغییرات با موفقیت از برنچ master به برنچی که میخوایم اومدن و همونجا هم ثبت شدن.

اما هنوز یه چیزی درمورد کامند استش مونده. اونم اینه که چطوری یه استش اینتری رو حذف کنیم. اینطوری:

git stash drop

و همینطور استش میتونه بیشتر از یه دونه استش اینتری در خودش داشته باشه. یعنی میتونین چندین تغییر ایجاد کنید و همه شون رو استش کنین و بعد هروقت خواستین به اعمالشون کنین. که در اونصورت باید اسم استش اینتری رو جلوی هر کامند استش بنویسین. مثلا اینطوری:

git statsh pop stash@{0}
git stash apply stash@{0}
git stash drop stash@{0}

اینجا stash@{0} اسم استش اینتری مون هست که برای گیت مشخص میکنه که منظورمون کدوم استش اینتری هست که میخوام باهاش کار کنین.

یه مهندس کامپیوتر، برنامه نویس، عاشق لینوکس و دنیای یونیکس و همچین موسیقی
شاید از این پست‌ها خوشتان بیاید