IlmHamroh
JavaScript Full-stack/7-qism. Git va GitHub asoslari20/36-dars22 daqiqa
Mundarija (39)

Git stash: yarim ishni vaqtincha chetga olish

Qisqacha: git stash hali tugamagan o'zgarishlarni commit qilmasdan vaqtincha chetga oladi va ishchi papkani toza holatga qaytaradi. Keyin boshqa branchda shoshilinch ishni bajarib, git stash pop bilan yarim ishni joyiga qaytarasiz. Yangi (untracked) fayllarni ham olish uchun -u kerak, har stashga esa -m "izoh" bilan nom bergan ma'qul.

Bu darsda

  • Yarim ishni git stash push -m bilan chetga olib, boshqa branchga xavfsiz o'ta olasiz.
  • Nega yangi fayl stashga tushmasligini va -u buni qanday tuzatishini tushuntira olasiz.
  • git stash list, show va show -p bilan ichida nima borligini ko'rasiz.
  • apply va pop farqini bilasiz, keraksiz stashni drop bilan o'chirasiz.
  • Stash conflictini yechasiz va stashdan to'g'ridan-to'g'ri yangi branch ochasiz.

Oldin bilishingiz kerak: Branch nima, Conflictlarni yechish amaliyoti, Xatoni tuzatish 1: restore va amend.

1. Nega bu kerak?

Oldingi darsda commitlarni tartibga keltirishni o'rgandik. Lekin ish hayotida ko'pincha tartibga keltiradigan commit hali yo'q bo'ladi — ish yarmida turibdi.

Tasavvur qiling. Aziz «Bahor» saytida feature/menyu-manti branchida ishlayapti. Manti narxini qo'shib, commit qildi. Endi ko'k choy narxini yozyapti va menyu uchun alohida CSS fayl ochdi. Qator hali tugamagan: <p>Ko'k choy — 5 000 — yopuvchi teg ham, "so'm" ham yo'q.

Shu payt Jasur aka qo'ng'iroq qiladi: "Bron sahifasidagi telefon raqami xato! Mehmonlar boshqa odamga qo'ng'iroq qilyapti. Hozir tuzating!"

Tuzatish main branchida bo'lishi kerak. Lekin yarim ish bilan nima qilish kerak? Uchta yo'l ko'rinadi, uchalasi ham yomon:

  • Commit qilish — tarixda "yarim ish, hali ishlamaydi" degan buzuq commit paydo bo'ladi.
  • O'chirib tashlash — yarim soatlik ish yo'qoladi.
  • Faylni boshqa papkaga nusxalash — Versiya nazorati darsidagi sayt-eski/ tartibsizligiga qaytish.

To'rtinchi yo'l bor — stash. Ingliz tilida "stash" — "yashirib, chetga qo'yib turish". Oshxonadagi manzarani ko'z oldingizga keltiring. Rustam aka mantini tugib turganda shoshilinch buyurtma keladi. U yarim tayyor xamirni tashlab yubormaydi — ustini yopib, chetdagi javonga qo'yadi. Stolni bo'shatadi, shoshilinch taomni tayyorlaydi, keyin xamirni qaytarib olib, qolgan joyidan davom etadi.

Stash (stash) — Git'dagi o'sha javon: commit qilinmagan o'zgarishlarni vaqtincha saqlaydigan maxsus joy. Stash ishchi papkani va qutini (staging area) oxirgi commit holatiga qaytaradi, o'zgarishlaringizni esa javonga qo'yadi.

2. Muammoni ko'ramiz: branch almashmaydi

2.1 Boshlang'ich holat

Biz sinov repoda «Bahor» tarixini Birinchi repo darsidagi olti commit bilan boshladik va unga bron sahifasidagi telefon raqamini qo'shdik:

bash
git log --oneline
text
b5c9b19 (HEAD -> main) Bron: telefon raqamini qo'sh
07b061d Menyu: lag'mon narxini qo'sh
bd98d1b Bron: rahmat sahifasini qo'sh
b09fa2a Aloqa: sahifa yarat
9084599 Bosh sahifa: aloqa havolasini qo'sh
f4238e7 Menyu: osh narxini qo'sh
dab5bff Bahor: sayt tuzilmasini yarat

Sizning «Bahor» tarixingizda oldingi darslardagi commitlar va branchlar ham bor — SHA'lar boshqacha bo'ladi. Buyruqlar va xabarlar esa aynan bir xil.

Aziz yangi branch ochdi va manti narxini commit qildi:

bash
git switch -c feature/menyu-manti
git add menyu/index.html
git commit -m "Menyu: manti narxini qo'sh"
text
Switched to a new branch 'feature/menyu-manti'
[feature/menyu-manti 151bbc7] Menyu: manti narxini qo'sh
 1 file changed, 1 insertion(+)

