GIT-STASH(1) دستورات عمومی کاربر GIT-STASH(1)

git-stash - ذخیره موقت تغییرات در یک پوشه کاری کثیف

git stash list [<log-options>]
git stash show [-u | --include-untracked | --only-untracked] [<diff-options>] [<stash>]
git stash drop [-q | --quiet] [<stash>]
git stash pop [--index] [-q | --quiet] [<stash>]
git stash apply [--index] [-q | --quiet] [--label-ours=<label>] [--label-theirs=<label>] [--label-base=<label>] [<stash>]
git stash branch <branchname> [<stash>]
git stash [push] [-p | --patch] [-S | --staged] [-k | --[no-]keep-index] [-q | --quiet]
             [-u | --include-untracked] [-a | --all] [(-m | --message) <message>]
             [--pathspec-from-file=<file> [--pathspec-file-nul]]
             [--] [<pathspec>...]
git stash save [-p | --patch] [-S | --staged] [-k | --[no-]keep-index] [-q | --quiet]
           [-u | --include-untracked] [-a | --all] [<message>]
git stash clear
git stash create [<message>]
git stash store [(-m | --message) <message>] [-q | --quiet] <commit>
git stash export (--print | --to-ref <ref>) [<stash>...]
git stash import <commit>

هنگامی که می‌خواهید وضعیت فعلی پوشه کاری و ایندکس را ثبت کنید، اما در عین حال مایلید به یک پوشه کاری تمیز برگردید، از git stash استفاده کنید. این دستور تغییرات محلی شما را به صورت موقت ذخیره کرده و پوشه کاری را به گونه‌ای بازمی‌گرداند که با کامیت HEAD مطابقت داشته باشد.

تغییرات ذخیره‌شده توسط این دستور را می‌توان با git stash list فهرست کرد، با git stash show مورد بازبینی قرار داد، و با git stash apply (احتمالاً بر روی یک کامیت متفاوت) بازیابی نمود. فراخوانی git stash بدون هیچ آرگومانی معادل git stash push است. یک استش به طور پیش‌فرض به صورت "WIP on <branchname> ..." فهرست می‌شود، اما شما می‌توانید هنگام ایجاد آن، پیام توصیفی‌تری را در خط فرمان مشخص کنید.

جدیدترین استشی که ایجاد کرده‌اید در refs/stash ذخیره می‌شود؛ استش‌های قدیمی‌تر در وقایع ارجاع (reflog) این مرجع یافت می‌شوند و می‌توان آن‌ها را با استفاده از نحو معمول reflog نام‌گذاری کرد (برای مثال، stash@{0} جدیدترین استش ایجادشده است، stash@{1} مربوط به قبل از آن است، و stash@{2.hours.ago} نیز امکان‌پذیر است). همچنین می‌توان به استش‌ها تنها با مشخص کردن نمایه (index) استش ارجاع داد (به عنوان مثال، عدد صحیح <n> معادل stash@{<n>} است).

push [-p | --patch] [-S | --staged] [-k | --[no-]keep-index] [-u | --include-untracked] [ -a | --all] [-q | --quiet] [(-m|--message) <message>] [--pathspec-from-file=<file> [--pathspec-file-nul]] [--] [<pathspec>...]

تغییرات محلی شما را در یک stash entry (مدخل استش) جدید ذخیره کرده و آن‌ها را (هم در درخت کاری و هم در ایندکس) به HEAD برمی‌گرداند. بخش <message> اختیاری است و توضیحی را همراه با وضعیت استش‌شده ارائه می‌دهد.

برای ثبت سریع یک تصویر لحظه‌ای (snapshot)، می‌توانید "push" را حذف کنید. در این حالت، عناصر pathspec تنها پس از یک خط تیره دوگانه -- مجاز هستند تا از ایجاد ناخواسته یک مدخل استش به دلیل املای اشتباه زیردستور جلوگیری شود.

