git stash — o'zgarishlarni vaqtincha saqlash, list, pop, drop
Muammodan boshlaylik
Siz feature/qidiruv da ishlayapsiz. 5 ta fayl o'zgargan, kod yarim tayyor — kompilyatsiya ham bo'lmaydi. Shu payt:
"Production da login ishlamayapti, darhol tuzat!"
main ga o'tishingiz kerak. Lekin:
- Commit qilish — yarim tayyor, buzilgan kod tarixda qoladi
git switch main— Git rad etadi: "Your local changes would be overwritten"- O'zgarishlarni o'chirish — 2 soatlik ish yo'qoladi
Kerak — ishni vaqtincha bir chetga qo'yib, keyin aynan shu holatda davom ettirish. Bu — git stash.
Asosiy ish oqimi
git stash # 1. O'zgarishlarni yashirish
git status # → "nothing to commit, working tree clean"
git switch main # 2. Boshqa ish
git switch -c hotfix/login
# ... tuzatish, commit, push ...
git switch feature/qidiruv # 3. Qaytish
git stash pop # 4. O'zgarishlarni qaytarish
git stash — ishchi papka va staging dagi o'zgarishlarni maxsus joyga saqlaydi va papkani toza holatga (oxirgi commit) qaytaradi. git stash pop — ularni qaytaradi va stash dan o'chiradi.
Working dir (o'zgarishlar) ──stash──→ Stash "javoni"
↑ │
└──────────────pop────────────────────┘
Xabar bilan saqlash
Bir nechta stash bo'lsa, nomsiz ularni farqlash qiyin:
git stash push -m "qidiruv: filtrlar yarim tayyor"
Stash ro'yxati
Stash — stek (ustma-ust qo'yilgan qatlam): bir nechta saqlash mumkin.
git stash list
stash@{0}: On feature/qidiruv: qidiruv: filtrlar yarim tayyor
stash@{1}: WIP on main: a3f9c2b Bloklangan foydalanuvchilar
stash@{2}: On feature/savat: savat dizayn tajribasi
stash@{0} — eng yangisi.
Ichida nima bor?
git stash show # oxirgi stash: qaysi fayllar
git stash show -p # to'liq diff
git stash show -p stash@{2} # aniq stash
Qaytarish: pop va apply
git stash pop # oxirgisini qaytarish va stash dan o'chirish
git stash pop stash@{2} # aniq stash ni
git stash apply # qaytarish, lekin stash da QOLDIRISH
git stash apply stash@{1}
apply — bir xil o'zgarishlarni bir nechta branch ga qo'llash kerak bo'lsa, yoki xavfsizlik uchun: avval apply, hammasi joyida ekanini tekshirib, keyin drop.
Conflict bo'lsa
Stash ni qaytarayotganda, fayllar shu orada o'zgargan bo'lsa — conflict (16-dars kabi). pop bu holatda stash ni o'chirmaydi — ma'lumot yo'qolmaydi. Conflict ni hal qiling, keyin qo'lda: git stash drop.
O'chirish
git stash drop # oxirgi stash ni
git stash drop stash@{2} # aniq stash ni
git stash clear # HAMMASINI ⚠️
[!WARNING]
git stash clearvadrop— o'chirilgan stash larni tiklash juda qiyin (hech qaysi branch ularga ishora qilmaydi). Avvalgit stash listvagit stash show -pbilan nima o'chayotganini ko'ring.
Nima stash ga tushadi
Standart holatda — faqat kuzatiladigan fayllardagi o'zgarishlar (modified va staged). Yangi (untracked) fayllar — yo'q!
git stash # yangi fayllar ishchi papkada QOLADI
git stash -u # + untracked fayllar (--include-untracked)
git stash -a # + e'tiborsiz qoldirilganlar ham (--all) — kamdan-kam
[!TIP] Yangi fayl yaratgan bo'lsangiz —
git stash -uni ishlating. Aks holda u yangi branch ga "sizib" o'tadi va chalkashlik keltiradi.
Faqat ba'zi fayllar
git stash push -m "faqat css" src/style.css src/savat.css
git stash push -p # bo'laklab tanlash (add -p kabi)
git stash --keep-index # staged larni qoldirib, qolganini yashirish
--keep-index — commit qilishdan oldin faqat staged o'zgarishlar bilan testlarni ishga tushirish uchun foydali.
Stash dan branch yaratish
Stash ni uzoq vaqt saqladingiz, va endi pop qilsangiz — ko'p conflict. Toza yechim:
git stash branch feature/qidiruv-v2 stash@{0}
Stash yaratilgan commit dan yangi branch yaratadi, o'zgarishlarni unga qo'llaydi va stash ni o'chiradi. Conflict yo'q — chunki asos aynan o'sha.
Stash yoki WIP commit?
Stash muqobili — vaqtinchalik commit:
git add -A
git commit -m "WIP: qidiruv filtrlari"
# ... boshqa ish ...
git switch feature/qidiruv
git reset HEAD~1 # commit ni bekor qilish, o'zgarishlar ishchi papkada qoladi (27-dars)
| stash | WIP commit | |
|---|---|---|
| Tezlik | Bir buyruq | Ikki buyruq |
| Branch ga bog'langan | Yo'q — umumiy stek | Ha — o'z branch ida |
| Unutib qo'yish xavfi | Yuqori — stash lar to'planib, unutiladi | Past — branch da ko'rinib turadi |
| GitHub ga zaxira | Yo'q | Push qilish mumkin |
Qoida: qisqa tanaffus (bir necha daqiqa–soat) — stash. Uzoq (kunlar) yoki muhim ish — WIP commit o'z branch ida. Stash — vaqtinchalik "cho'ntak", uzoq muddatli saqlash joyi emas.
Nima uchun shunday?
Nima uchun stash umumiy stek — har bir branch uchun alohida emas?
Chunki stash ning asosiy vazifasi — o'zgarishlarni bir joydan boshqa joyga ko'chirish imkoniyati. Klassik holat: noto'g'ri branch da ishlay boshladingiz (main da!). Yechim: git stash → git switch -c feature/to'g'ri → git stash pop. O'zgarishlar to'g'ri branch ga "ko'chdi". Agar stash branch ga qattiq bog'langan bo'lsa, bu imkonsiz edi. Lekin aynan shu moslashuvchanlik stash ni chalkash qiladi — shuning uchun ularni -m bilan nomlang va uzoq saqlamang.
Xulosa
Eslab qoling:
git stash— o'zgarishlarni yashirish, toza ishchi papkagit stash push -m "xabar"— nom bilangit stash list,show -p— ko'rishpop— qaytarish + o'chirish;apply— qaytarish, stash da qoldirishdrop,clear— o'chirish (ehtiyot!)-u— yangi fayllar bilangit stash branch nom— stash dan branch- Qisqa tanaffus — stash; uzoq — WIP commit
Keyingi bo'lim
4-bo'lim: GitHub bilan ishlash — remote, clone, push, pull, Pull Request, fork va issue.