Keyin yarim ish boshlandi — menyuga tugallanmagan qator va yangi CSS fayl:

bash
echo "<p>Ko'k choy — 5 000" >> menyu/index.html
echo '.narx { color: green; }' > assets/css/menyu.css
git status -s
text
 M menyu/index.html
?? assets/css/menyu.css

Bitta o'zgargan fayl ( M) va bitta yangi fayl (??).

2.2 main ga o'tishga urinish

bash
git switch main
text
error: Your local changes to the following files would be overwritten by checkout:
	menyu/index.html
Please commit your changes or stash them before you switch branches.
Aborting

Tarjimasi: "xato: quyidagi fayllardagi lokal o'zgarishlaringiz checkout paytida ustidan yozilib ketadi: menyu/index.html. Branch almashtirishdan oldin o'zgarishlarni commit qiling yoki stash qiling. Bekor qilindi."

Nega aynan shu fayl? menyu/index.html ikki branchda har xil: feature/menyu-manti da manti qatori bor, main da yo'q. main ga o'tish uchun Git bu faylni main dagi holatga almashtirishi kerak. Lekin unda sizning saqlanmagan qatoringiz turibdi — almashtirsa, u yo'qoladi. Git buni qilmaydi va to'xtaydi. checkout so'zi eski buyruq nomidan qolgan — switch ham ichkarida xuddi shu ishni qiladi (Xatoni tuzatish 1 darsida farqini ko'rgansiz).

Xabarning o'zi yechimni aytyapti: "commit yoki stash".

Maslahat: Agar o'zgargan fayl ikki branchda bir xil bo'lsa, Git sizni to'xtatmaydi — o'zgarish siz bilan birga yangi branchga "ko'chib o'tadi". Bu qulay, lekin kutilmagan: main da turib, boshqa branchning yarim ishini ko'rasiz. Branch almashtirishdan oldin git status ga qarash odati shuning uchun kerak.

3. git stash push — javonga qo'yish

3.1 Birinchi urinish

Stashning to'liq shakli — git stash push. -m bilan unga izoh beramiz, xuddi commit xabari kabi:

bash
git stash push -m "menyu: choy yarim"
text
warning: in the working copy of 'menyu/index.html', LF will be replaced by CRLF the next time Git touches it
Saved working directory and index state On feature/menyu-manti: menyu: choy yarim

Birinchi qator — Birinchi repo darsidan tanish CRLF ogohlantirishi. Ikkinchisi — asosiy xabar. Tarjimasi: "ishchi papka va indeks holati saqlandi; feature/menyu-manti branchida: menyu: choy yarim". "Indeks" — qutining (staging area) boshqa nomi.

Holatni tekshiramiz:

bash
git status -s
text
?? assets/css/menyu.css

menyu/index.html toza bo'ldi. Lekin yangi CSS fayl joyida qoldi! Stash uni olmadi.

3.2 Nega yangi fayl qoldi?

Oddiy git stash faqat Git tanigan fayllarni oladi — tracked fayllardagi o'zgarishlarni va qutidagi narsalarni. Untracked fayl Git uchun hali "begona". Bu Birinchi repo darsidagi commit -a qoidasiga o'xshaydi: yangi faylga tegmaydi.

Bu xavfli bo'lishi mumkin. Aziz main ga o'tsa, menyu.css ham u bilan birga keladi. Beixtiyor git add . qilsa — yarim ish tuzatish commitiga tushib qoladi.

Keling, stashni qaytarib olib, qaytadan to'g'ri qilamiz. Qaytarish buyrug'i — git stash pop (uni pastda batafsil ko'ramiz):

bash
git stash pop
git status -s
text
 M menyu/index.html
?? assets/css/menyu.css

(pop uzun git status chiqishini ham chiqardi va oxirida Dropped refs/stash@{0} (...) deb yozdi — uni «apply va pop farqi» bo'limida o'qiymiz.)

3.3 -u — yangi fayllar bilan birga

-u — --include-untracked ning qisqasi: "kuzatilmaydigan fayllarni ham qo'sh".

bash
git stash push -u -m "menyu: choy va stil"
git status -s
text
warning: in the working copy of 'assets/css/menyu.css', LF will be replaced by CRLF the next time Git touches it
Saved working directory and index state On feature/menyu-manti: menyu: choy va stil

git status -s hech narsa chiqarmadi — ishchi papka butunlay toza. Ikkala fayl ham javonda.