save [-p | --patch] [-S | --staged] [-k | --[no-]keep-index] [-u | --include-untracked] [-a | --all] [-q | --quiet] [<message>]

این دستور منسوخ شده و استفاده از git stash push به جای آن توصیه می‌شود. تفاوت آن با "stash push" در این است که نمی‌تواند pathspec دریافت کند. در عوض، تمام آرگومان‌های غیرگزینه‌ای برای تشکیل پیام استش به یکدیگر متصل می‌شوند.

list [<log-options>]

مدخل‌های استشی را که در حال حاضر دارید فهرست می‌کند. هر stash entry همراه با نام آن (به عنوان مثال stash@{0} جدیدترین مدخل است، stash@{1} مدخل ماقبل آن است، و غیره)، نام شاخه‌ای که هنگام ایجاد مدخل فعال بوده، و توضیحی کوتاه از کامیتی که مدخل بر اساس آن ساخته شده، فهرست می‌شود.
stash@{0}: WIP on submit: 6ebd0e2... Update git-stash documentation
stash@{1}: On master: 9cc0589... Add git-stash

این دستور گزینه‌های قابل استفاده در دستور git log را می‌پذیرد تا نحوه و نوع نمایش را کنترل کند. به git-log(1) مراجعه کنید.

show [-u | --include-untracked | --only-untracked] [<diff-options>] [<stash>]

تغییرات ثبت‌شده در مدخل استش را به صورت یک تفاوت (diff) میان محتویات استش‌شده و کامیتی که مدخل استش در ابتدا بر پایه آن ایجاد شده بود، نشان می‌دهد. این دستور به طور پیش‌فرض آمار تفاوت‌ها (diffstat) را نشان می‌دهد، اما هر قالبی را که برای git diff شناخته‌شده باشد می‌پذیرد (مانند git stash show -p stash@{1} برای مشاهده دومین مدخل اخیر در قالب وصله/patch). اگر هیچ <diff-option> مشخص نشود، رفتار پیش‌فرض توسط متغیرهای پیکربندی stash.showStat و stash.showPatch تعیین می‌شود. همچنین می‌توانید از stash.showIncludeUntracked برای تعیین این که آیا --include-untracked به طور پیش‌فرض فعال باشد یا خیر استفاده کنید.

pop [--index] [-q | --quiet] [<stash>]

یک وضعیت ذخیره‌شده را از فهرست استش‌ها حذف کرده و آن را بر روی وضعیت فعلی درخت کاری اعمال می‌کند؛ یعنی عملیات معکوس git stash push را انجام می‌دهد. پوشه کاری باید با ایندکس مطابقت داشته باشد.

اعمال وضعیت ممکن است به دلیل بروز تداخل‌ها (conflicts) با شکست مواجه شود؛ در این حالت، مدخل از فهرست استش‌ها حذف نخواهد شد. شما باید تداخل‌ها را به صورت دستی حل کرده و سپس به صورت دستی git stash drop را فراخوانی کنید.

apply [--index] [-q | --quiet] [<stash>]

مشابه pop عمل می‌کند، اما وضعیت را از فهرست استش‌ها حذف نمی‌کند. بر خلاف pop، مقدار <stash> می‌تواند هر کامیتی باشد که شبیه به یک کامیت ایجادشده توسط stash push یا stash create به نظر برسد.

branch <branchname> [<stash>]

یک شاخه جدید به نام <branchname> شروع‌شده از کامیتی که <stash> در اصل روی آن ایجاد شده بود ایجاد کرده و به آن تغییر وضعیت می‌دهد (تحویل می‌گیرد)، و تغییرات ثبت‌شده در <stash> را بر روی درخت کاری و ایندکس جدید اعمال می‌کند. اگر این کار موفقیت‌آمیز باشد و <stash> مرجعی به شکل stash@{<revision>} باشد، آنگاه <stash> را حذف (drop) می‌کند.

