git stash — o'zgarishlarni vaqtincha saqlash, list, pop, drop

~15 daq · Git · Branch va Merge

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 clear va drop — o'chirilgan stash larni tiklash juda qiyin (hech qaysi branch ularga ishora qilmaydi). Avval git stash list va git stash show -p bilan 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 -u ni 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 papka
  • git stash push -m "xabar" — nom bilan
  • git stash list, show -p — ko'rish
  • pop — qaytarish + o'chirish; apply — qaytarish, stash da qoldirish
  • drop, clear — o'chirish (ehtiyot!)
  • -u — yangi fayllar bilan
  • git 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.