فرض کنید که در حال کار برروی یک ویژگی جدید برای محصولتان هستید، در حال نوشتن کد پروژه هستید، که ناگهان customer escalation میاید. به این دلیل شما باید کارتان روی ویژگی جدید را برای مدتی کنار بگذارید. شما نمیتوانید کارتان را نصفه و نیمهتمام commit کنید و همچنین نمیتوانید دور بیاندازیدش، بنابراین شما باید آن را به طور موقت در جایی قرار دهید و در زمان مناسب، آن را تکمیل و commit کنید
در git عمل stash برای این تعبیه شدهاست که فایلهای شما رهگیری stage area را که هنوز commit نشدهاند، در stack ذخیره شود و شما در هر زمام که بخواهید، بتوانید آنها را ادامه دهید
[jerry@CentOS project]$ git status -s M string.c ?? string
حالا شما میخواهید branch را برای customer escalation تغییر دهید، اما نمیخواهید تغییراتی را که روی آنها کار میکردید commit کنید، بنابراین شما تغییراتتان را به جای Stash, Commit میکنید. برای اضافه کردن یک stash به پشته خود، از دستور git stash استفاده میکنیم
[jerry@CentOS project]$ git stash Saved working directory and index state WIP on master: e86f062 Added my_strcpy function HEAD is now at e86f062 Added my_strcpy function
حالا working directory ما خالی شده و روی پشته ما ذخیره شده است، میتوانیم صحت جمله قبل را با دستور git stasus بررسی کنیم
[jerry@CentOS project]$ git status -s ?? string
اکنون میتوانیم با خیال آسوده branch را تغییر و کارمان را جای دیگری ادامه دهیم. میتوانیم فهرست تغییراتی را که stash شدهاند، با دستور git stash list ببینیم
[jerry@CentOS project]$ git stash list stash@{0}: WIP on master: e86f062 Added my_strcpy function
اکنون فرض کنیم مشکلمان با customer escalation حل شده و میخواهیم کار برروی ویژگی جدیدمان- که نیمه کاره رها کردیم- را ادامه دهیم. کافیست دستور git stash pop را اجرا کنیم، این دستور آخرین تغییرات را از روی stack برداشته و به working directory منتقل میکند
[jerry@CentOS project]$ git status -s ?? string [jerry@CentOS project]$ git stash pop
دستورات بالا نتایج زیر را در برخواهند داشت:
# On branch master # Changed but not updated: # (use "git add ..." to update what will be committed) # (use "git checkout -- ..." to discard changes in working directory) # # modified: string.c # # Untracked files: # (use "git add ..." to include in what will be committed) # # string no changes added to commit (use "git add" and/or "git commit -a") Dropped refs/stash@{0} (36f79dfedae4ac20e2e8558830154bd6315e72d4) [jerry@CentOS project]$ git status -s M string.c ?? string