Mundarija (39)
- Bu darsda
- 1. Nega bu kerak?
- 2. Muammoni ko'ramiz: branch almashmaydi
- 2.1 Boshlang'ich holat
- 2.2 main ga o'tishga urinish
- 3. git stash push — javonga qo'yish
- 3.1 Birinchi urinish
- 3.2 Nega yangi fayl qoldi?
- 3.3 -u — yangi fayllar bilan birga
- 4. Shoshilinch tuzatish
- 5. Javonda nima bor? list va show
- 5.1 git stash list
- 5.2 -m siz stash qanday ko'rinadi?
- 5.3 git stash show — qisqa ko'rinish
- 5.4 git stash show -p — to'liq farq
- 6. apply va pop farqi
- 6.1 git stash pop — olib, javondan o'chirish
- 6.2 git stash apply — olib, javonda qoldirish
- 7. Bir nechta stash bilan ishlash
- 7.1 Ikki stash — stash@{0} va stash@{1}
- 7.2 Aniq stashni tanlash
- 7.3 Faqat bitta faylni stash qilish
- 8. Stash conflictlari
- 8.1 Conflict qanday paydo bo'ladi
- 8.2 Markerlar va yechim
- 9. git stash branch — stashdan yangi branch
- 10. Ko'p uchraydigan xatolar
- 10.1 "Stash yo'q"
- 10.2 "Saqlaydigan narsa yo'q"
- 10.3 Stashni unutish
- 10.4 Stash boshqa kompyuterga bormaydi
- 11. Mashqlar
- 1-mashq (oson): Buyruq va natija
- 2-mashq (o'rta): Bo'sh joylarni to'ldiring
- 3-mashq (qiyin): Stajyorning javoni
- 4-mashq: Portfolio qadami — shoshilinch tuzatish
- 12. Real ishda
- Xulosa
- Manbalar
Git stash: yarim ishni vaqtincha chetga olish
Qisqacha:
git stashhali tugamagan o'zgarishlarni commit qilmasdan vaqtincha chetga oladi va ishchi papkani toza holatga qaytaradi. Keyin boshqa branchda shoshilinch ishni bajarib,git stash popbilan yarim ishni joyiga qaytarasiz. Yangi (untracked) fayllarni ham olish uchun-ukerak, har stashga esa-m "izoh"bilan nom bergan ma'qul.
Bu darsda
- Yarim ishni
git stash push -mbilan chetga olib, boshqa branchga xavfsiz o'ta olasiz. - Nega yangi fayl stashga tushmasligini va
-ubuni qanday tuzatishini tushuntira olasiz. git stash list,showvashow -pbilan ichida nima borligini ko'rasiz.applyvapopfarqini bilasiz, keraksiz stashnidropbilan 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:
git log --onelineb5c9b19 (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 yaratSizning «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:
git switch -c feature/menyu-manti
git add menyu/index.html
git commit -m "Menyu: manti narxini qo'sh"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:
echo "<p>Ko'k choy — 5 000" >> menyu/index.html
echo '.narx { color: green; }' > assets/css/menyu.css
git status -s M menyu/index.html
?? assets/css/menyu.cssBitta o'zgargan fayl ( M) va bitta yangi fayl (??).
2.2 main ga o'tishga urinish
git switch mainerror: 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.
AbortingTarjimasi: "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:
mainda turib, boshqa branchning yarim ishini ko'rasiz. Branch almashtirishdan oldingit statusga 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:
git stash push -m "menyu: choy yarim"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 yarimBirinchi 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:
git status -s?? assets/css/menyu.cssmenyu/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):
git stash pop
git status -s 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".
git stash push -u -m "menyu: choy va stil"
git status -swarning: 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 stilgit 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:
.gitignoredagi fayllarni (node_modules/,.env)-uham olmaydi. Ularni ham olish uchun-a(--all) bor. Lekin-aminglab fayllinode_modules/ni javonga ko'chirib, sekin ishlashi mumkin — kamdan-kam kerak bo'ladi.
Tekshirib ko'ring:
git status -snatijasiM index.htmlva?? rasm.png.git stash(flagsiz) dan keyingit status -snimani 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:
git switch mainSwitched to branch 'main'Bu safar xato yo'q. Telefon raqamini VS Code'da tuzatamiz va farqni tekshiramiz (O'zgarishlarni ko'rish):
git diffdiff --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:
git add bron/index.html
git commit -m "Bron: telefon raqamini tuzat"
git switch feature/menyu-manti[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-mantiNimaga 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
git stash liststash@{0}: On feature/menyu-manti: menyu: choy va stilQatorni 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—-mbilan 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:
stash@{0}: WIP on feature/menyu-manti: 151bbc7 Menyu: manti narxini qo'shWIP — "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
git stash show 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:
git stash show -u 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:
git stash show -pdiff --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 000Yarim 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
git stash popOn 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).
git stash list
cat menyu/index.html<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 000list 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:
git stash push -u -m "menyu: choy va stil"
git stash apply
git stash listSaved working directory and index state On feature/menyu-manti: menyu: choy va stil
...
stash@{0}: On feature/menyu-manti: menyu: choy va stilapply 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:
git stash dropDropped 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 applydan keyingit stash listbo'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:
git stash push -m "aloqa: ish vaqti"
git stash listSaved 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 stilYangi 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:
git stash show stash@{1}
git stash apply stash@{1} 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:
git stash drop stash@{0}
git stash listDropped stash@{0} (928e0a0e863d8aeba7c1282b1272e22c20074de8)
stash@{0}: On feature/menyu-manti: menyu: choy va stilAloqa 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. Sinovdacleardan keyinlistshunchaki bo'sh chiqdi — na ogohlantirish, na tasdiq. Bitta keraksiz stash uchun har doimdropishlating.
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:
git stash push -m "faqat stil" -- assets/css/menyu.csserror: 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:
git stash push -u -m "faqat stil" -- assets/css/menyu.css
git status -sSaved working directory and index state On feature/menyu-manti: faqat stil
M menyu/index.htmlFaqat 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:
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 popAuto-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
cat menyu/index.html<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 changesMarkerlar 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:
git add menyu/index.html
git stash drop
git restore --staged menyu/index.html
git status -sDropped refs/stash@{0} (5f4eb8f8f9675643d6cd2d481d1c5736ac09f22c)
?? assets/css/menyu.cssUchinchi 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.
echo '<p>Chegirma: seshanba 10%</p>' >> index.html
git stash push -m "chegirma g'oyasi"
git stash branch feature/chegirmaSaved 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:
- Stash qilingan paytdagi commitdan yangi
feature/chegirmabranchini ochdi va unga o'tdi. - Stashni qo'lladi.
- 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"
git stash popNo 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:
git stashNo local changes to saveTarjimasi: "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.
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
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:
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- Qaysi stashda nima borligini bilish uchun qaysi buyruqni yozasiz?
- Menyu ishini qaytarish kerak, qolganlari keraksiz ekani aniqlandi. Qaysi buyruqlar bilan, qaysi tartibda?
- Sardor
stash@{1}nipopqilganda 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
- Har biri uchun alohida:
git stash show -p stash@{0}, keyinstash@{1}vastash@{2}. Menyu stashida yangi fayl ham bo'lishi mumkin —git stash show -u stash@{1}ham kerak. - Avval kerakligini qaytarish, keyin keraksizlarni o'chirish:
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.
- Ha, qoladi:
The stash entry is kept in case you need it again.Sardor conflictni yechadi,git add menyu/index.html, keyingit 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.
- Loyihalar sahifasiga karta sarlavhasini yozing (masalan
<h2>Landing</h2>), lekin commit qilmang.git status -s. - Yarim ishni izoh bilan stash qiling. Papka toza bo'ldimi?
sayt/aloqa/index.htmldagisizning_kanalni o'z kanalingiz nomiga almashtiring vaAloqa: Telegram havolasini tuzatxabari bilan commit qiling.- Yarim ishni qaytaring.
git status -svagit log --onelinebilan tekshiring: karta commitda yo'q, lekin papkada bor.
Yechim
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 --onelineBiz 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:
M sayt/loyihalar/index.html
76cb315 (HEAD -> main) Aloqa: Telegram havolasini tuzat
9d30edc Aloqa: Telegram havolasini qo'sh
63190c1 Portfolio: 06-qism oxiridagi holatSizda 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 pulldan oldin. Keyinroq GitHub'dan yangilanish olishda (Remote: clone, fetch, pull, push) yarim ish xalaqit berishi mumkin. Git'ning--autostashflagi 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 popvaapplyfarqi?", "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
-ubilan stashga tushadi;showham ularni-ubilan 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,dropqilasiz.git stash branchstashni 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
Izohlar (0)
Izoh yozish uchun kiring.
- Hozircha izoh yo'q. Birinchi bo'ling!