این دستور زمانی مفید است که شاخه‌ای که git stash push را روی آن اجرا کرده‌اید به اندازه‌ای تغییر کرده باشد که git stash apply به دلیل بروز تداخل‌ها با خطا مواجه شود. از آنجا که مدخل استش بر روی کامیتی اعمال می‌شود که در زمان اجرای git stash به عنوان HEAD فعال بوده است، وضعیت استش‌شده اولیه را بدون هیچ تداخلی بازیابی می‌کند.

clear

تمام مدخل‌های استش را حذف می‌کند. توجه داشته باشید که این مدخل‌ها پس از آن مشمول هرس کردن (pruning) خواهند شد و بازیابی آن‌ها ممکن است غیرممکن باشد (برای یک راهکار احتمالی به بخش مثال‌ها (EXAMPLES) در زیر مراجعه کنید).

drop [-q | --quiet] [<stash>]

یک مدخل استش منفرد را از فهرست مدخل‌های استش حذف می‌کند.

create

یک مدخل استش (که یک شیء کامیت معمولی است) ایجاد کرده و نام شیء آن را بدون ذخیره در هیچ‌کدام از فضاهای نام ارجاع برمی‌گرداند. هدف از این دستور کاربرد در اسکریپت‌ها است. احتمالاً این دستوری نیست که به دنبال استفاده از آن باشید؛ بخش "push" را در بالا ببینید.

store

استش داده‌شده را که از طریق git stash create ایجاد شده است (که یک کامیت ادغام معلق است) در مرجع استش ذخیره کرده و وقایع ارجاع (reflog) استش را به‌روزرسانی می‌کند. هدف از این دستور کاربرد در اسکریپت‌ها است. احتمالاً این دستوری نیست که به دنبال استفاده از آن باشید؛ بخش "push" را در بالا ببینید.

export ( --print | --to-ref <ref> ) [<stash>...]

استش‌های مشخص‌شده، یا تمام آن‌ها را در صورت عدم تعیین، به زنجیره‌ای از کامیت‌ها صادر می‌کند که می‌توان آن‌ها را با استفاده از سازوکارهای عادی fetch و push انتقال داد، و سپس با زیردستور import وارد کرد.

import <commit>

استش‌های مشخص‌شده را از کامیت تعیین‌شده که حتماً باید توسط export ایجاد شده باشد وارد کرده و آن‌ها را به فهرست استش‌ها می‌افزاید. برای جایگزینی استش‌های موجود، ابتدا از clear استفاده کنید.

-a, --all

این گزینه تنها برای دستورهای push و save معتبر است.

تمام فایل‌های نادیده‌گرفته‌شده (ignored) و ردگیری‌نشده (untracked) نیز استش شده و سپس با git clean پاک‌سازی می‌شوند.

-u, --include-untracked, --no-include-untracked

هنگامی که با دستورهای push و save استفاده شود، تمام فایل‌های ردگیری‌نشده نیز استش شده و سپس با git clean پاک‌سازی می‌شوند.

هنگامی که با دستور show استفاده شود، فایل‌های ردگیری‌نشده در مدخل استش را به عنوان بخشی از تفاوت (diff) نشان می‌دهد.

--only-untracked

این گزینه تنها برای دستور show معتبر است.

تنها فایل‌های ردگیری‌نشده در مدخل استش را به عنوان بخشی از تفاوت (diff) نشان می‌دهد.

--index

این گزینه تنها برای دستورهای pop و apply معتبر است.

تلاش می‌کند تا نه تنها تغییرات درخت کاری، بلکه تغییرات ایندکس را نیز بازگرداند. با این حال، در صورت وجود تداخل‌ها این کار ممکن است با شکست مواجه شود (چرا که تداخل‌ها در ایندکس ذخیره می‌شوند و بنابراین دیگر نمی‌توانید تغییرات را به همان شکل اولیه اعمال کنید).

--label-ours=<label>, --label-theirs=<label>, --label-base=<label>

این گزینه‌ها تنها برای دستور apply معتبر هستند.

از برچسب‌های ارائه‌شده در نشانگرهای تداخل به جای موارد پیش‌فرض "Updated upstream"، "Stashed changes" و "Stash base" استفاده می‌کند. گزینه --label-base تنها زمانی که merge.conflictStyle=diff3 باشد تأثیر دارد.

-k, --keep-index, --no-keep-index

این گزینه تنها برای دستورهای push و save معتبر است.

تمام تغییراتی که قبلاً به ایندکس اضافه شده‌اند دست‌نخورده باقی می‌مانند.

-p, --patch

این گزینه تنها برای دستورهای push و save معتبر است.

تکه‌های تغییر (hunk) را به صورت تعاملی از تفاوت میان HEAD و درخت کاری برای ذخیره در استش انتخاب می‌کند. مدخل استش به گونه‌ای ساخته می‌شود که وضعیت ایندکس آن همان وضعیت ایندکس مخزن شما باشد، و درخت کاری آن تنها شامل تغییراتی باشد که به صورت تعاملی انتخاب کرده‌اید. سپس تغییرات انتخاب‌شده از درخت کاری شما به عقب بازگردانده می‌شوند. برای آشنایی با نحوه کار با حالت --patch، بخش “Interactive Mode” از git-add(1) را ببینید.

گزینه --patch متضمن --keep-index است. برای لغو این رفتار می‌توانید از --no-keep-index استفاده کنید.

-U<n>, --unified=<n>

تفاوت‌ها را با <n> خط از متن پیرامون (context) تولید می‌کند. تعداد خطوط متن پیرامون به طور پیش‌فرض برابر با مقدار متغیر diff.context یا در صورت عدم تنظیم برابر ۳ است. (گزینه -U بدون <n> به دلایل تاریخی به عنوان مترادفی برای -p بدون ایجاد خطا پذیرفته می‌شود).

--inter-hunk-context=<n>

متن پیرامون میان تکه‌های تفاوت (diff hunks) را تا <number> خطِ مشخص‌شده نشان می‌دهد، و بدین ترتیب تکه‌هایی را که به یکدیگر نزدیک هستند ادغام می‌کند. پیش‌فرض آن مقدار diff.interHunkContext یا در صورت عدم تنظیم گزینه پیکربندی برابر با ۰ است.

-S, --staged

این گزینه تنها برای دستورهای push و save معتبر است.

تنها تغییراتی را که در حال حاضر استیج شده‌اند (در ایندکس قرار دارند) استش می‌کند. این مشابه دستور پایه git commit است با این تفاوت که وضعیت به جای شاخه فعلی، در استش کامیت می‌شود.

گزینه --patch نسبت به این گزینه اولویت دارد.

--pathspec-from-file=<file>

این گزینه تنها برای دستور push معتبر است.

مسیر مشخص‌شده (pathspec) به جای آرگومان‌های خط فرمان، از طریق <file> داده می‌شود. اگر <file> دقیقاً - باشد، ورودی استاندارد استفاده خواهد شد. عناصر pathspec با LF یا CR/LF از یکدیگر جدا می‌شوند. عناصر pathspec را می‌توان طبق توضیحات ارائه‌شده برای متغیر پیکربندی core.quotePath در نقل‌قول (کوتیشن) قرار داد (به git-config(1) مراجعه کنید). همچنین به --pathspec-file-nul و گزینه سراسری --literal-pathspecs نگاه کنید.

--pathspec-file-nul

این گزینه تنها برای دستور push معتبر است.

تنها همراه با --pathspec-from-file معنا دارد. عناصر pathspec با کاراکتر NUL از یکدیگر جدا می‌شوند و تمام کاراکترهای دیگر دقیقاً همان‌گونه که هستند تفسیر خواهند شد (شامل خطوط جدید و علامت‌های نقل‌قول).

-q, --quiet

این گزینه تنها برای دستورهای apply، drop، pop، push، save و store معتبر است.

حالت بی‌صدا، از نمایش پیام‌های بازخورد جلوگیری می‌کند.

--print

