| GIT-STASH(1) | دستورات عمومی کاربر | GIT-STASH(1) |
نام (NAME)
git-stash - ذخیره موقت تغییرات در یک پوشه کاری کثیف
خلاصه دستور (SYNOPSIS)
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>
توضیحات (DESCRIPTION)
هنگامی که میخواهید وضعیت فعلی پوشه کاری و ایندکس را ثبت کنید، اما در عین حال مایلید به یک پوشه کاری تمیز برگردید، از 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>} است).
دستورها (COMMANDS)
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>...]
برای ثبت سریع یک تصویر لحظهای (snapshot)، میتوانید "push" را حذف کنید. در این حالت، عناصر pathspec تنها پس از یک خط تیره دوگانه -- مجاز هستند تا از ایجاد ناخواسته یک مدخل استش به دلیل املای اشتباه زیردستور جلوگیری شود.
save [-p | --patch] [-S | --staged] [-k | --[no-]keep-index] [-u | --include-untracked] [-a | --all] [-q | --quiet] [<message>]
list [<log-options>]
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>]
pop [--index] [-q | --quiet] [<stash>]
اعمال وضعیت ممکن است به دلیل بروز تداخلها (conflicts) با شکست مواجه شود؛ در این حالت، مدخل از فهرست استشها حذف نخواهد شد. شما باید تداخلها را به صورت دستی حل کرده و سپس به صورت دستی git stash drop را فراخوانی کنید.
apply [--index] [-q | --quiet] [<stash>]
branch <branchname> [<stash>]
این دستور زمانی مفید است که شاخهای که git stash push را روی آن اجرا کردهاید به اندازهای تغییر کرده باشد که git stash apply به دلیل بروز تداخلها با خطا مواجه شود. از آنجا که مدخل استش بر روی کامیتی اعمال میشود که در زمان اجرای git stash به عنوان HEAD فعال بوده است، وضعیت استششده اولیه را بدون هیچ تداخلی بازیابی میکند.
clear
drop [-q | --quiet] [<stash>]
create
store
export ( --print | --to-ref <ref> ) [<stash>...]
import <commit>
گزینهها (OPTIONS)
-a, --all
تمام فایلهای نادیدهگرفتهشده (ignored) و ردگیرینشده (untracked) نیز استش شده و سپس با git clean پاکسازی میشوند.
-u, --include-untracked, --no-include-untracked
هنگامی که با دستور show استفاده شود، فایلهای ردگیرینشده در مدخل استش را به عنوان بخشی از تفاوت (diff) نشان میدهد.
--only-untracked
تنها فایلهای ردگیرینشده در مدخل استش را به عنوان بخشی از تفاوت (diff) نشان میدهد.
--index
تلاش میکند تا نه تنها تغییرات درخت کاری، بلکه تغییرات ایندکس را نیز بازگرداند. با این حال، در صورت وجود تداخلها این کار ممکن است با شکست مواجه شود (چرا که تداخلها در ایندکس ذخیره میشوند و بنابراین دیگر نمیتوانید تغییرات را به همان شکل اولیه اعمال کنید).
--label-ours=<label>, --label-theirs=<label>, --label-base=<label>
از برچسبهای ارائهشده در نشانگرهای تداخل به جای موارد پیشفرض "Updated upstream"، "Stashed changes" و "Stash base" استفاده میکند. گزینه --label-base تنها زمانی که merge.conflictStyle=diff3 باشد تأثیر دارد.
-k, --keep-index, --no-keep-index
تمام تغییراتی که قبلاً به ایندکس اضافه شدهاند دستنخورده باقی میمانند.
-p, --patch
تکههای تغییر (hunk) را به صورت تعاملی از تفاوت میان HEAD و درخت کاری برای ذخیره در استش انتخاب میکند. مدخل استش به گونهای ساخته میشود که وضعیت ایندکس آن همان وضعیت ایندکس مخزن شما باشد، و درخت کاری آن تنها شامل تغییراتی باشد که به صورت تعاملی انتخاب کردهاید. سپس تغییرات انتخابشده از درخت کاری شما به عقب بازگردانده میشوند. برای آشنایی با نحوه کار با حالت --patch، بخش “Interactive Mode” از git-add(1) را ببینید.
گزینه --patch متضمن --keep-index است. برای لغو این رفتار میتوانید از --no-keep-index استفاده کنید.
-U<n>, --unified=<n>
--inter-hunk-context=<n>
-S, --staged
تنها تغییراتی را که در حال حاضر استیج شدهاند (در ایندکس قرار دارند) استش میکند. این مشابه دستور پایه git commit است با این تفاوت که وضعیت به جای شاخه فعلی، در استش کامیت میشود.
گزینه --patch نسبت به این گزینه اولویت دارد.
--pathspec-from-file=<file>
مسیر مشخصشده (pathspec) به جای آرگومانهای خط فرمان، از طریق <file> داده میشود. اگر <file> دقیقاً - باشد، ورودی استاندارد استفاده خواهد شد. عناصر pathspec با LF یا CR/LF از یکدیگر جدا میشوند. عناصر pathspec را میتوان طبق توضیحات ارائهشده برای متغیر پیکربندی core.quotePath در نقلقول (کوتیشن) قرار داد (به git-config(1) مراجعه کنید). همچنین به --pathspec-file-nul و گزینه سراسری --literal-pathspecs نگاه کنید.
--pathspec-file-nul
تنها همراه با --pathspec-from-file معنا دارد. عناصر pathspec با کاراکتر NUL از یکدیگر جدا میشوند و تمام کاراکترهای دیگر دقیقاً همانگونه که هستند تفسیر خواهند شد (شامل خطوط جدید و علامتهای نقلقول).
-q, --quiet
حالت بیصدا، از نمایش پیامهای بازخورد جلوگیری میکند.
زنجیره کامیتهای ارائهدهنده استشهای صادرشده را بدون ذخیره آن در هیچیک از فضاهای نام ارجاع ایجاد کرده و شناسه شیء (object ID) را در خروجی استاندارد چاپ میکند. این گزینه برای استفاده در اسکریپتها طراحی شده است.
--to-ref
زنجیره کامیتهای ارائهدهنده استشهای صادرشده را ایجاد کرده و آن را در ارجاع (ref) مشخصشده ذخیره میکند.
--
مسیر (pathspec) را به منظور رفع ابهام از گزینهها جدا میکند.
<pathspec>...
مدخل استش جدید، وضعیتهای تغییریافته را تنها برای فایلهایی ثبت میکند که با الگوی pathspec مطابقت دارند. سپس مدخلهای ایندکس و فایلهای درخت کاری تنها برای همین فایلها نیز به وضعیت HEAD بازگردانده میشوند، و فایلهایی که با pathspec تطابق ندارند دستنخورده باقی میمانند.
برای جزئیات بیشتر، مدخل pathspec را در gitglossary(7) ببینید.
<stash>
ارجاعی به صورت stash@{<revision>}. هنگامی که هیچ <stash> مشخص نشده باشد، جدیدترین استش در نظر گرفته میشود (یعنی stash@{0}).
بحث و بررسی (DISCUSSION)
یک مدخل استش به عنوان کامیتی نشان داده میشود که درخت آن وضعیت پوشه کاری را ثبت میکند، و والد اول آن همان کامیت موجود در HEAD در زمان ایجاد مدخل است. درخت والد دوم وضعیت ایندکس را در زمان ایجاد مدخل ثبت میکند، و به عنوان فرزندی از کامیت HEAD قرار میگیرد. نمودار تبارشناسی به صورت زیر است:
.----W
/ /
-----H----I
که در آن H کامیت HEAD، I کامیتی که وضعیت ایندکس را ثبت میکند، و W کامیتی است که وضعیت درخت کاری را ثبت میکند.
مثالها (EXAMPLES)
دریافت تغییرات (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 ...
آزمایش کامیتهای جزئی
# ... 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'
ذخیره تغییرات غیرمرتبط برای استفادههای بعدی
# ... 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
بازیابی مدخلهای استش که به اشتباه پاک یا حذف شدهاند
git fsck --unreachable | grep commit | cut -d\ -f3 | xargs git log --merges --no-walk --grep=WIP
پیکربندی (CONFIGURATION)
تمام موارد زیر در این بخش به طور گزینشی از مستندات git-config(1) آورده شده است. محتوا دقیقاً همان چیزی است که در آنجا یافت میشود:
stash.index
stash.showIncludeUntracked
stash.showPatch
stash.showStat
همچنین ببینید (SEE ALSO)
git-checkout(1), git-commit(1), git-reflog(1), git-reset(1), git-switch(1)
گیت (GIT)
بخشی از مجموعه git(1)
| 2026-06-29 | Git 2.55.0 |