IlmHamroh
JavaScript Full-stack/7-qism. Git va GitHub asoslari9/36-dars19 daqiqa
Mundarija (35)

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 faylni git restore --staged <fayl> qutidan oladi, o'zgarishga tegmaydi. --source=<commit> faylning eski versiyasini olib keladi. Oxirgi commitdagi xato xabar yoki unutilgan faylni git commit --amend tuzatadi — lekin u yangi commit yaratadi, shuning uchun GitHub'ga yuborilgan commitni amend qilmang.

Bu darsda

  • Ishchi papkadagi o'zgarishni git restore bilan bekor qilasiz va o'chirilgan faylni qaytarasiz.
  • Qutiga tushgan faylni git restore --staged bilan olasiz.
  • --source bilan faylning istalgan eski versiyasini tiklaysiz.
  • git commit --amend bilan oxirgi commitning xabarini va mazmunini tuzatasiz.
  • git switch, git restore va eski git checkout farqini 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:

  1. Ishchi papkada — faylni buzib qo'ydingiz, hali qutiga solmadingiz.
  2. Qutida — keraksiz faylni git add qilib yubordingiz.
  3. 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:

text
<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:

bash
echo "<p>Somsa — 8 000 so'm</p>" > menyu/index.html
cat menyu/index.html
text
<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?

bash
git status -s
git diff --stat
text
 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:

bash
git restore menyu/index.html
git status -s
cat menyu/index.html
text
<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:

bash
rm bron/index.html
git status -s
text
 D bron/index.html
bash
git restore bron/index.html
git status -s
cat bron/index.html
text
<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 oldin git diff bilan 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.html ni o'zgartirdi, commit qilmadi va adashib git restore menyu/index.html yozdi. 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 .:

bash
echo "<p>Somsa — 8 000 so'm</p>" >> menyu/index.html
git add .
git status
text
On 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:

bash
git restore --staged index.html
git status -s
text
 M index.html
M  menyu/index.html

index.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:

bash
git diff -- index.html
text
diff --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:

bash
git restore index.html
git status -s
text
M  menyu/index.html

Qutida 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:

text
M  menyu/index.html
A  tadbirlar.html

git restore --staged tadbirlar.html dan keyin:

text
M  menyu/index.html
?? tadbirlar.html

Fayl 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 -s da MM style.css. git restore --staged style.css dan 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:

bash
git commit -m "Menyu: somas narxini qo'sh"
text
[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:

bash
git commit --amend -m "Menyu: somsa narxini qo'sh"
git log --oneline -2
text
[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't

Tarixda 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.
  • 16a004b ro'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:

bash
git add menyu/index.html
git commit -m "Menyu: somsa rasmini qo'sh"
git status -s
text
[main 91d1059] Menyu: somsa rasmini qo'sh
 1 file changed, 1 insertion(+)
?? assets/images/somsa.svg

Rasm 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":

bash
git add assets/images/somsa.svg
git commit --amend --no-edit
text
[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:

bash
git show --stat --oneline HEAD
text
67d1c06 (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 5

Nimaga 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:

bash
git reflog -4
text
67d1c06 (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'sh

Ikkala 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:

text
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 +0500

AuthorDate — 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:

bash
git restore --source=d023ae0 menyu/index.html
git status -s
git diff --word-diff -- menyu/index.html
text
 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:

bash
git restore menyu/index.html
git status -s

Bo'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" .-> W

Nimaga 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:

bash
git checkout -- index.html

Bu git restore index.html bilan bir xil ishni qiladi. Yillar davomida git checkout ikki butunlay boshqa ishni bajargan:

  1. Branch'ga o'tish: git checkout main.
  2. 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:

bash
git switch main
text
Already 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

bash
git restore yangi.html
text
error: pathspec 'yangi.html' did not match any file(s) known to git

Tarjimasi: "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 "...".

  1. aloqa/index.html ni adashib git add qildingiz. Undagi o'zgarish kerak, lekin hozirgi commitga emas.
  2. style.css dagi saqlanmagan tajribalaringiz yoqmadi, oxirgi commitdagi holat kerak.
  3. Hozirgina qilingan commitda logo.svg unutilgan (hali yuborilmagan).
  4. Hozirgina qilingan commit xabarida "Bron: fromani tuzat" deb yozilgan.

Ishora: «Qaysi hududga tiklash» jadvali va «Oxirgi commitni tuzatish» bo'limi.

Yechim
  1. git restore --staged aloqa/index.html — qutidan chiqadi, o'zgarish stolda qoladi. Oddiy restore to'g'ri kelmaydi: u o'zgarishni o'chirib yuborardi.
  2. git restore style.css — o'zgarishlar yo'qoladi, qaytarib bo'lmaydi. Oldin git diff style.css ga qarang.
  3. git add logo.svg, keyin git commit --amend --no-edit.
  4. 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:

bash
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:

bash
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:

text
M  menyu/index.html

Amend natijasi:

text
[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):

text
A  eski.txt
MM menyu/index.html
 D rasm.png
?? qoralama.html
1070e10 (HEAD -> main) Menyu: narxlarni yangila

Oxirgi commit hali yuborilmagan. Sardor xohlaydi:

  • eski.txt commitga tushmasin, lekin diskda qolsin;
  • o'chirilgan rasm.png qaytsin;
  • 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
bash
git restore --staged eski.txt
git restore rasm.png
git restore menyu/index.html
git commit --amend --no-edit
  1. eski.txt qutidan chiqadi va ?? bo'ladi — diskda qoladi.
  2. rasm.png oxirgi commitdan qaytadi.
  3. Oddiy restore stolni qutidagi holatga qaytaradi — qutidagi o'zgarishlar saqlanadi, faqat stoldagi qo'shimchalar ketadi. Natija: M menyu/index.html.
  4. 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:

text
M  menyu/index.html
?? eski.txt
?? qoralama.html

Amend'dan keyin qutida hech narsa qolmaydi, eski.txt va qoralama.html esa ?? bo'lib turadi.

4-mashq: Portfolio qadami — xatolarni tuzating

  1. Portfolio aloqa sahifasiga email qatorini qo'shing. Hozircha namunaviy aziz@example.com manzilini yozing. Unga asosiy.css da bitta stil qo'shing. Faqat HTML'ni qutiga solib, xabarda ataylab xato bilan commit qiling: Aloqa: emial manzilini qo'sh.
  2. git status -s — CSS stolda qoldi. Uni qutiga solib, bitta amend bilan ham faylni qo'shing, ham xabarni tuzating.
  3. git show --stat --oneline HEAD bilan tekshiring: commitda ikki fayl va to'g'ri xabar.
  4. asosiy.css ga sinov uchun body { display: none; } yozing, git diff --stat ga qarang va git restore bilan bekor qiling. git status — working tree clean.
  5. mashqlar/07/09-restore-amend/javoblar.md ga mashq javoblarini yozib, commit qiling.
Yechim
bash
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 HEAD

Biz qisqa portfolio nusxasida sinadik:

text
[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:

bash
git diff --stat
git restore sayt/assets/css/asosiy.css
git status
text
 sayt/assets/css/asosiy.css | 1 +
 1 file changed, 1 insertion(+)
On branch main
nothing to commit, working tree clean

git 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 --stat ga 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 restore va git restore --staged farqi?", "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 ishda switch (branch) va restore (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 switch va git restore qo'shilgani — github.com/git/git, Documentation/RelNotes/2.23.0.txt
  • Pro Git kitobi: "Undoing Things" — git-scm.com/book
Ulashish:Telegram'da

Izohlar (0)

Izoh yozish uchun kiring.

  • Hozircha izoh yo'q. Birinchi bo'ling!
Git restore va commit --amend: xatoni xavfsiz tuzatish va bekor qilish — IlmHamroh