این گزینه تنها برای دستور export معتبر است.

زنجیره کامیت‌های ارائه‌دهنده استش‌های صادرشده را بدون ذخیره آن در هیچ‌یک از فضاهای نام ارجاع ایجاد کرده و شناسه شیء (object ID) را در خروجی استاندارد چاپ می‌کند. این گزینه برای استفاده در اسکریپت‌ها طراحی شده است.

--to-ref

این گزینه تنها برای دستور export معتبر است.

زنجیره کامیت‌های ارائه‌دهنده استش‌های صادرشده را ایجاد کرده و آن را در ارجاع (ref) مشخص‌شده ذخیره می‌کند.

--

این گزینه تنها برای دستور push معتبر است.

مسیر (pathspec) را به منظور رفع ابهام از گزینه‌ها جدا می‌کند.

<pathspec>...

این گزینه تنها برای دستور push معتبر است.

مدخل استش جدید، وضعیت‌های تغییریافته را تنها برای فایل‌هایی ثبت می‌کند که با الگوی pathspec مطابقت دارند. سپس مدخل‌های ایندکس و فایل‌های درخت کاری تنها برای همین فایل‌ها نیز به وضعیت HEAD بازگردانده می‌شوند، و فایل‌هایی که با pathspec تطابق ندارند دست‌نخورده باقی می‌مانند.

برای جزئیات بیشتر، مدخل pathspec را در gitglossary(7) ببینید.

<stash>

این گزینه تنها برای دستورهای apply، branch، drop، pop، show و export معتبر است.

ارجاعی به صورت stash@{<revision>}. هنگامی که هیچ <stash> مشخص نشده باشد، جدیدترین استش در نظر گرفته می‌شود (یعنی stash@{0}).

یک مدخل استش به عنوان کامیتی نشان داده می‌شود که درخت آن وضعیت پوشه کاری را ثبت می‌کند، و والد اول آن همان کامیت موجود در HEAD در زمان ایجاد مدخل است. درخت والد دوم وضعیت ایندکس را در زمان ایجاد مدخل ثبت می‌کند، و به عنوان فرزندی از کامیت HEAD قرار می‌گیرد. نمودار تبارشناسی به صورت زیر است:

       .----W
      /    /
-----H----I

که در آن H کامیت HEAD، I کامیتی که وضعیت ایندکس را ثبت می‌کند، و W کامیتی است که وضعیت درخت کاری را ثبت می‌کند.

دریافت تغییرات (pull) در یک درخت کاری کثیف

هنگامی که در میانه انجام کاری هستید، متوجه می‌شوید که تغییراتی در بالادست (upstream) وجود دارد که احتمالاً به کار شما مرتبط است. اگر تغییرات محلی شما با تغییرات بالادست تداخل نداشته باشند، یک دستور ساده git pull به شما امکان می‌دهد کار را به جلو ببرید.

با این حال، مواردی وجود دارد که در آن تغییرات محلی شما با تغییرات بالادست تداخل دارند و git pull از بازنویسی تغییرات شما امتناع می‌ورزد. در چنین شرایطی، می‌توانید تغییرات خود را استش کنید، pull را انجام دهید، و سپس تغییرات را از استش خارج کنید (unstash)، به این صورت:

$ git pull
 ...
file foobar not up to date, cannot merge.
$ git stash
$ git pull
$ git stash pop

جریان کاری قطع‌شده (وقفه در کار)

هنگامی که مشغول انجام کاری هستید، مدیرتان می‌آید و می‌خواهد بلافاصله مشکلی را برطرف کنید. به طور سنتی، برای ذخیره تغییرات خود یک کامیت در شاخه‌ای موقت ایجاد می‌کردید و برای انجام اصلاح اضطراری به شاخه اصلی خود بازمی‌گشتید، مانند این:
# ... hack hack hack ...
$ git switch -c my_wip
$ git commit -a -m "WIP"
$ git switch master
$ edit emergency fix
$ git commit -a -m "Fix in a hurry"
$ git switch my_wip
$ git reset --soft HEAD^
# ... continue hacking ...

