سلام دوستان.
با نوشتن این مقاله قصد دارم شما رو با یه قسمت کوچیک دیگه از اقیانوس گیت آشنا کنم. مفهومی به نام git stash. پیشنیاز این مبحث آشنایی با گیت و مفاهیمی مثل add, commit و remote هست.
در ابتدا یه توضیحی راجع به این میدم که اصلا چرا به git stash نیاز داریم؟ و بعد از اون سعی میکنم تمامی دستورات مهم و کاربردی این مفهوم رو توضیح بدم.
یه مثال رایج از کاربرد git stash اینکه فرض کنید در حال توسعه یه قسمتی از پروژه هستید و به طور اورژانسی یه change داریم. یا نیازه که یه باگ خیلی فوری رو برطرف کنیم. توی این شرایط فرصت این رو که با خیال راحت فایلهای مختلفمون رو stage و commit کنیم نداریم. یه مثال دیگه که برای خود من پیش اومده اینکه تایم کاریم در شرکت تموم شده اما هنوز یه قسمتی از کارم رو به صورت کامل توسعه ندادم و نمیخوام که اون رو نصفه و نیمه کامیت کنم. در این شرایط میتونیم از git stash استفاده کنیم. stash در لغت به معنی ذخیره کردن هست. در عمل هم دقیقا گیت میاد و هر آن چیزی که در local داریم و کامیت نشده رو ذخیره میکنه. حالا میتونیم با خیال راحت بریم سراغ تغییراتی که لازمه انجام بدیم. و بعد از اتمام کارمون دوباره مواردی که با استفاده از git stash ذخیره کرده بودیم رو Restore کنیم. بدون اینکه تاثیری روی هم داشته باشن.
قبل ازینکه کار با stash رو شروع کنیم یه git status میگیرم تا ببینیم وضعیت چجوریه:
خب همونطور که میبینیم در فایل index.html یه سری تغییراتی داریم. حالا میخوام این تغییرات رو ذخیره کنم و برم سراغ یه کار دیگه. دستور زیر رو وارد میکنم و خروجی میشه شکل زیر:
git stash
حالا اگه status بگیریم میبینیم که working directory ما خالی شده و تونستیم تغییرات رو بدون اینکه کامیت کنیم ذخیره کنیم. یه اسمی هم به طور پیشفرض بر روی stashمون گذاشته شده.
با این دستور میتونیم یه پیغام دلخواه برای stashمون انتخاب کنیم. وقتی که تعداد stashها زیاد باشن این مورد میتونه برای شناسایی سریع و راحت اون تغییری که مد نظرمون هست به کارمون بیاد.
git stash save "this is a message for my stash"
با این دستور خیلی راحت میتونیم یه لیستی از تموم stashهایی که داریم رو مشاهده کنیم. به خروجی زیر دقت کنین:
خب تا اینجای کار داره بهمون میگه که ما دو تا stash داریم. هر کدوم ازین stashها یه ID و یه message دارن. (message اول پیغامی هست که خودم با دستور git stash save مشخص کردم و message دوم پیغامی هست که به صورت پیش فرض انتخاب شده.)
حتما متوجه شدید که git stash فقط فایلهایی رو ذخیره میکنه که track شده هستن. برای اینکه بتونیم untracked file ها رو هم ذخیره کنیم ازین دستور استفاده میکنیم.
git stash save -u
یا
git stash save --include-untracked
و اگه بخوایم ignored file ها رو هم ذخیره کنیم میتونیم از دستور زیر استفاده کنیم.
git stash -a
شکل زیر به خوبی مفاهیم این قسمت رو به تصویر کشده:
اگه بخوایم تغییراتی که ذخیره کردیم رو بازیابی کنیم میتونیم ازین دستور استفاده کنیم. git stash apply باعث میشه آخرین stash ما به working directory برگشت داده بشه. حالا میتونیم ادامه کارمون رو انجام بدیم.
با استفاده از ID هر stash هم میتونیم یه stash به خصوص رو بازیابی کنیم. به قطعه کد زیر دقت کنین:
git stash apply stash@{1}
این دستور هم مشابه دستور قبل عمل میکنه با این تفاوت که وقتی آخرین stash رو برمیگردونه، اون رو از لیست stashها هم پاک میکنه.
باز هم مثل دستور قبل، اگه بخوایم یه stash به خصوص رو pop کنیم میتونیم از ID اون stash استفاده کنیم.
git stash pop stash@{1}
حالا اگه بخوایم یه stash رو صرفا حذف کنیم (بدون نیاز به restore کردن اون)، میتونیم از این دستور استفاده کنیم. و اگه نیاز باشه یه stash مشخص حذف بشه هم با استفاده از ID اون.......
git stash drop stash@{1}
بهتره که در استفاده ازین دستور دقت کنیم چون مستقیما باعث حذف stashمون میشه و تغییرات رو Restore نمیکنه.
این دستور هم تمامی stashهامون رو به صورت یکجا پاک میکنه. (بدون اینکه اونها رو restore کنه)
اگه بخوایم تغییرات stash رو مشاهده کنیم میتونیم ازین دستور استفاده کنیم. این دستور تغییرات مربوط به آخرین stash رو بهمون میده.
git stash show
به خروجی زیر دقت کنید:
حالا اگه در ادامه همین دستور، ID یه stash مشخص رو قرار بدیم تغییرات مربوط به همون stash رو بهمون نشون میده.
git stash show stash@{1}
و با git stash -p هم لیست تغییرات تمامی stashها رو میتونیم داشته باشیم.
git stash show -p
خب دیگه تقریبا کار تموم شده. فقط یه دستور دیگه مونده.
به عنوان آخرین دستور، میخوام یه دستور جالب و بهتون معرفی کنم. git stash branch میاد با آخرین stash ای که ما داریم یه برنچ میسازه. و بعد ازون stash رو حذف میکنه و به طور خودکار switch میکنه به برنچ جدیدی که ساخته شده.
git stash branch "test"
با دستور بالا یه برنچ جدید به نام "test" ساخته میشه و تغییراتی که در آخرین stash ذخیره شده به برنچ تست اضافه میشه و اون stash حذف میشه. روال کار رو در تصاویر زیر میتونین ببینین.
همونطور که میبینید در حال حاضر (قبل از اعمال دستور git stash branch)، ما دو تا stash داریم و یه برنچ به نام master. و working directory مون هم clear هست.
حالا بعد از اعمال دستور
git stash branch "test"
خروجی رو به صورت زیر مشاهده میکنیم:
خب... همچیز واضح و مشخصه. برنچ تست ساخته شده؛ تغییراتی که در آخرین stash بود (اگه یادتون باشه مربوط میشد به فایل index.html) حالا در برنچ تست قرار داره و گیت بهطور خودکار به تست swtich کرده. و فایل index.html به حالت unstaged تبدیل شده. در آخرین خط هم مشاهده میکنید که stash مربوطه drop شده. (از لیست stashها حذف شده)
و تموووم... مفهوم خیلی سخت و پیچیدهای نیست. فقط کافیه که دست به کار شین و یه بار خودتون این مراحل رو به صورت عملی انجام بدین.
من درین مقاله سعی کردم دستورات مهم و کاربردی git stash رو بهطور کامل براتون توضیح بدم. اگه علاقه به مطالعه بیشتر و دقیقتر درین زمینه دارید میتونید داکیومنت گیت و مطالعه کنید.
https://git-scm.com/docs/git-stash
امیدوارم این مقاله براتون مفید بوده باشه. نظر، انتقاد یا پیشنهادی اگر دارین خوشحال میشم بشنوم تا باهم بیشتر یاد بگیریم. موفق باشید.
بقیه مقالات من در ویرگول:
References: