فهرست مطالب
وسط توسعه یک قابلیت جدید هستید، فایلهای زیادی تغییر کردهاند، ساختار کدهای فعلی ناقص است و برنامه هنوز اجرا نمیشود. در همین لحظه همکارتان گزارش میدهد که یک باگ بحرانی روی نسخه اصلی پیش آمده و باید در شاخهای دیگر رفع شود. اگر بخواهید شاخه کاری خود را تغییر دهید، گیت مانع میشود؛ زیرا تغییرات ذخیرهنشده در دایرکتوری کاری وجود دارد. ثبت یک کامیت نیمهکاره با پیام نامشخص هم تاریخچه مخزن را به هم میریزد. این موقعیت، دقیقاً جایی است که گیت ابزاری سریع به نام stash در اختیارتان میگذارد.
منطق فنی دستور stash در گیت
طبق مستندات رسمی گیت، فرمان git stash وضعیت فعلی دایرکتوری کاری و نمایه (Index یا Staging Area) را برمیدارد و آن را در پشتهای اختصاصی ذخیره میکند. پس از اجرای این فرمان، دایرکتوری کاری شما به آخرین کامیت شاخه بازمیگردد و کاملاً پاکیزه میشود. تغییرات ذخیرهشده از بین نمیروند؛ بلکه در قالب ورودیهایی داخل مرجع refs/stash قرار میگیرند تا بتوانید بعداً آنها را بازگردانید.
بهطور پیشفرض، ورودی جدید با عنوان WIP on branchname ثبت میشود، اما ثبت یک پیام توصیفی خوانایی تاریخچه را بالا میبرد. ساختار ذخیرهسازی مانند یک پشته عمل میکند؛ جدیدترین تغییر موقت در اندیس صفر یعنی stash@{۰} قرار میگیرد و تغییرات قدیمیتر اندیسهای بالاتر را دریافت میکنند.
نحوه ذخیره و بازگردانی تغییرات در عمل
برای درک بهتر، یک چرخه ذخیره، بررسی و بازگردانی را مرور میکنیم. ابتدا فایل app.js را اصلاح کردهایم اما هنوز شرایط برای کامیت آماده نیست:
bash# مشاهده وضعیت فایلهای تغییر یافته
git status
# خروجی نشان میدهد app.js دستکاری شده است
# ذخیره سریع تغییرات به همراه یک پیام مشخص
git stash push -m "تغییر ناتمام بخش احراز هویت"
# دایرکتوری کاری تمیز شد و میتوانید شاخه را عوض کنید
git status
# خروجی: nothing to commit, working tree clean
پس از اینکه کار روی شاخه دیگر تمام شد و دوباره به شاخه قبلی برگشتید، فهرست تغییرات موقت را بررسی میکنید:
bash# دیدن فهرست تغییرات ذخیرهشده
git stash list
# خروجی:
# stash@{۰}: On feature-auth: تغییر ناتمام بخش احراز هویت
# بررسی تغییرات قبل از اعمال مجدد
git stash show -p stash@{۰}
حالا نوبت بازگرداندن کدها به محیط کاری است. گیت دو دستور اصلی برای این مرحله دارد که رفتار متفاوتی نشان میدهند.
تفاوت دستور apply و دستور pop
وقتی میخواهید تغییرات پشته را بازگردانید، دو گزینه اصلی دارید:
گزینه اول فرمان git stash apply است. این دستور تغییرات را برمیدارد و روی دایرکتوری کاری پیاده میکند، اما آن رکورد را از پشته پاک نمیکند. این حالت زمانی کاربرد دارد که بخواهید یک تغییر موقت را روی چند شاخه مختلف تست کنید.
گزینه دوم فرمان git stash pop است. این دستور تغییرات را اعمال میکند و اگر تداخلی رخ ندهد، بلافاصله آن مورد را از فهرست پشته حذف میکند. این فرمان بیشترین استفاده روزمره را دارد زیرا نیازی به حذف دستی پس از اعمال تغییرات نخواهید داشت.
bash# بازگردانی آخرین تغییر و حذف آن از فهرست stash
git stash pop
# اگر از apply استفاده کردهاید و دیگر به آن نیازی ندارید
git stash drop stash@{۰}
اشتباهات رایج هنگام کار با تغییرات موقت
نخستین اشتباه این است که فراموش کنید git stash بهطور خودکار فایلهای ردیابینشده (Untracked Files) را ذخیره نمیکند. اگر فایل جدیدی ساختهاید که هنوز با دستور git add معرفی نشده، با اجرای ساده stash کنار گذاشته نمیشود. برای اینکه فایلهای جدید هم ذخیره شوند، باید از سوئیچ u- یا include-untracked-- استفاده کنید:
bash# ذخیره تمام تغییرات از جمله فایلهای جدید ردیابینشده
git stash push -u -m "کدهای جدید و فایلهای تازه"
اشتباه رایج دوم، فراموش کردن وجود stashهای قدیمی است. انباشته شدن دهها تغییر موقت در طول چند ماه، بررسی و بازگردانی آنها را به دلیل تداخل احتمالی با کدهای جدید بسیار دشوار میکند. اگر مطمئن شدید اطلاعات موجود در پشته دیگر ارزش نگهداری ندارند، پشته را پاک کنید یا پس از حل تداخل، رکوردهای اضافه را حذف نمایید.
گام بعدی برای تسلط بر شاخهها
دستور stash ابزاری کمکی است تا جریان کاری شما بر اثر رخدادهای پیشبینینشده متوقف نشود. با این حال، اگر متوجه شدید که کاری چند روز در حالت موقت مانده است، بهتر است آن را به یک شاخه مجزا تبدیل کنید. گیت برای این کار دستور git stash branch <branchname> را فراهم کرده که یک شاخه نو از نقطه ایجاد stash میسازد و کدها را روی آن اعمال میکند.
اگر میخواهید مدیریت شاخهها، حل تداخلها و ابزارهای پیشرفته تاریخچه کد را تمرین کنید، دوره گیت و گیتهاب تعاملی مسیر یادگیری را گامبهگام برایتان روشن میکند.





نظرها
اولین نفری باشید که نظر میدهدسؤالتان را بپرسید یا تجربهتان را بنویسید تا نویسندهی مطلب پاسخ بدهد.