دستور stash در گیت چیست و چه کاربردی دارد
آموزش

دستور stash در گیت چیست و چه کاربردی دارد

دستور stash در گیت تغییرات ثبت‌نشده شاخه کاری را موقتا کنار می‌گذارد تا بدون ثبت کامیت ناقص بتوانید روی وظایف فوری کار کنید.

تحریریه‌ی دینا کد
نویسنده
۶ دقیقه مطالعه۰ بازدید
اشتراک گذاری۰
فهرست مطالب
  1. ۱منطق فنی دستور stash در گیت
  2. ۲نحوه ذخیره و بازگردانی تغییرات در عمل
  3. ۳تفاوت دستور apply و دستور pop
  4. ۴اشتباهات رایج هنگام کار با تغییرات موقت
  5. ۵گام بعدی برای تسلط بر شاخه‌ها

وسط توسعه یک قابلیت جدید هستید، فایل‌های زیادی تغییر کرده‌اند، ساختار کدهای فعلی ناقص است و برنامه هنوز اجرا نمی‌شود. در همین لحظه همکارتان گزارش می‌دهد که یک باگ بحرانی روی نسخه اصلی پیش آمده و باید در شاخه‌ای دیگر رفع شود. اگر بخواهید شاخه کاری خود را تغییر دهید، گیت مانع می‌شود؛ زیرا تغییرات ذخیره‌نشده در دایرکتوری کاری وجود دارد. ثبت یک کامیت نیمه‌کاره با پیام نامشخص هم تاریخچه مخزن را به هم می‌ریزد. این موقعیت، دقیقاً جایی است که گیت ابزاری سریع به نام 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 می‌سازد و کدها را روی آن اعمال می‌کند.

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

تحریریه‌ی دینا کد
نویسنده

نظرها

اولین نفری باشید که نظر می‌دهد
برای ثبت نظر وارد شوید

سؤالتان را بپرسید یا تجربه‌تان را بنویسید تا نویسنده‌ی مطلب پاسخ بدهد.

مطالب مرتبط

از همین دسته
diff در گیت چیست و چه‌وقت استفاده می‌شود؟
آموزش

diff در گیت چیست و چه‌وقت استفاده می‌شود؟

git diff دو نسخه از کدها را کنار هم می‌گذارد و خط‌به‌خط نشان می‌دهد چه چیزی عوض شده. یک نگاه به diff قبل از هر add و commit کافی است

تحریریه‌ی دینا کد۷ دقیقه
branch در گیت چیست و چه‌وقت بسازیمش؟
آموزش

branch در گیت چیست و چه‌وقت بسازیمش؟

branch یک اشاره‌گر متحرک به یکی از کامیت‌هاست، نه کپی پوشه‌ی پروژه. با git switch می‌سازی و جابه‌جا می‌شوی، با merge برمی‌گردانی و در پایان پاکش می‌کنی

تحریریه‌ی دینا کد۷ دقیقه