می‌توانید برای ساده‌تر کردن فرآیند بالا از git stash استفاده کنید، به این صورت:

# ... hack hack hack ...
$ git stash
$ edit emergency fix
$ git commit -a -m "Fix in a hurry"
$ git stash pop
# ... continue hacking ...

آزمایش کامیت‌های جزئی

هنگامی که می‌خواهید از تغییرات موجود در درخت کاری دو یا چند کامیت بسازید و مایلید هر تغییر را قبل از کامیت کردن آزمایش کنید، می‌توانید از git stash push --keep-index استفاده نمایید:
# ... hack hack hack ...
$ git add --patch foo            # add just first part to the index
$ git stash push --keep-index    # save all other changes to the stash
$ edit/build/test first part
$ git commit -m 'First part'     # commit fully tested change
$ git stash pop                  # prepare to work on all other changes
# ... repeat above five steps until one commit remains ...
$ edit/build/test remaining parts
$ git commit foo -m 'Remaining parts'

ذخیره تغییرات غیرمرتبط برای استفاده‌های بعدی

هنگامی که در میانه تغییرات گسترده‌ای هستید و به موضوع نامرتبطانه‌ای برمی‌خورید که نمی‌خواهید اصلاح آن را فراموش کنید، می‌توانید تغییر(ها) را انجام داده، آن‌ها را استیج کنید و از git stash push --staged برای استش کردن آن‌ها جهت استفاده بعدی بهره ببرید. این کار مشابه کامیت کردن تغییرات استیج‌شده است، با این تفاوت که کامیت به جای شاخه فعلی، در استش قرار می‌گیرد.
# ... hack hack hack ...
$ git add --patch foo           # add unrelated changes to the index
$ git stash push --staged       # save these changes to the stash
# ... hack hack hack, finish current changes ...
$ git commit -m 'Massive'       # commit fully tested changes
$ git switch fixup-branch       # switch to another branch
$ git stash pop                 # to finish work on the saved changes

بازیابی مدخل‌های استش که به اشتباه پاک یا حذف شده‌اند

اگر به اشتباه مدخل‌های استش را حذف (drop) یا پاک (clear) کنید، از طریق سازوکارهای ایمنی معمول قابل بازیابی نیستند. با این حال، می‌توانید دستور زیر را برای دریافت فهرستی از مدخل‌های استش که هنوز در مخزن شما موجودند اما دیگر قابل دسترسی نیستند، امتحان کنید:
git fsck --unreachable |
grep commit | cut -d\  -f3 |
xargs git log --merges --no-walk --grep=WIP

تمام موارد زیر در این بخش به طور گزینشی از مستندات git-config(1) آورده شده است. محتوا دقیقاً همان چیزی است که در آنجا یافت می‌شود:

stash.index

اگر این متغیر روی true تنظیم شود، git stash apply و git stash pop به گونه‌ای رفتار خواهند کرد که گویی گزینه --index داده شده است. مقدار پیش‌فرض آن false است.

stash.showIncludeUntracked

اگر این متغیر روی true تنظیم شود، دستور git stash show فایل‌های ردگیری‌نشده یک مدخل استش را نمایش خواهد داد. مقدار پیش‌فرض آن false است.

stash.showPatch

اگر این متغیر روی true تنظیم شود، دستور git stash show بدون هیچ گزینه‌ای، مدخل استش را در قالب وصله (patch) نشان خواهد داد. مقدار پیش‌فرض آن false است.

stash.showStat

اگر این متغیر روی true تنظیم شود، دستور git stash show بدون هیچ گزینه‌ای، آمار تفاوت‌ها (diffstat) را برای مدخل استش نشان خواهد داد. مقدار پیش‌فرض آن true است.

git-checkout(1), git-commit(1), git-reflog(1), git-reset(1), git-switch(1)

بخشی از مجموعه git(1)

2026-06-29 Git 2.55.0