مقدمه

بارها برای هر توسعه‌دهنده‌ای پیش می‌آید: شما در حال کار عمیق روی یک قابلیت جدید هستید، چندین فایل را تغییر داده‌اید، اما کارتان هنوز تمام نشده و آماده کامیت کردن نیست. ناگهان یک درخواست فوری پیش می‌آید: باید فوراً به برنچ main بروید تا یک باگ حیاتی را بررسی کنید. چه کار باید بکنید؟

اگر سعی کنید با یک پوشه کاری «کثیف» (Dirty Working Directory) یعنی با تغییرات کامیت‌نشده، برنچ را عوض کنید، گیت به شما خطا می‌دهد تا از دست رفتن کارتان جلوگیری کند. شما نمی‌خواهید یک کامیت نیمه‌کاره و بی‌معنی با پیام «WIP» (Work In Progress) بسازید. اینجاست که یکی از مفیدترین ابزارهای گیت به کمک شما می‌آید: git stash.

Stash چیست و چه مشکلی را حل می‌کند؟

git stash یک قفسه یا انبار موقت برای تغییرات کامیت‌نشده شماست. این دستور تمام تغییراتی را که در Staging Area و Working Directory خود دارید، برداشته، آن‌ها را در یک فضای امن و موقت ذخیره می‌کند و سپس پوشه کاری شما را به حالت آخرین کامیت (HEAD) بازمی‌گرداند.

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

دستورات اصلی Stash

کار با stash بسیار ساده و سرراست است.

ذخیره کردن تغییرات: git stash

وقتی می‌خواهید کار نیمه‌تمام خود را کنار بگذارید، کافیست دستور زیر را اجرا کنید:

git stash

گیت تمام تغییرات رهگیری‌شده (tracked) شما را ذخیره کرده و پوشه کاری را تمیز می‌کند. می‌توانید برای به خاطر سپردن اینکه این stash برای چه کاری بوده، یک پیام نیز به آن اضافه کنید:

git stash save "Working on new user profile design"

مشاهده لیست Stashها: git stash list

گیت تغییرات شما را در یک پشته (stack) ذخیره می‌کند. یعنی می‌توانید چندین stash داشته باشید. برای مشاهده لیست آن‌ها، از دستور زیر استفاده کنید:

git stash list

خروجی شبیه به این خواهد بود:

stash@{0}: On feature/profile: Working on new user profile design
stash@{1}: On feature/profile: Earlier changes

آخرین stash همیشه در بالای پشته (stash@{0}) قرار دارد.

بازیابی تغییرات: git stash pop و git stash apply

برای بازگرداندن تغییرات به پوشه کاری، دو راه دارید:

  • git stash pop: این دستور آخرین stash (stash@{0}) را برداشته، تغییرات آن را روی پوشه کاری شما اعمال می‌کند و سپس آن را از لیست stashها حذف می‌کند. این رایج‌ترین دستور برای بازیابی است.
  • git stash apply: این دستور نیز آخرین stash را اعمال می‌کند، اما یک کپی از آن را در لیست stashها نگه می‌دارد. این زمانی مفید است که بخواهید یک مجموعه از تغییرات را روی چندین برنچ اعمال کنید.
git stash pop

git stash apply

اگر بخواهید یک stash خاص (نه آخرین مورد) را اعمال کنید، باید شناسه آن را مشخص نمایید: git stash pop stash@{1}.

حذف یک Stash

اگر دیگر به یک stash خاص نیاز ندارید، می‌توانید با دستور git stash drop و ذکر شناسه آن، آن را برای همیشه حذف کنید.

یک نکته مهم: فایل‌های رهگیری‌نشده (Untracked)

به طور پیش‌فرض، git stash فقط تغییرات فایل‌هایی را که از قبل توسط گیت رهگیری می‌شوند، ذخیره می‌کند و کاری به فایل‌های جدید و untracked ندارد. اگر می‌خواهید فایل‌های جدید را نیز در stash خود ذخیره کنید، باید از آپشن -u (مخفف --include-untracked) استفاده کنید.

git stash -u