flowchart LR
  A["Ishchi papka<br/>yarim ish"] -- "git stash push -u" --> S[("Stash<br/>javoni")]
  S -- "git stash pop" --> A
  A -.->|"toza holat"| C["Boshqa branchga<br/>o'tish mumkin"]

Nimaga qarang: stash — ishchi papka yonidagi alohida joy. Yarim ish u yerga ketadi va o'sha yerdan qaytadi. Oradagi vaqtda papka toza — branch bemalol almashadi.

Diqqat: .gitignore dagi fayllarni (node_modules/, .env) -u ham olmaydi. Ularni ham olish uchun -a (--all) bor. Lekin -a minglab faylli node_modules/ ni javonga ko'chirib, sekin ishlashi mumkin — kamdan-kam kerak bo'ladi.

Tekshirib ko'ring: git status -s natijasi M index.html va ?? rasm.png. git stash (flagsiz) dan keyin git status -s nimani ko'rsatadi?

Javob

?? rasm.png. Flagsiz stash faqat tracked fayl — index.html dagi o'zgarishni oladi. Untracked rasm.png joyida qoladi. Uni ham olish uchun git stash push -u kerak edi.

4. Shoshilinch tuzatish

Endi ishchi papka toza. main ga o'tamiz:

bash
git switch main
text
Switched to branch 'main'

Bu safar xato yo'q. Telefon raqamini VS Code'da tuzatamiz va farqni tekshiramiz (O'zgarishlarni ko'rish):

bash
git diff
text
diff --git a/bron/index.html b/bron/index.html
index bd02feb..616d4a5 100644
--- a/bron/index.html
+++ b/bron/index.html
@@ -1,2 +1,2 @@
 <h1>Stol band qilish</h1>
-<p>Tel: +998 90 000 00 01</p>
+<p>Tel: +998 90 000 00 00</p>

(Oldidan CRLF ogohlantirishi ham chiqdi.) Faqat bitta raqam o'zgargan — yarim ishdan hech narsa aralashmagan. Commit qilamiz va ishga qaytamiz:

bash
git add bron/index.html
git commit -m "Bron: telefon raqamini tuzat"
git switch feature/menyu-manti
text
[main e491131] Bron: telefon raqamini tuzat
 1 file changed, 1 insertion(+), 1 deletion(-)
Switched to branch 'feature/menyu-manti'
gitGraph
  commit id: "b5c9b19 telefon"
  branch feature/menyu-manti
  commit id: "151bbc7 manti"
  checkout main
  commit id: "e491131 tuzatish"
  checkout feature/menyu-manti

Nimaga qarang: tuzatish main ga toza, alohida commit bo'lib tushdi. Stash tarixda umuman ko'rinmaydi — u branch ham, oddiy commit ham emas. Endi yarim ishni qaytarish vaqti.

5. Javonda nima bor? list va show

5.1 git stash list

bash
git stash list
text
stash@{0}: On feature/menyu-manti: menyu: choy va stil

Qatorni bo'laklaymiz:

  • stash@{0} — stashning nomi. {0} — eng oxirgi qo'yilgani. Keyingi stash qo'shilsa, u {0} bo'ladi, bu esa {1} ga suriladi.
  • On feature/menyu-manti — qaysi branchda qilingani.
  • menyu: choy va stil — -m bilan bergan izohimiz.

Stash — stek (stack): likopchalar ustma-ust qo'yilgan taxlam kabi. Oxirgi qo'yilgani eng tepada turadi va birinchi olinadi.

5.2 -m siz stash qanday ko'rinadi?

Sinab ko'rdik — git stash ni izohsiz yozdik:

text
stash@{0}: WIP on feature/menyu-manti: 151bbc7 Menyu: manti narxini qo'sh

WIP — "work in progress", "jarayondagi ish". Izoh o'rniga Git oxirgi commitning SHA va xabarini yozdi. Bitta stash bo'lsa, farqi yo'q. Lekin uchta WIP on feature/menyu-manti: 151bbc7 ... qatori bo'lsa, qaysi birida nima borligini eslay olmaysiz. Shuning uchun odat — har doim -m.

Eski maqolalarda git stash save "izoh" shaklini uchratasiz. U hali ishlaydi, lekin Git hujjatida eskirgan (deprecated) deb belgilangan — push -m ishlating.

5.3 git stash show — qisqa ko'rinish

bash
git stash show
text
 menyu/index.html | 1 +
 1 file changed, 1 insertion(+)

Bu git diff ning --stat ko'rinishi: qaysi fayl, necha qator. Lekin to'xtang — menyu.css qani? Oddiy show untracked qismni ko'rsatmaydi. Uni ko'rish uchun -u:

bash
git stash show -u
text
 assets/css/menyu.css | 1 +
 menyu/index.html     | 1 +
 2 files changed, 2 insertions(+)

Ikkala fayl joyida. Ko'ryapsizmi: -u bilan qo'yilgan stashni -u bilan ko'rish kerak.

5.4 git stash show -p — to'liq farq

-p (patch) — qatorma-qator farq, xuddi git diff dagidek:

bash
git stash show -p
text
diff --git a/menyu/index.html b/menyu/index.html
index 6af07ae..d1666e0 100644
--- a/menyu/index.html
+++ b/menyu/index.html
@@ -2,3 +2,4 @@
 <p>Osh — 35 000 so'm</p>
 <p>Lag'mon — 28 000 so'm</p>
 <p>Manti — 30 000 so'm</p>
+<p>Ko'k choy — 5 000

Yarim qator shu yerda — + bilan. Bir necha kundan keyin "bu stashda nima edi?" desangiz, show -p javob beradi.

6. apply va pop farqi

6.1 git stash pop — olib, javondan o'chirish

bash
git stash pop
text
On branch feature/menyu-manti
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
	modified:   menyu/index.html

Untracked files:
  (use "git add <file>..." to include in what will be committed)
	assets/css/menyu.css

no changes added to commit (use "git add" and/or "git commit -a")
Dropped refs/stash@{0} (fc02570ae167e08e36091d5310160f06c1917289)

pop ikki ish qildi. Avval o'zgarishlarni qaytardi — pastdagi git status shuni ko'rsatyapti. Keyin oxirgi qator: "Dropped" — "tashlandi". Stash javondan o'chirildi. Qavs ichidagi uzun raqam — stash commitining to'liq SHA'si. U bekorga yozilmagan: adashib muhim stashni o'chirsangiz, shu SHA orqali qaytarish mumkin (Reflog va favqulodda yordam darsida).

bash
git stash list
cat menyu/index.html
text
<h1>Menyu</h1>
<p>Osh — 35 000 so'm</p>
<p>Lag'mon — 28 000 so'm</p>
<p>Manti — 30 000 so'm</p>
<p>Ko'k choy — 5 000

list hech narsa chiqarmadi — javon bo'sh. Fayl esa aynan qoldirgan joyimizda.

6.2 git stash apply — olib, javonda qoldirish

Yana stash qilib, bu safar apply bilan qaytaramiz:

bash
git stash push -u -m "menyu: choy va stil"
git stash apply
git stash list
text
Saved working directory and index state On feature/menyu-manti: menyu: choy va stil
...
stash@{0}: On feature/menyu-manti: menyu: choy va stil

apply ning git status chiqishini ... bilan qisqartirdik — u pop nikining aynan o'zi. Farqi oxirida: Dropped qatori yo'q, list esa stashni hali ham ko'rsatyapti. O'zgarishlar ham papkada, ham javonda.

Keraksiz nusxani o'zimiz o'chiramiz:

bash
git stash drop
text
Dropped refs/stash@{0} (5f4eb8f8f9675643d6cd2d481d1c5736ac09f22c)
Buyruq O'zgarishlarni qaytaradi Javondan o'chiradi
git stash pop ha ha (conflict bo'lmasa)
git stash apply ha yo'q
git stash drop yo'q ha

pop = apply + drop. Qaysi birini qachon ishlatish kerak? Kundalik ishda — pop. apply esa bitta o'zgarishni bir nechta branchga qo'llash kerak bo'lganda yoki "qaytarib ko'raychi, yaxshi chiqmasa, stash hali turibdi" deganda qulay.

Tekshirib ko'ring: git stash apply dan keyin git stash list bo'sh emas. Aziz buni unutdi va bir hafta ishladi. Qanday muammo bo'lishi mumkin?

Javob

Javonda eski, allaqachon ishlatilgan stash qoladi. Bir haftadan keyin list da bir nechta yozuv bo'ladi va qaysi biri hali kerakligini ajratish qiyinlashadi. Eskisini adashib yana pop qilsa, u yangi kodga conflict bilan qo'shilishi mumkin. apply dan keyin ish tugagach — drop.

7. Bir nechta stash bilan ishlash

7.1 Ikki stash — stash@{0} va stash@{1}

Menyu ishi javonda turganda Aziz aloqa sahifasiga ish vaqtini yoza boshladi. Uni ham chetga oldi:

bash
git stash push -m "aloqa: ish vaqti"
git stash list
text
Saved working directory and index state On feature/menyu-manti: aloqa: ish vaqti
stash@{0}: On feature/menyu-manti: aloqa: ish vaqti
stash@{1}: On feature/menyu-manti: menyu: choy va stil

Yangi stash tepaga chiqdi va {0} bo'ldi. Menyu stashi {1} ga surildi. Endi muhim qoida: raqam o'zgaruvchan, izoh esa doimiy. Shuning uchun list ga qarab, keyin raqam bilan ishlaysiz.

7.2 Aniq stashni tanlash

Buyruq oxiriga stash nomini yozsangiz, o'sha bilan ishlaydi:

bash
git stash show stash@{1}
git stash apply stash@{1}
text
 menyu/index.html | 1 +
 1 file changed, 1 insertion(+)

apply stash@{1} menyu ishini qaytardi (git status chiqishini tashlab ketdik). Aloqa stashi esa endi kerak emas — Jasur aka ish vaqtini boshqa joyga yozadigan bo'ldi. Uni o'chiramiz:

bash
git stash drop stash@{0}
git stash list
text
Dropped stash@{0} (928e0a0e863d8aeba7c1282b1272e22c20074de8)
stash@{0}: On feature/menyu-manti: menyu: choy va stil

Aloqa stashi o'chdi, menyu stashi yana {0} ga ko'tarildi.

Diqqat: git stash clear — javondagi hamma stashni birdan o'chiradi va hech narsa so'ramaydi. Sinovda clear dan keyin list shunchaki bo'sh chiqdi — na ogohlantirish, na tasdiq. Bitta keraksiz stash uchun har doim drop ishlating.

7.3 Faqat bitta faylni stash qilish

Ba'zan bitta faylnigina chetga olish kerak. -- dan keyin fayl yo'li yoziladi. Aziz faqat CSS faylni olmoqchi bo'ldi:

bash
git stash push -m "faqat stil" -- assets/css/menyu.css
text
error: pathspec ':(prefix:0)assets/css/menyu.css' did not match any file(s) known to git
Did you forget to 'git add'?

Tarjimasi: "xato: yo'l shabloni Git biladigan hech qanday faylga mos kelmadi. git add ni unutdingizmi?" Tanish pathspec so'zi (Birinchi repo). Boshidagi :(prefix:0) — Git'ning ichki belgisi, unga e'tibor bermang. Sabab o'sha: fayl untracked, oddiy stash uni ko'rmaydi. -u qo'shamiz:

bash
git stash push -u -m "faqat stil" -- assets/css/menyu.css
git status -s
text
Saved working directory and index state On feature/menyu-manti: faqat stil
 M menyu/index.html

Faqat CSS javonga ketdi, menyu fayli joyida.

Yana ikkita foydali flag bor. --staged (yoki -S) faqat qutidagini stash qiladi. --keep-index (-k) esa hammasini stash qiladi, lekin qutidagini papkada ham qoldiradi. Sinab ko'rdik: menyu/index.html ni qutiga solib, git stash push --staged -m "faqat qutidagi" yozdik. Papkada faqat ?? assets/css/menyu.css qoldi. Bir nuqtaga e'tibor bering: pop qilganda fayl qutiga emas, papkaga qaytdi ( M). Qutini ham tiklash uchun git stash pop --index yoziladi.

8. Stash conflictlari

8.1 Conflict qanday paydo bo'ladi

Stash — o'zgarishlarning "yamog'i". U javonda turgan paytda branch oldinga ketsa, yamoq yangi kodga to'g'ri kelmasligi mumkin.

Aziz menyu ishini yana javonga qo'ydi. Keyin Jasur aka ko'k choy narxini aniq aytdi — 6 000 so'm. Aziz uni to'g'ridan-to'g'ri yozib, commit qildi. Endi stashni qaytaradi:

bash
git stash push -u -m "menyu: choy va stil"
echo "<p>Ko'k choy — 6 000 so'm</p>" >> menyu/index.html
git add menyu/index.html
git commit -m "Menyu: ko'k choy narxini qo'sh"
git stash pop
text
Auto-merging menyu/index.html
CONFLICT (content): Merge conflict in menyu/index.html
On branch feature/menyu-manti
Unmerged paths:
  (use "git restore --staged <file>..." to unstage)
  (use "git add <file>..." to mark resolution)
	both modified:   menyu/index.html

Untracked files:
  (use "git add <file>..." to include in what will be committed)
	assets/css/menyu.css

no changes added to commit (use "git add" and/or "git commit -a")
The stash entry is kept in case you need it again.

Boshidagi saqlash va commit qatorlarini tashlab ketdik. CONFLICT so'zi Conflictlarni yechish darsidan tanish. Yangi narsa — oxirgi qator. Tarjimasi: "stash yozuvi yana kerak bo'lib qolsa deb saqlab qolindi". Conflict bo'lsa, pop stashni o'chirmaydi. Bu himoya: yechim chalkashib ketsa, asl stash hali javonda.

8.2 Markerlar va yechim

bash
cat menyu/index.html
text
<h1>Menyu</h1>
<p>Osh — 35 000 so'm</p>
<p>Lag'mon — 28 000 so'm</p>
<p>Manti — 30 000 so'm</p>
<<<<<<< Updated upstream
<p>Ko'k choy — 6 000 so'm</p>
=======
<p>Ko'k choy — 5 000
>>>>>>> Stashed changes

Markerlar tanish, faqat yorliqlari boshqa:

  • Updated upstream — "yangilangan asos": branchdagi hozirgi commit (6 000 so'm).
  • Stashed changes — "stashdagi o'zgarishlar": javondagi yarim qator.

To'g'ri variant — commitdagisi: to'liq qator va yangi narx. VS Code'da markerlarni o'chirib, bitta qator qoldiramiz. Keyin conflict yechildi deb belgilaymiz va stashni o'zimiz o'chiramiz:

bash
git add menyu/index.html
git stash drop
git restore --staged menyu/index.html
git status -s
text
Dropped refs/stash@{0} (5f4eb8f8f9675643d6cd2d481d1c5736ac09f22c)
?? assets/css/menyu.css

Uchinchi buyruqqa e'tibor bering. git add bu yerda faqat "conflict yechildi" degan belgi edi. Biz hali commit qilmoqchi emasmiz, shuning uchun faylni qutidan chiqarib qo'ydik (Xatoni tuzatish 1 dagi restore --staged). Stash conflictida commit qilish shart emas — bu merge'dan farqi.

Yakuniy tartib: conflictni yeching → git add → git stash drop. Oxirgi qadamni unutsangiz, eski stash javonda qolib ketadi.

Tekshirib ko'ring: Nega Git conflictdan keyin stashni o'zi o'chirmaydi?

Javob

Chunki birlashtirish muvaffaqiyatli tugamadi — fayl markerlar bilan yarim holatda. Agar Aziz yechimni buzsa yoki git restore bilan hammasini bekor qilsa, asl o'zgarishlar faqat stashda qoladi. Git ularni sizning roziligingizsiz yo'qotmaydi: o'chirish qarori — drop — sizda.

9. git stash branch — stashdan yangi branch

Ba'zan javondagi ish "vaqtinchalik" emasligi ma'lum bo'ladi. Aziz bosh sahifaga chegirma g'oyasini yozib, stash qilgan edi. Endi bu alohida vazifa — o'z branchi kerak.

bash
echo '<p>Chegirma: seshanba 10%</p>' >> index.html
git stash push -m "chegirma g'oyasi"
git stash branch feature/chegirma
text
Saved working directory and index state On feature/menyu-manti: chegirma g'oyasi
Switched to a new branch 'feature/chegirma'
On branch feature/chegirma
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
	modified:   index.html

no changes added to commit (use "git add" and/or "git commit -a")
Dropped refs/stash@{0} (7c01de46dfe1bf3e3c22b00b24844a24d482b52a)

(CRLF ogohlantirishini tashlab ketdik.) Bitta buyruq uch ish qildi:

  1. Stash qilingan paytdagi commitdan yangi feature/chegirma branchini ochdi va unga o'tdi.
  2. Stashni qo'lladi.
  3. Muvaffaqiyatli bo'lgani uchun stashni o'chirdi.

Asosiy afzalligi — conflict bo'lmaydi. Stash qaysi commit ustida yaratilgan bo'lsa, branch aynan o'sha commitdan boshlanadi. Yamoq o'z joyiga aniq tushadi. Stash eski bo'lib, branch ancha oldinga ketgan bo'lsa — pop o'rniga shu buyruq xavfsizroq.

10. Ko'p uchraydigan xatolar

10.1 "Stash yo'q"

bash
git stash pop
text
No stash entries found.

Tarjimasi: "stash yozuvlari topilmadi". Javon bo'sh. Ko'pincha stash boshqa repoda qilingan bo'ladi yoki allaqachon pop qilingan. Tekshiring: git stash list va git rev-parse --show-toplevel — qaysi repodasiz?

10.2 "Saqlaydigan narsa yo'q"

Faqat yangi qoralama.txt fayli bor papkada:

bash
git stash
text
No local changes to save

Tarjimasi: "saqlanadigan lokal o'zgarishlar yo'q". Chiqish kodi esa 0 — Git buni xato deb hisoblamaydi. Lekin fayl stashga tushmadi! Sabab tanish: fayl untracked. Tuzatish: git stash push -u.

10.3 Stashni unutish

Stash — vaqtinchalik joy, ombor emas. Bir oy javonda yotgan WIP on main yozuvlari hech kimga foyda bermaydi, ularni qaytarish esa conflictga olib keladi. Qoida: stash — soatlar uchun, kunlar uchun emas. Ish uzoq cho'zilsa, alohida branchga commit qiling (yoki git stash branch).

10.4 Stash boshqa kompyuterga bormaydi

Stash faqat sizning kompyuteringizdagi .git ichida yashaydi. Keyingi darslarda GitHub'ga yuborishni (Remote: clone, fetch, pull, push) o'rganasiz — stash u yerga ketmaydi. Uyda boshlagan ishni ishxonada davom ettirish uchun uni branchga commit qilib, yuborish kerak.

Maslahat: VS Code'da ham stash bor: Source Control panelidagi ... menyusida Stash bo'limi. Tugmalar ichkarida xuddi shu buyruqlarni bajaradi. Terminalda nima bo'layotganini tushungach, qaysi biri qulay bo'lsa, shuni ishlating.

11. Mashqlar

1-mashq (oson): Buyruq va natija

Har buyruqni natijasi bilan juftlang:

Buyruq Natija
1. git stash list A. Stashni qaytaradi va o'chiradi
2. git stash pop B. Stashni qaytaradi, lekin javonda qoldiradi
3. git stash apply C. Barcha stashlarni ko'rsatadi
4. git stash drop D. Stashni qaytarmasdan o'chiradi
Yechim

1 — C, 2 — A, 3 — B, 4 — D. Eslab qolish uchun: pop = apply + drop.

2-mashq (o'rta): Bo'sh joylarni to'ldiring

«Bahor» feature/menyu-manti branchida yarim ish bor: M menyu/index.html va ?? assets/css/menyu.css. Ikkalasini ham chetga olib, main da tuzatish qilib, qaytib kelish kerak.

bash
git stash push  -m "menyu: choy va stil"
git switch main
git add bron/index.html
git commit -m "Bron: telefon raqamini tuzat"
git switch feature/menyu-manti
git stash 

Ishora: yangi faylni ham olish kerak («-u — yangi fayllar bilan birga» bo'limi); qaytarib, javonni bo'shatadigan buyruq — «apply va pop farqi» jadvalida.

Yechim
bash
git stash push -u -m "menyu: choy va stil"
git switch main
git add bron/index.html
git commit -m "Bron: telefon raqamini tuzat"
git switch feature/menyu-manti
git stash pop

-u bo'lmasa, menyu.css papkada qoladi va main ga birga ko'chib o'tadi. pop o'rniga apply ham ishlaydi, lekin keyin git stash drop kerak bo'ladi.

3-mashq (qiyin): Stajyorning javoni

Stajyor Sardor bir hafta davomida shunday qildi va endi git stash list natijasi:

text
stash@{0}: WIP on main: e491131 Bron: telefon raqamini tuzat
stash@{1}: On feature/menyu-manti: menyu: choy va stil
stash@{2}: WIP on main: b5c9b19 Bron: telefon raqamini qo'sh
  1. Qaysi stashda nima borligini bilish uchun qaysi buyruqni yozasiz?
  2. Menyu ishini qaytarish kerak, qolganlari keraksiz ekani aniqlandi. Qaysi buyruqlar bilan, qaysi tartibda?
  3. Sardor stash@{1} ni pop qilganda conflict chiqdi. Stash javonda qoladimi? Keyin nima qiladi?

Ishora: «Javonda nima bor?» bo'limidagi show -p va -u; «Bir nechta stash» bo'limidagi raqamlar surilishi; «Stash conflictlari» dagi yakuniy tartib.

Yechim
  1. Har biri uchun alohida: git stash show -p stash@{0}, keyin stash@{1} va stash@{2}. Menyu stashida yangi fayl ham bo'lishi mumkin — git stash show -u stash@{1} ham kerak.
  2. Avval kerakligini qaytarish, keyin keraksizlarni o'chirish:
bash
git switch feature/menyu-manti
git stash pop stash@{1}
git stash list
git stash drop stash@{1}
git stash drop stash@{0}

pop stash@{1} dan keyin raqamlar suriladi: eski {2} endi {1} bo'ladi. Shuning uchun har drop dan oldin list ga qarang. Kattaroq raqamdan boshlab o'chirish — xavfsizroq odat: kichik raqamlar surilmaydi. Hammasi keraksiz ekaniga ishonchingiz komil bo'lsa — git stash clear, lekin u hech narsa so'ramaydi.

  1. Ha, qoladi: The stash entry is kept in case you need it again. Sardor conflictni yechadi, git add menyu/index.html, keyin git stash drop stash@{1} — javondagi eski nusxani o'zi o'chiradi.

4-mashq: Portfolio qadami — shoshilinch tuzatish

Portfolio'ingizda loyihalar sahifasiga landing loyihasi kartasini qo'shyapsiz — ish yarmida. Shu payt aloqa sahifasidagi Telegram havolasi hali namuna nom (sizning_kanal) bilan turgani ma'lum bo'ldi — Merge darsida uni shunday qo'shgan edik. Kartani commit qilmasdan, havolani alohida commit bilan tuzating.

  1. Loyihalar sahifasiga karta sarlavhasini yozing (masalan <h2>Landing</h2>), lekin commit qilmang. git status -s.
  2. Yarim ishni izoh bilan stash qiling. Papka toza bo'ldimi?
  3. sayt/aloqa/index.html dagi sizning_kanal ni o'z kanalingiz nomiga almashtiring va Aloqa: Telegram havolasini tuzat xabari bilan commit qiling.
  4. Yarim ishni qaytaring. git status -s va git log --oneline bilan tekshiring: karta commitda yo'q, lekin papkada bor.
Yechim
bash
cd ~/kurs/portfolio
git status -s
git stash push -m "loyihalar: landing kartasi"
git status -s
git add sayt/aloqa/index.html
git commit -m "Aloqa: Telegram havolasini tuzat"
git stash pop
git status -s
git log --oneline

Biz qisqa portfolio nusxasida sinadik (kanal nomi — aziz_karimov_dev). Birinchi git status -s — M sayt/loyihalar/index.html; stashdan keyin — bo'sh. Commit va pop dan keyin:

text
 M sayt/loyihalar/index.html
76cb315 (HEAD -> main) Aloqa: Telegram havolasini tuzat
9d30edc Aloqa: Telegram havolasini qo'sh
63190c1 Portfolio: 06-qism oxiridagi holat

Sizda tarix uzunroq — oldingi darslardagi commitlar ham bor. Muhimi: havola tuzatishi alohida, toza commit; karta ishi esa papkada, davom ettirishga tayyor. Kartada yangi fayl (masalan rasm) bo'lsa — -u ni unutmang.

12. Real ishda

  • Shoshilinch tuzatish (hotfix) — stashning eng ko'p ishlatiladigan joyi. Jamoada "prod'da xato, hozir qarang" degan xabar kuniga bir necha marta kelishi mumkin.
  • git pull dan oldin. Keyinroq GitHub'dan yangilanish olishda (Remote: clone, fetch, pull, push) yarim ish xalaqit berishi mumkin. Git'ning --autostash flagi aynan stash → yangilash → pop ni o'zi bajaradi.
  • Review'dan oldin tekshirish. Hamkasbingiz "mening branchimni ko'rib chiqing" desa, o'z ishingizni stash qilib, uning branchiga o'tasiz.
  • Stashning cheklovi. Ko'p tajribali dasturchilar uzoq ish uchun stash o'rniga vaqtinchalik commit yoki alohida papka ishlatadi. Ikkinchi yo'lni — bir repoda bir nechta ishchi papka — Worktree darsida o'rganamiz.
  • Intervyuda: "git stash pop va apply farqi?", "Stash yangi fayllarni oladimi?" — bu darsning ikki asosiy savoli.

Xulosa

  • git stash push -m "izoh" yarim ishni javonga qo'yadi va papkani oxirgi commit holatiga qaytaradi.
  • Yangi (untracked) fayllar faqat -u bilan stashga tushadi; show ham ularni -u bilan ko'rsatadi.
  • list — javon, show -p — ichidagi farq; stash@{0} — eng oxirgisi, raqamlar surilib turadi.
  • pop = apply + drop; conflict bo'lsa stash javonda qoladi — yechib, drop qilasiz.
  • git stash branch stashni o'z commitidan yangi branchga conflictsiz tushiradi.
  • Stash lokal va vaqtinchalik — kunlar davom etadigan ish uchun branch va commit.

Keyingi dars: Cherry-pick: bitta commitni ko'chirish — boshqa branchdagi bitta tuzatishni butun branchni birlashtirmasdan kerakli joyga olib o'tamiz.

Manbalar

  • Git hujjati: "git-stash" — git-scm.com/docs/git-stash
  • Pro Git kitobi: "Git Tools — Stashing and Cleaning" — git-scm.com/book
Ulashish:Telegram'da

Izohlar (0)

Izoh yozish uchun kiring.

  • Hozircha izoh yo'q. Birinchi bo'ling!
Git stash: yarim ishni vaqtincha chetga olish — IlmHamroh