Mundarija (35)
- Bu darsda
- 1. Nega bu kerak?
- 2. git restore — ishchi papkadagi o'zgarishni bekor qilish
- 2.1 > va >> adashdi
- 2.2 O'chirilgan faylni qaytarish
- 2.3 Qaytarib bo'lmaydigan amal
- 3. git restore --staged — qutidan olish
- 3.1 Keraksiz fayl qutiga tushdi
- 3.2 Yangi fayl qutidan olinsa
- 4. Oxirgi commitni tuzatish: git commit --amend
- 4.1 Xabardagi imlo xatosi
- 4.2 Unutilgan fayl: --amend --no-edit
- 4.3 Amend aslida nima qiladi
- 4.4 Oltin qoida: yuborilgan commitni amend qilmang
- 5. --source: eski versiyani olib kelish
- 5.1 Faylni tarixdagi holatiga qaytarish
- 5.2 Qaysi hududga tiklash
- 6. git switch, git restore va eski git checkout
- 6.1 Bitta buyruq — ikki ish
- 6.2 Qaysi birini ishlatish
- 7. Ko'p uchraydigan xatolar
- 7.1 Git tanimaydigan fayl
- 7.2 --staged siz restore — ish yo'qoldi
- 7.3 Amend'ni oddiy commit o'rniga ishlatish
- 7.4 Yuborilgan commitni amend qilish
- 7.5 Amend muharrirni ochdi
- 7.6 git restore . qayerda yozildi?
- 8. Mashqlar
- 1-mashq (oson): Qaysi buyruq?
- 2-mashq (o'rta): Bo'sh joylarni to'ldiring
- 3-mashq (qiyin): Uch xato, bitta tartib
- 4-mashq: Portfolio qadami — xatolarni tuzating
- 9. Real ishda
- Xulosa
- Manbalar
Git restore va commit --amend: xatoni xavfsiz tuzatish va bekor qilish
Qisqacha: Commit qilinmagan xatoni
git restore <fayl>bekor qiladi — fayl oxirgi saqlangan holatiga qaytadi (bu qaytarib bo'lmaydigan amal). Qutiga adashib solingan faylnigit restore --staged <fayl>qutidan oladi, o'zgarishga tegmaydi.--source=<commit>faylning eski versiyasini olib keladi. Oxirgi commitdagi xato xabar yoki unutilgan faylnigit commit --amendtuzatadi — lekin u yangi commit yaratadi, shuning uchun GitHub'ga yuborilgan commitni amend qilmang.
Bu darsda
- Ishchi papkadagi o'zgarishni
git restorebilan bekor qilasiz va o'chirilgan faylni qaytarasiz. - Qutiga tushgan faylni
git restore --stagedbilan olasiz. --sourcebilan faylning istalgan eski versiyasini tiklaysiz.git commit --amendbilan oxirgi commitning xabarini va mazmunini tuzatasiz.git switch,git restoreva eskigit checkoutfarqini bilasiz.
Oldin bilishingiz kerak: O'zgarishlarni ko'rish: git diff, Uch hudud, Tarixni o'qish.
1. Nega bu kerak?
Xato qilish — ishning bir qismi. Muhimi — uni tez va hech narsani buzmasdan tuzatish. Git'da xatolar qayerda turganiga qarab uch xil bo'ladi:
- Ishchi papkada — faylni buzib qo'ydingiz, hali qutiga solmadingiz.
- Qutida — keraksiz faylni
git addqilib yubordingiz. - Oxirgi commitda — xabarda imlo xatosi yoki bitta fayl unutilgan.
Bu darsda uchalasini tuzatamiz. Eskiroq commitlardagi xatolarni bekor qilish — reset va revert — keyingi darsda.
Siz bu buyruqni allaqachon ko'p marta ko'rgansiz. Uch hudud darsidan beri git status har safar maslahat beradi: (use "git restore <file>..." to discard changes in working directory) va (use "git restore --staged <file>..." to unstage). O'shanda "keyinroq" degan edik. Bugun o'sha "keyin".
2. git restore — ishchi papkadagi o'zgarishni bekor qilish
2.1 > va >> adashdi
«Bahor» menyusi hozir shunday:
<h1>Bahor menyusi</h1>
<p>Osh — 37 000 so'm</p>
<p>Lag'mon — 30 000 so'm</p>
<p>Manti — 30 000 so'm</p>Aziz menyuga somsa qo'shmoqchi edi. Lekin shoshilib >> o'rniga > yozdi:
echo "<p>Somsa — 8 000 so'm</p>" > menyu/index.html
cat menyu/index.html<p>Somsa — 8 000 so'm</p>Oqimlar va yo'naltirish darsidagi farq: > faylni ustidan yozadi, >> oxiriga qo'shadi. Butun menyu yo'qoldi. Git nima deydi?
git status -s
git diff --stat M menyu/index.html
menyu/index.html | 5 +----
1 file changed, 1 insertion(+), 4 deletions(-)To'rt qator o'chgan, bittasi qo'shilgan. Lekin eski versiya oxirgi commitda turibdi. Uni qaytaramiz:
git restore menyu/index.html
git status -s
cat menyu/index.html<h1>Bahor menyusi</h1>
<p>Osh — 37 000 so'm</p>
<p>Lag'mon — 30 000 so'm</p>
<p>Manti — 30 000 so'm</p>git status -s hech narsa chiqarmadi — fayl oxirgi saqlangan holatda. git restore <fayl> ishchi papkadagi (stoldagi) faylni qutidagi versiya bilan almashtiradi. Qutiga bu fayldan hech narsa solmagan bo'lsangiz, qutidagi versiya — oxirgi commitdagining o'zi. Shuning uchun fayl oxirgi commit holatiga qaytdi.
2.2 O'chirilgan faylni qaytarish
Uch hudud darsida D belgisini ko'rgan edik va "Git uni hali ham qaytarib bera oladi" degan edik. Mana qanday:
rm bron/index.html
git status -s D bron/index.htmlgit restore bron/index.html
git status -s
cat bron/index.html<h1>Stol band qilish</h1>
<p>Telefon: +998 90 000 00 00</p>
<p>Bron kamida 2 soat oldin qilinadi.</p>Fayl joyida. Butun papka o'chgan bo'lsa ham shunday: git restore bron yoki hamma narsani qaytarish uchun git restore ..
2.3 Qaytarib bo'lmaydigan amal
Diqqat:
git restore <fayl>commit qilinmagan o'zgarishlarni butunlay o'chiradi. Ular Git'da hech qachon saqlanmagan — qaytarish uchun hech qayerda nusxa yo'q. Git hatto "ishonchingiz komilmi?" deb ham so'ramaydi. Yozishdan oldingit diffbilan nima yo'qolishini ko'ring (git diff).
Shuning uchun git restore . ni ehtiyot bilan ishlating: u papkadagi hamma saqlanmagan ishni bekor qiladi. Untracked (yangi) fayllarga esa restore umuman tegmaydi — ular Git'ga tanish emas.
Tekshirib ko'ring: Aziz ikki soat davomida
menyu/index.htmlni o'zgartirdi, commit qilmadi va adashibgit restore menyu/index.htmlyozdi. Ikki soatlik ishni Git qaytara oladimi?
Javob
Yo'q. Bu o'zgarishlar hech qachon commit ham, git add ham qilinmagan — Git ularni ko'rmagan. Qaytishning yagona umidi — muharrir: VS Code fayl ochiq bo'lsa, Ctrl + Z yoki Explorer'dagi Timeline panelidagi mahalliy tarix yordam berishi mumkin. Xulosa: ishlayotganda tez-tez commit qiling — commit qilingan narsani Git deyarli hech qachon yo'qotmaydi.
3. git restore --staged — qutidan olish
3.1 Keraksiz fayl qutiga tushdi
Aziz somsani to'g'ri qo'shdi. Shu bilan birga bosh sahifaga sinov uchun bir qator yozgan edi va uni unutdi. Keyin git add .:
echo "<p>Somsa — 8 000 so'm</p>" >> menyu/index.html
git add .
git statusOn branch main
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
modified: index.html
modified: menyu/index.html
Ikkala fayl qutida. index.html dagi sinov qatori commitga tushmasligi kerak. Git maslahat berib turibdi:
git restore --staged index.html
git status -s M index.html
M menyu/index.htmlindex.html dagi M chapdan o'ngga ko'chdi: fayl qutidan chiqdi, lekin o'zgarish joyida — u stolda turibdi. --staged faqat qutiga tegadi, ishchi papkaga emas. Sinov qatorini ko'ramiz:
git diff -- index.htmldiff --git a/index.html b/index.html
index af7cd94..a778519 100644
--- a/index.html
+++ b/index.html
@@ -1,3 +1,4 @@
<h1>Bahor choyxonasi</h1>
<a href="aloqa/">Aloqa</a>
<img src="assets/images/logo.svg" alt="Bahor">
+<p>SINOV — o'chirish kerak</p>Bu qator butunlay kerak emas. Endi uni oddiy git restore bilan bekor qilamiz:
git restore index.html
git status -sM menyu/index.htmlQutida faqat somsa qoldi. Ikki qadam: --staged — qutidan stolga, oddiy restore — stoldan chiqindiga.
3.2 Yangi fayl qutidan olinsa
Yangi (untracked) faylni git add qilib, keyin --staged bilan olsak, u yana untracked bo'ladi:
M menyu/index.html
A tadbirlar.htmlgit restore --staged tadbirlar.html dan keyin:
M menyu/index.html
?? tadbirlar.htmlFayl diskda qoladi. Birinchi repo darsida, birinchi commitdan oldin, Git boshqa maslahat bergan edi — git rm --cached. Birinchi commitgacha taqqoslaydigan "oxirgi commit" yo'q edi, shuning uchun maslahat boshqacha. Hozir ikkalasi bir xil natija beradi.
Tekshirib ko'ring:
git status -sdaMM style.css.git restore --staged style.cssdan keyin nima ko'rinadi? Qaysi o'zgarish yo'qoladi?
Javob
M style.css — hech narsa yo'qolmaydi. Qutidagi va stoldagi o'zgarishlar birlashib, hammasi stolda qoladi. --staged faqat "qutiga solish"ni bekor qiladi, faylning mazmuniga tegmaydi.
4. Oxirgi commitni tuzatish: git commit --amend
4.1 Xabardagi imlo xatosi
Somsa qutida. Commit qilamiz — va shoshilib xato yozamiz:
git commit -m "Menyu: somas narxini qo'sh"[main 16a004b] Menyu: somas narxini qo'sh
1 file changed, 1 insertion(+)"somas" — xato. Tarixda shunday qolishini istamaymiz. --amend ("tuzatish") oxirgi commitni yangisi bilan almashtiradi:
git commit --amend -m "Menyu: somsa narxini qo'sh"
git log --oneline -2[main 5348006] Menyu: somsa narxini qo'sh
Date: Wed Oct 7 09:00:00 2026 +0500
1 file changed, 1 insertion(+)
5348006 (HEAD -> main) Menyu: somsa narxini qo'sh
d473f38 Git: OS xizmat fayllari va loglarni chetlab o'tTarixda endi faqat to'g'ri xabar. Diqqat qiling:
- SHA o'zgardi:
16a004b→5348006. Bu boshqa commit. Date:qatori — Git eslatyapti: muallif sanasi eski commitdan olindi, u o'zgarmaydi.16a004bro'yxatda yo'q — uning o'rniga yangisi turibdi.
-m siz git commit --amend yozsangiz, Git eski xabarni muharrirda ochadi — tahrirlab, saqlab, yopasiz.
4.2 Unutilgan fayl: --amend --no-edit
Keyingi vazifa — somsa rasmi. Aziz menyuga <img> qatorini qo'shdi, rasm faylini yaratdi, lekin faqat menyuni qutiga soldi:
git add menyu/index.html
git commit -m "Menyu: somsa rasmini qo'sh"
git status -s[main 91d1059] Menyu: somsa rasmini qo'sh
1 file changed, 1 insertion(+)
?? assets/images/somsa.svgRasm commitdan tashqarida qoldi. Bu commitni kimdir olsa, menyuda "singan" rasm ko'rinadi (Yaxshi commit darsidagi qoida: har commitdan keyin loyiha ishlashi kerak). Rasmni qutiga solib, oxirgi commitga "qo'shib yuboramiz":
git add assets/images/somsa.svg
git commit --amend --no-edit[main 67d1c06] Menyu: somsa rasmini qo'sh
Date: Wed Oct 7 09:10:00 2026 +0500
2 files changed, 2 insertions(+)
create mode 100644 assets/images/somsa.svg--no-edit — "xabarni o'zgartirma, eskisini ishlat". Endi commitda ikkala fayl:
git show --stat --oneline HEAD67d1c06 (HEAD -> main) Menyu: somsa rasmini qo'sh
assets/images/somsa.svg | 1 +
menyu/index.html | 1 +
2 files changed, 2 insertions(+)--stat va --oneline ni git show bilan birga ishlatish — git log darsidagi flaglar.
4.3 Amend aslida nima qiladi
Amend eski commitni o'zgartirmaydi — Git'da commitni o'zgartirib bo'lmaydi. U yangi commit yaratadi: qutidagi hozirgi holat va yangi (yoki eski) xabar bilan. Keyin branch'ni eski commit o'rniga yangisiga ko'chiradi.
flowchart LR
A["d473f38"] --> B["5348006<br/>somsa"]
B --> C["91d1059<br/>rasmsiz"]
B --> D["67d1c06<br/>rasm bilan"]
M(["main"]) --> D
style C stroke-dasharray: 5 5Nimaga qarang: 91d1059 ham, 67d1c06 ham bir xil otaga (5348006) ulangan. main endi yangisini ko'rsatadi. Punktir ramkadagi eski commit hech qayerga ulanmay qoldi — git log uni ko'rsatmaydi.
U yo'qolmadi. Git HEAD qayerlarda bo'lganini alohida jurnalda — reflog da — yozib boradi:
git reflog -467d1c06 (HEAD -> main) HEAD@{0}: commit (amend): Menyu: somsa rasmini qo'sh
91d1059 HEAD@{1}: commit: Menyu: somsa rasmini qo'sh
5348006 HEAD@{2}: commit (amend): Menyu: somsa narxini qo'sh
16a004b HEAD@{3}: commit: Menyu: somas narxini qo'shIkkala amend ham, ular almashtirgan eski commitlar ham shu yerda. Reflog bilan ishlashni — "yo'qolgan" commitni qaytarishni — Reflog va favqulodda yordam darsida o'rganamiz. Hozircha bilib qo'ying: commit qilingan narsa Git'da deyarli hech qachon yo'qolmaydi.
Yana bir kichik detal. --format=fuller bilan:
Author: Aziz Karimov <aziz@example.com>
AuthorDate: Wed Oct 7 09:10:00 2026 +0500
Commit: Aziz Karimov <aziz@example.com>
CommitDate: Wed Oct 7 09:12:00 2026 +0500AuthorDate — ish boshlangan payt (birinchi commit), CommitDate — amend qilingan payt. git log darsidagi author va committer farqi shu yerda ham ko'rinadi.
4.4 Oltin qoida: yuborilgan commitni amend qilmang
Amend commit SHA'sini o'zgartiradi. Commit faqat sizning kompyuteringizda bo'lsa — muammo yo'q. Lekin u GitHub'ga yuborilgan bo'lsa, boshqalar allaqachon eski SHA'ga ega. Siz esa uni yangisi bilan almashtirdingiz. Endi ikki tarix bir-biriga mos kelmaydi: GitHub yangi commitingizni oddiy yo'l bilan qabul qilmaydi, hamkasblarda chalkashlik boshlanadi.
Qoida oddiy: faqat hali hech kimga yubormagan commitni amend qiling. GitHub'ga yuborilgan xatoni yangi commit bilan tuzating. Bu vaziyatlar va ularni to'g'ri yechish — Remote va Ajralgan tarix darslarida.
Tekshirib ko'ring: Qutida hech narsa yo'q holatda
git commit --amend -m "Yangi xabar"yozsangiz, nima o'zgaradi?
Javob
Faqat xabar (va SHA). Mazmun o'sha-o'sha qoladi, chunki amend qutidagi holatni oladi, qutida esa oxirgi commitdagining o'zi turibdi. "Imlo xatosi" holatida biz aynan shunday qildik.
5. --source: eski versiyani olib kelish
5.1 Faylni tarixdagi holatiga qaytarish
Jasur aka so'radi: "Osh 35 000 bo'lgan paytdagi menyu qanday edi? Uni yana qo'yib ko'raylik." Bu d023ae0 commitdagi holat (git log darsida topgan edik). --source "qaysi commitdan olish"ni aytadi:
git restore --source=d023ae0 menyu/index.html
git status -s
git diff --word-diff -- menyu/index.html M menyu/index.html
...
<h1>Bahor menyusi</h1>
<p>Osh — [-37-]{+35+} 000 so'm</p>
<p>Lag'mon — 30 000 so'm</p>
<p>Manti — 30 000 so'm</p>
[-<p>Somsa — 8 000 so'm</p>-]
[-<img src="../assets/images/somsa.svg" alt="Somsa">-](Diff sarlavhasini ... bilan qisqartirdik.) Fayl ishchi papkada eski holatga keldi: osh 35 000, somsa hali yo'q. Tarix o'zgarmadi — bu oddiy o'zgarish, xohlasangiz commit qilasiz, xohlamasangiz bekor qilasiz. Jasur aka fikridan qaytdi:
git restore menyu/index.html
git status -sBo'sh — fayl yana hozirgi holatda. Faqat ko'rish kerak bo'lsa, faylni o'zgartirmasdan git show d023ae0:menyu/index.html yetarli (git log). --source — eski versiyani ishga qaytarish kerak bo'lganda.
5.2 Qaysi hududga tiklash
git restore standart holatda faqat ishchi papkani o'zgartiradi. Flaglar bilan boshqa hududni tanlash mumkin:
| Buyruq | Qayerdan | Qayerga |
|---|---|---|
git restore f |
staging | ishchi papka |
git restore --staged f |
HEAD | staging |
git restore --source=X f |
X commit | ishchi papka |
git restore --source=X --staged --worktree f |
X commit | ikkalasiga |
--worktree (-W) — "ishchi papkaga", --staged (-S) — "staging'ga". Ikkalasi birga — ikkala hududga bir vaqtda.
flowchart RL
H["Oxirgi commit<br/>(HEAD)"] -- "restore --staged" --> S["Staging"]
S -- "restore" --> W["Ishchi papka"]
X["Istalgan commit"] -. "restore --source=X" .-> WNimaga qarang: strelkalar Uch hudud darsidagi add va commit ga teskari yo'nalishda. add stoldan qutiga olib boradi — restore --staged qutini HEAD holatiga qaytaradi. restore esa stolni qutidagi holatga qaytaradi.
6. git switch, git restore va eski git checkout
6.1 Bitta buyruq — ikki ish
Internetda va eski qo'llanmalarda restore o'rniga boshqa buyruqni ko'p uchratasiz:
git checkout -- index.htmlBu git restore index.html bilan bir xil ishni qiladi. Yillar davomida git checkout ikki butunlay boshqa ishni bajargan:
- Branch'ga o'tish:
git checkout main. - Faylni tiklash:
git checkout -- index.html.
Muammo: git checkout menyu — bu menyu branch'iga o'tishmi yoki menyu papkasini tiklashmi? Nom bir xil bo'lsa, natija kutilmagan bo'lishi mumkin. Birinchisi xavfsiz, ikkinchisi esa saqlanmagan ishni o'chiradi. Shuning uchun Git 2.23 (2019-yil) checkout ni ikki aniq buyruqqa ajratdi:
| Ish | Eski yo'l | Yangi yo'l |
|---|---|---|
| Branch'ga o'tish | git checkout main |
git switch main |
| Faylni tiklash | git checkout -- f |
git restore f |
| Qutidan olish | git reset HEAD f |
git restore --staged f |
Uchinchi qatordagi reset ni keyingi darsda o'rganamiz — u fayldan ko'ra ko'proq narsani qila oladi.
Hozir bizda bitta branch bor, shuning uchun o'tadigan joy yo'q:
git switch mainAlready on 'main'Tarjimasi: "Allaqachon main da". git checkout main ham aynan shu javobni beradi. Branch'lar va git switch ni Branch nima darsida to'liq o'rganamiz.
6.2 Qaysi birini ishlatish
Kursda — yangi buyruqlar: switch va restore. Ular bitta ishni qiladi va git status maslahatlari ham ularni ko'rsatadi. git checkout ni esa o'qiy olish kerak: eski kodda, Stack Overflow javoblarida, ba'zi vositalarning hujjatida hali ham uchraydi. Ko'rsangiz — tarjima qiling: fayl bilan bo'lsa restore, branch bilan bo'lsa switch.
checkout o'chirilmagan va o'chirilmaydi ham — u ishlayveradi. Faqat yangi ishga yangi vositalar aniqroq.
7. Ko'p uchraydigan xatolar
7.1 Git tanimaydigan fayl
git restore yangi.htmlerror: pathspec 'yangi.html' did not match any file(s) known to gitTarjimasi: "xato: yangi.html yo'li Git'ga ma'lum birorta faylga mos kelmadi". Ikki holatda chiqadi: fayl nomida xato bor yoki fayl untracked — Git uni hech qachon ko'rmagan, demak "oldingi versiyasi" ham yo'q. Yangi faylni bekor qilish kerak bo'lsa, uni oddiy rm bilan o'chirasiz.
7.2 --staged siz restore — ish yo'qoldi
Eng og'ir xato: "qutidan olmoqchi edim" deb --staged ni unutish. git restore f qutiga emas, stolga tegadi — agar faylda qutiga solinmagan o'zgarish bo'lsa, u yo'qoladi. Qoida: restore dan oldin git status -s va git diff ga qarang.
7.3 Amend'ni oddiy commit o'rniga ishlatish
Har kichik o'zgarishni oxirgi commitga amend qilib qo'shib boraverish — tarixni "bitta katta commit"ga aylantiradi. Amend — xatoni tuzatish uchun: unutilgan fayl, imlo, kichik kamchilik. Yangi ish — yangi commit (Yaxshi commit).
7.4 Yuborilgan commitni amend qilish
«Oltin qoida» bo'limidagi holat. GitHub'ga yuborilgan commitni amend qilsangiz, keyingi yuborishda Git uni rad etadi. Buni "majburan" yuborish yo'li bor, lekin u hamkasblar ishini buzishi mumkin — Ajralgan tarix darsida xavfsiz yo'lini ko'rasiz.
7.5 Amend muharrirni ochdi
-m va --no-edit siz git commit --amend muharrirni ochadi. Bu xato emas — Git eski xabarni tahrirlashni taklif qilyapti. O'zgartirmasangiz, shunchaki saqlab yoping.
7.6 git restore . qayerda yozildi?
Nuqta — "joriy papka" (Birinchi repo darsidagi git add . kabi). menyu/ ichida turib yozilgan git restore . faqat menyu papkasidagi o'zgarishlarni bekor qiladi, repoda boshqa joydagilarga tegmaydi. Aksincha, repo ildizida yozilsa — hammasini. Bekor qilishdan oldin pwd bilan qayerda turganingizni tekshiring.
8. Mashqlar
1-mashq (oson): Qaysi buyruq?
Har vaziyatga buyruqni tanlang: git restore f, git restore --staged f, git commit --amend --no-edit, git commit --amend -m "...".
aloqa/index.htmlni adashibgit addqildingiz. Undagi o'zgarish kerak, lekin hozirgi commitga emas.style.cssdagi saqlanmagan tajribalaringiz yoqmadi, oxirgi commitdagi holat kerak.- Hozirgina qilingan commitda
logo.svgunutilgan (hali yuborilmagan). - Hozirgina qilingan commit xabarida "Bron: fromani tuzat" deb yozilgan.
Ishora: «Qaysi hududga tiklash» jadvali va «Oxirgi commitni tuzatish» bo'limi.
Yechim
git restore --staged aloqa/index.html— qutidan chiqadi, o'zgarish stolda qoladi. Oddiyrestoreto'g'ri kelmaydi: u o'zgarishni o'chirib yuborardi.git restore style.css— o'zgarishlar yo'qoladi, qaytarib bo'lmaydi. Oldingit diff style.cssga qarang.git add logo.svg, keyingit commit --amend --no-edit.git commit --amend -m "Bron: formani tuzat".
2-mashq (o'rta): Bo'sh joylarni to'ldiring
Sinov nusxasida menyuga chuchvara qo'shdingiz va bron sahifasiga sinov qatorini yozdingiz. Ikkalasi qutida. Bron qatori umuman kerak emas:
git restore bron/index.html
git bron/index.html
git commit -m "Menyu: chuchvara narxini qo'sh"Keyin chuchvara haqida yana bir qator yozishni unutganingizni esladingiz. Qatorni qo'shib, qutiga solasiz va:
git commit Ishora: «Keraksiz fayl qutiga tushdi» bo'limidagi ikki qadam.
Yechim
--staged, restore, --amend, --no-edit. Biz «Bahor» sinov nusxasida sinadik. Bron bilan ishlashdan keyin git status -s:
M menyu/index.htmlAmend natijasi:
[main 65070b6] Menyu: chuchvara narxini qo'sh
Date: Wed Oct 7 10:00:00 2026 +0500
1 file changed, 2 insertions(+)2 insertions — chuchvara va qo'shimcha qator bitta commitda. Sizda SHA boshqacha bo'ladi.
3-mashq (qiyin): Uch xato, bitta tartib
Sardorning holati (git status -s va git log --oneline -1):
A eski.txt
MM menyu/index.html
D rasm.png
?? qoralama.html
1070e10 (HEAD -> main) Menyu: narxlarni yangilaOxirgi commit hali yuborilmagan. Sardor xohlaydi:
eski.txtcommitga tushmasin, lekin diskda qolsin;- o'chirilgan
rasm.pngqaytsin; - menyudagi stoldagi o'zgarishlar bekor bo'lsin, qutidagilari qolsin;
- qutidagi menyu o'zgarishi oxirgi commitga qo'shilsin.
Buyruqlarni to'g'ri tartibda yozing. qoralama.html nima bo'ladi?
Ishora: MM — ikki holat; amend qutidagini oladi, shuning uchun avval qutini tartibga keltiring.
Yechim
git restore --staged eski.txt
git restore rasm.png
git restore menyu/index.html
git commit --amend --no-editeski.txtqutidan chiqadi va??bo'ladi — diskda qoladi.rasm.pngoxirgi commitdan qaytadi.- Oddiy
restorestolni qutidagi holatga qaytaradi — qutidagi o'zgarishlar saqlanadi, faqat stoldagi qo'shimchalar ketadi. Natija:M menyu/index.html. - Amend qutidagini — menyuni — oxirgi commitga qo'shadi.
qoralama.html — untracked, hech bir buyruq unga tegmaydi, ?? bo'lib qoladi. Tartib muhim: amend'ni birinchi qilsangiz, eski.txt ham commitga tushib qolardi.
Biz shu holatni sinov repoda yasab, tekshirdik. Uchta restore dan keyingi git status -s:
M menyu/index.html
?? eski.txt
?? qoralama.htmlAmend'dan keyin qutida hech narsa qolmaydi, eski.txt va qoralama.html esa ?? bo'lib turadi.
4-mashq: Portfolio qadami — xatolarni tuzating
- Portfolio aloqa sahifasiga email qatorini qo'shing. Hozircha namunaviy
aziz@example.commanzilini yozing. Ungaasosiy.cssda bitta stil qo'shing. Faqat HTML'ni qutiga solib, xabarda ataylab xato bilan commit qiling:Aloqa: emial manzilini qo'sh. git status -s— CSS stolda qoldi. Uni qutiga solib, bitta amend bilan ham faylni qo'shing, ham xabarni tuzating.git show --stat --oneline HEADbilan tekshiring: commitda ikki fayl va to'g'ri xabar.asosiy.cssga sinov uchunbody { display: none; }yozing,git diff --statga qarang vagit restorebilan bekor qiling.git status—working tree clean.mashqlar/07/09-restore-amend/javoblar.mdga mashq javoblarini yozib, commit qiling.
Yechim
cd ~/kurs/portfolio
git add sayt/aloqa/index.html
git commit -m "Aloqa: emial manzilini qo'sh"
git status -s
git add sayt/assets/css/asosiy.css
git commit --amend -m "Aloqa: email manzilini qo'sh"
git show --stat --oneline HEADBiz qisqa portfolio nusxasida sinadik:
[main 392d82e] Aloqa: emial manzilini qo'sh
1 file changed, 1 insertion(+)
M sayt/assets/css/asosiy.css
[main 1f8ea08] Aloqa: email manzilini qo'sh
Date: Wed Oct 7 11:00:00 2026 +0500
2 files changed, 2 insertions(+)
1f8ea08 (HEAD -> main) Aloqa: email manzilini qo'sh
sayt/aloqa/index.html | 1 +
sayt/assets/css/asosiy.css | 1 +
2 files changed, 2 insertions(+)Bitta --amend -m ikkala ishni qildi: qutidagi CSS qo'shildi va xabar almashdi. 4-qadam:
git diff --stat
git restore sayt/assets/css/asosiy.css
git status sayt/assets/css/asosiy.css | 1 +
1 file changed, 1 insertion(+)
On branch main
nothing to commit, working tree cleangit log --oneline -3 da emial xabarli commit yo'q — faqat tuzatilgani. mashqlar da yangi commit: 07/09: restore va amend mashqlari javoblarini qo'sh.
VS Code'da ham xuddi shu amallar bor: Source Control panelida fayl ustidagi + — git add, − — restore --staged, aylana strelka (Discard Changes) — restore. Farqi: VS Code "Discard" dan oldin tasdiq so'raydi, terminal esa so'ramaydi.
9. Real ishda
- Kundalik refleks. "Tajriba qildim, yoqmadi" —
git restore .. "Adashib qo'shdim" —git restore --staged. Bu ikki buyruq har kuni ishlatiladi. - Commitdan keyingi tekshiruv. Ko'p dasturchi commitdan keyin darhol
git show --statga qaraydi. Unutilgan fayl shu yerda ko'rinadi — va hali yuborilmagan bo'lsa, amend bilan bir soniyada tuzatiladi. - Jamoa qoidasi. Deyarli hamma jamoada "umumiy branch'dagi tarixni qayta yozmang" degan qoida bor. Amend — faqat o'z lokal ishingiz uchun. Qism oxirida ko'radigan branch himoyasi bu qoidani GitHub'ning o'zida majburiy qiladi.
- Intervyuda: "Oxirgi commitga faylni qanday qo'shasiz?", "
git restorevagit restore --stagedfarqi?", "Nega push qilingan commitni amend qilmaslik kerak?" — bu darsdan keyin uchalasiga javob tayyor.
Xulosa
git restore f— stoldagi o'zgarishni bekor qiladi (qaytarib bo'lmaydi); o'chirilgan faylni ham qaytaradi.git restore --staged f— faylni qutidan oladi, o'zgarish stolda qoladi.git restore --source=X f— faylni X commitdagi holatiga keltiradi;--staged --worktree— ikkala hududga.git commit --amend— oxirgi commitni yangisi bilan almashtiradi: xabar (-m) yoki unutilgan fayl (--no-edit); SHA o'zgaradi.- Faqat hali yuborilmagan commitni amend qiling.
git checkout— eski ikki vazifali buyruq; yangi ishdaswitch(branch) varestore(fayl).
Keyingi dars: Xatoni tuzatish 2: reset va revert — oxirgisidan eskiroq commitlarni bekor qilishni va umumiy tarix uchun xavfsiz yo'lni o'rganamiz.
Manbalar
- Git hujjati: "git-restore", "git-commit" (
--amend,--no-edit), "git-switch", "git-checkout", "git-reflog" — git-scm.com/docs - Git 2.23 reliz yozuvlari:
git switchvagit restoreqo'shilgani — github.com/git/git, Documentation/RelNotes/2.23.0.txt - Pro Git kitobi: "Undoing Things" — git-scm.com/book
Izohlar (0)
Izoh yozish uchun kiring.
- Hozircha izoh yo'q. Birinchi bo'ling!