Mundarija (35)
- Bu darsda
- 1. Nega bu kerak?
- 2. Tayyorgarlik: HEAD~1 nimani ko'rsatadi?
- 3. git reset — uch darajasi
- 3.1 Uch hudud va reset
- 3.2 --soft: commitni ochib, yana qo'shish
- 3.3 --mixed: commitni ochib, qayta bo'lish
- 3.4 --hard: hammasini o'chirish
- 3.5 --hard ning xavfi
- 3.6 Faylga reset — qutidan olish
- 3.7 Reset tarixga nima qiladi?
- 4. git revert — xatoni yangi commit bilan tuzatish
- 4.1 Birinchi revert
- 4.2 Revert commit ichida nima bor?
- 4.3 --no-edit va muharrir
- 4.4 Revert'ni revert qilish
- 4.5 Bir nechta commitni birdan
- 5. Revert konflikti
- 6. Merge commitni qaytarish: revert -m 1
- 7. Qachon qaysi?
- 8. Ko'p uchraydigan xatolar
- 8.1 --hard ni "tozalash" uchun ishlatish
- 8.2 Yuborilgan commitni reset qilish
- 8.3 HEAD~1 o'rniga HEAD
- 8.4 Merge commitni -m siz revert
- 8.5 Fayl bilan --hard
- 8.6 "Revert — bu reset'ning boshqa nomi"
- 9. Mashqlar
- 1-mashq (oson): Qaysi flag?
- 2-mashq (o'rta): Revert zanjiri
- 3-mashq (qiyin): Stajyor Sardorning savoli
- 4-mashq: Portfolio qadami — sinov va qaytarish
- 10. Real ishda
- Xulosa
- Manbalar
Git reset va git revert: commitni bekor qilishning ikki yo'li
Qisqacha:
git reset HEAD~1oxirgi commitni tarixdan olib tashlaydi:--softo'zgarishni qutida qoldiradi,--mixed(standart) stolda qoldiradi,--hardesa butunlay o'chiradi.git revert <commit>tarixga tegmaydi — eski commitni bekor qiladigan yangi, teskari commit qo'shadi. Qoida: hali hech kimga yubormagan commit —reset, boshqalar allaqachon olgan commit —revert.
Bu darsda
reset --soft,--mixedva--hardqaysi hududga tegishini tushuntirasiz va har birini o'z o'rnida ishlatasiz.HEAD~1,HEAD~3bilan "nechta commit orqaga" ekanini aniq aytasiz.git revertbilan umumiy tarixdagi xatoni hech kimga zarar bermasdan qaytarasiz.- Revert konflikti va merge commitni qaytarish (
-m 1) haqida bilasiz. - "Qachon qaysi?" jadvali bo'yicha to'g'ri buyruqni tanlaysiz.
Oldin bilishingiz kerak: Xatoni tuzatish 1: restore va amend, Tarixni o'qish: git log, Uch hudud.
1. Nega bu kerak?
Oldingi darsda mayda xatolarni tuzatdik: faylni qutidan oldik, o'zgarishni bekor qildik, oxirgi commit xabarini --amend bilan to'g'riladik. Lekin ba'zan muammo kattaroq bo'ladi:
- Ikki-uch commit qildingiz va tushundingizki, bu yo'l noto'g'ri. Hammasini olib tashlamoqchisiz.
- Commitga ikki xil ishni aralashtirib yubordingiz. Uni ochib, ikkiga bo'lmoqchisiz.
- Xato commit allaqachon GitHub'da, Jasur aka uni kompyuteriga olib ham bo'lgan. Endi uni jimgina o'chirib bo'lmaydi.
Bu uch holat uchun Git'da ikki asbob bor. git reset — tarixni orqaga "o'ramoqchi" bo'lganingizda. git revert — tarixni o'zgartirmasdan, xatoni yangi commit bilan tuzatmoqchi bo'lganingizda.
Hayotiy o'xshatish. Siz daftarga hisob yozyapsiz. Qalam bilan yozgan bo'lsangiz va daftarni hali hech kim ko'rmagan bo'lsa — o'chirg'ich bilan o'chirasiz. Bu reset. Daftar allaqachon buxgalterga topshirilgan bo'lsa, o'chirib bo'lmaydi. Yangi qator yozasiz: "yuqoridagi 45 000 xato, to'g'risi 35 000". Bu revert.
2. Tayyorgarlik: HEAD~1 nimani ko'rsatadi?
Ikkala buyruq ham "qaysi commit?" degan savolni talab qiladi. Tarixni o'qish darsida HEAD~n belgisini ko'rgan edik. Eslatib o'tamiz:
HEAD— hozirgi, eng oxirgi commit.HEAD~1— undan bitta oldingisi (otasi).HEAD~3— uchta orqadagisi.
«Bahor» reposida Birinchi repo darsidan keyingi oxirgi uch commit:
git log --oneline -307b061d (HEAD -> main) Menyu: lag'mon narxini qo'sh
bd98d1b Bron: rahmat sahifasini qo'sh
b09fa2a Aloqa: sahifa yaratBu yerda HEAD — 07b061d, HEAD~1 — bd98d1b, HEAD~2 — b09fa2a. Birinchi qatordagi (HEAD -> main) — "HEAD hozir main da, main esa shu commitda" degan belgi.
Misollarni toza boshlash uchun biz «Bahor»ni Birinchi repo darsi oxiridagi holatdan oldik. Sizning reposingizda keyingi darslardagi commitlar ham bor — SHA'lar va ro'yxat boshqacha chiqadi, bu normal. Muhimi — tartib.
Yana bir kelishuv. Windows'da git add, git commit -a va git diff ko'pincha LF will be replaced by CRLF ogohlantirishini chiqaradi (Birinchi repo darsidan tanish). Bu darsdagi chiqishlardan o'sha qatorlarni olib tashladik — mavzuga aloqasi yo'q.
HEAD qanday ishlashini chuqur HEAD va refs darsida ochamiz. Hozircha bitta fikr yetarli: branch (main) — "oxirgi commit shu" degan yorliq. reset aynan shu yorliqni boshqa commitga ko'chiradi.
3. git reset — uch darajasi
3.1 Uch hudud va reset
reset qancha narsani "orqaga o'rashi" flagga bog'liq. Uch hudud darsidagi rasmni eslang: ishchi papka (stol), staging (quti) va repo (tarix).
flowchart LR
S["--soft"] --> R[("Repo:<br/>tarix")]
M["--mixed<br/>(standart)"] --> R
M --> I["Staging:<br/>quti"]
H["--hard"] --> R
H --> I
H --> W["Ishchi papka:<br/>stol"]Nimaga qarang: har bir flag o'zidan oldingisining ishini qiladi va yana bitta hududga tegadi. --soft faqat tarixni o'raydi. --mixed tarix va qutini. --hard — uchalasini, ya'ni stoldagi fayllarni ham.
| Flag | Tarix (commit) | Quti (staging) | Stol (fayllar) |
|---|---|---|---|
--soft |
orqaga | tegmaydi | tegmaydi |
--mixed |
orqaga | tozalanadi | tegmaydi |
--hard |
orqaga | tozalanadi | o'chiriladi |
Endi har birini haqiqiy misolda ko'ramiz.
3.2 --soft: commitni ochib, yana qo'shish
Aziz bron sahifasiga telefon raqamini qo'shdi va commit qildi:
echo '<p>Telefon: +998 90 000 00 00</p>' >> bron/index.html
git add bron/index.html
git commit -m "Bron: telefon raqamini qo'sh"[main 02dce4c] Bron: telefon raqamini qo'sh
1 file changed, 1 insertion(+)Keyin esladi: raqam aloqa sahifasida ham bo'lishi kerak edi. Ikkalasi bitta mantiqiy o'zgarish — bitta commitda turishi kerak (Yaxshi commit darsidagi atomar commit qoidasi). Commitni "ochamiz":
git reset --soft HEAD~1
git log --oneline -207b061d (HEAD -> main) Menyu: lag'mon narxini qo'sh
bd98d1b Bron: rahmat sahifasini qo'shreset hech narsa yozmadi — muvaffaqiyatli bo'lsa, u odatda jim turadi. 02dce4c tarixdan g'oyib bo'ldi. O'zgarish-chi?
git statusOn branch main
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
modified: bron/index.html
O'zgarish joyida, hatto qutida turibdi. --soft faqat main yorlig'ini bir qadam orqaga surdi. Endi aloqa sahifasini qo'shamiz va hammasini birga saqlaymiz:
echo '<p>Telefon: +998 90 000 00 00</p>' >> aloqa/index.html
git add aloqa/index.html
git status -s
git commit -m "Sayt: telefon raqamini bron va aloqaga qo'sh"M aloqa/index.html
M bron/index.html
[main 7b12409] Sayt: telefon raqamini bron va aloqaga qo'sh
2 files changed, 2 insertions(+)Ikki fayl — bitta commit. Bitta commit uchun buni commit --amend bilan ham qilsa bo'lardi. Lekin --soft HEAD~3 bilan uchta commitni birdan ochib, bittaga jamlash mumkin — amend buni qila olmaydi.
3.3 --mixed: commitni ochib, qayta bo'lish
Endi teskari holat. Aziz shoshib, ikki xil ishni bitta commitga soldi — menyuga narx va sarlavha rangi:
echo "<p>Ko'k choy — 5 000 so'm</p>" >> menyu/index.html
echo 'h1 { color: #2f6b4f; }' >> assets/css/asosiy.css
git add .
git commit -m "Menyu va rangni o'zgartir"[main 480c4d0] Menyu va rangni o'zgartir
2 files changed, 2 insertions(+)Xabarning o'zi ham "va" bilan — bu commit ikki ishni qilyapti degan belgi. Uni ochamiz. reset flagsiz yozilsa, --mixed ishlaydi:
git reset HEAD~1Unstaged changes after reset:
M assets/css/asosiy.css
M menyu/index.htmlTarjimasi: "Reset'dan keyin qutiga qo'yilmagan o'zgarishlar". M — modified. Qisqa statusda farq aniq ko'rinadi:
git status -s M assets/css/asosiy.css
M menyu/index.htmlM endi o'ng ustunda — o'zgarishlar stolda, quti bo'sh. --soft dagidan farqi shu. Endi har birini alohida qutiga solib, ikki toza commit qilamiz:
git add menyu/index.html
git commit -m "Menyu: ko'k choy narxini qo'sh"
git add assets/css/asosiy.css
git commit -m "CSS: sarlavhaga rang ber"
git log --oneline -4Oxirgi buyruq natijasi (commitlarning o'z chiqishlarini tashlab ketdik):
0062838 (HEAD -> main) CSS: sarlavhaga rang ber
a82a253 Menyu: ko'k choy narxini qo'sh
7b12409 Sayt: telefon raqamini bron va aloqaga qo'sh
07b061d Menyu: lag'mon narxini qo'shTarix endi o'qiladigan bo'ldi: har commit — bitta ish.
Tekshirib ko'ring:
git reset --soft HEAD~1vagit reset HEAD~1dan keyingit status -sdaMharfi qaysi ustunda turadi?
Javob
--soft dan keyin — chap ustunda (M fayl): o'zgarish qutida. --mixed (flagsiz) dan keyin — o'ng ustunda ( M fayl): o'zgarish stolda, quti bo'sh. Ikkalasida ham commit tarixdan chiqadi, fayldagi o'zgarish esa saqlanadi.
3.4 --hard: hammasini o'chirish
Aziz fonni qizil qilib sinab ko'rdi va commit qildi. Brauzerda ko'rdi — dahshat. Bu sinovning izi ham qolmasin:
echo 'body { background: red; }' >> assets/css/asosiy.css
git commit -a -m "Sinov: fonni qizil qil"
git reset --hard HEAD~1[main f362fdd] Sinov: fonni qizil qil
1 file changed, 1 insertion(+)
HEAD is now at 0062838 CSS: sarlavhaga rang berTarjimasi (oxirgi qator): "HEAD endi 0062838 da". Fayl ichini tekshiramiz:
cat assets/css/asosiy.cssbody { font-family: sans-serif; }
h1 { color: #2f6b4f; }Qizil fon qatori fayldan ham yo'qoldi. git status esa nothing to commit, working tree clean deydi. Commit, quti va stol — uchalasi 0062838 holatiga qaytdi.
3.5 --hard ning xavfi
--hard flagini boshqa buyruqlardan ajratadigan bitta xususiyat bor: u commit qilinmagan ishni ham o'chiradi. Aziz menyuga somsa narxini yozdi, yonida eslatma fayl ham yaratdi. Hali commit yo'q:
echo "<p>Somsa — 8 000 so'm</p>" >> menyu/index.html
echo 'eslatma' > eslatma.txt
git status -s M menyu/index.html
?? eslatma.txtEndi HEAD~1 siz, shunchaki git reset --hard:
git reset --hard
git status -s
tail -1 menyu/index.htmlHEAD is now at 0062838 CSS: sarlavhaga rang ber
?? eslatma.txt
<p>Ko'k choy — 5 000 so'm</p>Somsa qatori yo'q. U commitda bo'lmagani uchun Git uni hech qayerga yozmagan edi — qaytarib bo'lmaydi. Qiziq tomoni: eslatma.txt joyida qoldi. reset --hard faqat Git taniydigan (tracked) fayllarni qaytaradi. Untracked fayllarga tegmaydi.
Diqqat:
git reset --harddan oldin doimgit statusga qarang. Stolda saqlanishi kerak bo'lgan o'zgarish bo'lsa — avval commit qiling. Commit qilingan narsani esareset --harddan keyin ham qaytarish mumkin: Git bir muddat "qaerda edim" jurnalini saqlaydi. Uni Reflog darsida o'rganamiz. Commit qilinmagan ish uchun bunday jurnal yo'q.
3.6 Faylga reset — qutidan olish
reset ga commit o'rniga fayl yo'lini bersangiz, u tarixga tegmaydi. Faqat faylni qutidan oladi:
echo "<p>Non — 4 000 so'm</p>" >> menyu/index.html
git add menyu/index.html
git reset menyu/index.html
git status -sUnstaged changes after reset:
M menyu/index.html
M menyu/index.htmlBu oldingi darsdagi git restore --staged menyu/index.html bilan bir xil ish. restore yangiroq va aniqroq buyruq. git reset fayl shaklini esa eski maqolalar va dasturchilarning odatida ko'p uchratasiz — tanib oling.
Fayl bilan --soft yoki --hard ishlamaydi:
git reset --hard menyu/index.htmlfatal: Cannot do hard reset with paths.Tarjimasi: "Yo'llar bilan hard reset qilib bo'lmaydi". Git bu yerda xavfdan saqlayapti: bitta faylni tozalash uchun git restore fayl bor.
3.7 Reset tarixga nima qiladi?
gitGraph
commit id: "07b061d"
commit id: "7b12409"
commit id: "a82a253"
commit id: "0062838"
commit id: "f362fdd sinov" type: REVERSENimaga qarang: teskari belgili oxirgi doira — reset --hard HEAD~1 bilan tashlab ketilgan commit. main yorlig'i bir qadam orqaga, 0062838 ga surildi. Tashlab ketilgan commit bir muddat Git ichida saqlanib turadi, lekin git log uni ko'rsatmaydi.
Shu yerdan reset'ning asosiy xavfi kelib chiqadi. Agar f362fdd ni oldin GitHub'ga yuborgan bo'lsangiz, Jasur akaning kompyuterida u bor, sizda esa yo'q. Ikki tarix bir-biriga mos kelmay qoladi. GitHub keyingi yuborishingizni rad etadi. Buni Ajralgan tarix darsida ko'rasiz. Hozircha qoida: boshqalar olgan commitni reset qilmang.
4. git revert — xatoni yangi commit bilan tuzatish
4.1 Birinchi revert
Jasur aka osh narxini 45 000 ga ko'tarishni so'radi. Aziz o'zgartirdi. git diff bilan tekshirdi (O'zgarishlarni ko'rish):
diff --git a/menyu/index.html b/menyu/index.html
index 63aadda..85009c2 100644
--- a/menyu/index.html
+++ b/menyu/index.html
@@ -1,4 +1,4 @@
<h1>Menyu</h1>
-<p>Osh — 35 000 so'm</p>
+<p>Osh — 45 000 so'm</p>
<p>Lag'mon — 28 000 so'm</p>
<p>Ko'k choy — 5 000 so'm</p>Commit qildi, keyin yana bir commit — bosh sahifaga ish vaqti:
git commit -a -m "Menyu: osh narxini 45 000 so'mga ko'tar"
echo '<p>Ish vaqti: 08:00–23:00</p>' >> index.html
git commit -a -m "Bosh sahifa: ish vaqtini qo'sh"
git log --oneline -3Oxirgi buyruq natijasi:
694f30b (HEAD -> main) Bosh sahifa: ish vaqtini qo'sh
b62b84a Menyu: osh narxini 45 000 so'mga ko'tar
0062838 CSS: sarlavhaga rang berIkkala commit GitHub'ga yuborildi deb tasavvur qiling. (Yuborishni Remote darsida o'rganamiz.) Ertasiga Jasur aka qo'ng'iroq qildi: "Narx o'zgarmaydi, bekor qil!"
Osh commiti o'rtada — HEAD~1. Uni reset bilan olib tashlasak, ish vaqti commiti ham ketadi. Commit allaqachon boshqalarda ham bor. Bu — aynan revert holati:
git revert --no-edit b62b84a[main 27fe0f2] Revert "Menyu: osh narxini 45 000 so'mga ko'tar"
Date: Wed Oct 7 10:00:00 2026 +0500
1 file changed, 1 insertion(+), 1 deletion(-)Git b62b84a ning o'zgarishini teskari aylantirib, yangi commit yaratdi. Xabarni ham o'zi yozdi: Revert "...". Date qatori revert natijasida doim chiqadi — commitning sanasi. Tarixga qaraymiz:
git log --oneline -427fe0f2 (HEAD -> main) Revert "Menyu: osh narxini 45 000 so'mga ko'tar"
694f30b Bosh sahifa: ish vaqtini qo'sh
b62b84a Menyu: osh narxini 45 000 so'mga ko'tar
0062838 CSS: sarlavhaga rang berHech narsa o'chmadi. Xato commit ham, uni tuzatgan commit ham tarixda turibdi. Ish vaqti esa joyida. Narxni tekshiramiz:
grep Osh menyu/index.html<p>Osh — 35 000 so'm</p>4.2 Revert commit ichida nima bor?
git show HEADcommit 27fe0f2faf3f0b753e818ce08f65445f2dea781a (HEAD -> main)
Author: Aziz Karimov <aziz@example.com>
Date: Wed Oct 7 10:00:00 2026 +0500
Revert "Menyu: osh narxini 45 000 so'mga ko'tar"
This reverts commit b62b84a0e33f0cc3bdf584a12cd96a1e37a32592.
diff --git a/menyu/index.html b/menyu/index.html
index 85009c2..63aadda 100644
--- a/menyu/index.html
+++ b/menyu/index.html
@@ -1,4 +1,4 @@
<h1>Menyu</h1>
-<p>Osh — 45 000 so'm</p>
+<p>Osh — 35 000 so'm</p>
<p>Lag'mon — 28 000 so'm</p>
<p>Ko'k choy — 5 000 so'm</p>Ikki narsaga qarang. Birinchisi — xabarning ikkinchi qatori: This reverts commit b62b84a... — "Bu commit b62b84a... ni bekor qiladi". To'liq SHA yozilgan, bir yildan keyin ham qaysi commit qaytarilgani aniq. Ikkinchisi — diff: 45 000 o'chirilgan, 35 000 qo'shilgan. Yuqoridagi diffning aynan teskarisi.
index 85009c2..63aadda — bu faylning eski va yangi versiyasi nomlari. E'tibor bering: yangi versiya 63aadda — osh o'zgarishidan oldingi versiya bilan bir xil nom. Fayl mazmuni bir xil bo'lsa, Git uni bir xil nom bilan ataydi. Nega shunday — Git ichkaridan darsida.
4.3 --no-edit va muharrir
--no-edit — "xabarni tahrirlamayman, Git'ning xabari yetarli". Usiz git revert muharrirni ochadi — xuddi -m siz git commit dagi kabi (Birinchi repo). Tayyor xabar ichida turadi. Uning ostiga nega qaytarganingizni yozish foydali, masalan: "Jasur aka: narx oktyabrgacha o'zgarmaydi". Saqlab yopsangiz — commit tayyor.
Maslahat: Jamoa loyihalarida revert xabariga sababni yozing.
Revert "..."nima qilinganini aytadi, lekin nega qilinganini aytmaydi.
4.4 Revert'ni revert qilish
Bir hafta o'tib, Jasur aka fikrini o'zgartirdi: narx baribir 45 000 bo'ladi. Revert commitni ham revert qilish mumkin:
git revert --no-edit HEAD[main ebae952] Reapply "Menyu: osh narxini 45 000 so'mga ko'tar"
Date: Wed Oct 7 10:05:00 2026 +0500
1 file changed, 1 insertion(+), 1 deletion(-)Git 2.54 bunday commitni Reapply — "qayta qo'llash" deb ataydi. Tarixda uch commit: o'zgarish, uning bekori, bekorning bekori. Hammasi ko'rinib turadi. (Sinovda biz buni reset --hard HEAD~1 bilan orqaga qaytardik — bu commit hali hech qayerga yuborilmagan edi.)
4.5 Bir nechta commitni birdan
Ba'zan bitta ish ikki-uch commitga tarqalgan bo'ladi. Aziz bosh sahifaga "Yangi!" yozuvini qo'shdi, keyingi commitda unga rang berdi. Ikkalasini ham olib tashlash kerak:
git revert --no-commit HEAD~2..HEAD
git status -sM assets/css/asosiy.css
M index.htmlHEAD~2..HEAD — "HEAD~2 dan keyingi, HEAD gacha bo'lgan commitlar", ya'ni oxirgi ikkitasi. Ikki nuqtali oraliqni git diff darsida ko'rgan edik. --no-commit — "teskari o'zgarishlarni qutiga sol, lekin commit qilma". Endi bitta commit bilan yakunlaymiz:
git commit -m "Bosh sahifa: Yangi! yozuvini olib tashla"[main 89cffb5] Bosh sahifa: Yangi! yozuvini olib tashla
2 files changed, 2 deletions(-)--no-commit siz Git har bir commit uchun alohida revert commit yaratardi — ikkitasi.
Tekshirib ko'ring: Revert qilingandan keyin xato commit tarixda qoladimi? Nega bu umumiy tarix uchun yaxshi?
Javob
Qoladi — revert hech narsani o'chirmaydi, faqat yangi commit qo'shadi. Jamoadagilarning tarixi sizniki bilan bir xil bo'lib qolaveradi: ularda ham xato commit bor, keyingi safar yangilaganda revert commitni ham oladi. Hech kimning tarixi "sinmaydi".
5. Revert konflikti
Revert har doim silliq o'tmaydi. Aziz a82a253 — ko'k choy narxi commitini qaytarmoqchi bo'ldi. Lekin shu orada menyuga yana bir qator qo'shilgan:
<h1>Menyu</h1>
<p>Osh — 35 000 so'm</p>
<p>Lag'mon — 28 000 so'm</p>
<p>Ko'k choy — 5 000 so'm</p>
<p>Somsa — 8 000 so'm</p>git revert --no-edit a82a253Auto-merging menyu/index.html
CONFLICT (content): Merge conflict in menyu/index.html
error: could not revert a82a253... Menyu: ko'k choy narxini qo'sh
hint: After resolving the conflicts, mark them with
hint: "git add/rm <pathspec>", then run
hint: "git revert --continue".
hint: You can instead skip this commit with "git revert --skip".
hint: To abort and get back to the state before "git revert",
hint: run "git revert --abort".
hint: Disable this message with "git config set advice.mergeConflict false"Konflikt (conflict) — Git ikki o'zgarishni o'zi qo'sha olmay, qarorni sizga qoldiradigan holat. Ikki kishi bitta daftarning bitta qatoriga har xil narsa yozsa, qaysi biri qolishini kimdir hal qilishi kerak — xuddi shunday.
Tarjimasi: "KONFLIKT (mazmun): menyu/index.html da birlashtirish konflikti. Xato: a82a253 ni qaytarib bo'lmadi". hint (maslahat) qatorlari uchta yo'l beradi: konfliktni tuzatib --continue, bu commitni o'tkazib --skip, yoki hammasini bekor qilib --abort.
Nega? a82a253 ko'k choy qatorini fayl oxiriga qo'shgan edi. Git uni olib tashlashga urindi, lekin qator atrofi o'zgargan — endi uning ostida somsa bor. Git "qaysi biri to'g'ri" deb o'zi hal qilmaydi va sizdan so'raydi.
Konfliktni yechish — alohida ko'nikma, uni Merge dan keyin Conflictlarni yechish darsida o'rganamiz. Hozircha xavfsiz chiqish yo'lini biling:
git revert --abort
git status -sgit status -s hech narsa chiqarmadi — hammasi revert'dan oldingi holatga qaytdi.
6. Merge commitni qaytarish: revert -m 1
Bu bo'limni qisqa ko'ramiz — to'liq ma'nosi Merge darsidan keyin ochiladi. Lekin bu savol intervyularda ko'p beriladi, shuning uchun bir marta ko'rib qo'ying.
Branch (tarmoq) — asosiy tarixdan ajralib, alohida chiziqda ishlash imkoni (Branch nima darsida). Merge (birlashtirish) — o'sha chiziqni asosiy tarixga qo'shish. Birlashtirganda maxsus merge commit paydo bo'ladi — uning ikkita otasi bor.
«Bahor»da aksiya banneri alohida feature/aksiya branch'ida tayyorlandi va main ga qo'shildi:
gitGraph
commit id: "89cffb5"
branch feature/aksiya
commit id: "2459422 banner"
commit id: "0fc19e8 stil"
checkout main
commit id: "6352fa6 somsa"
merge feature/aksiya id: "1041b72"Nimaga qarang: 1041b72 ga ikki chiziq kiradi — biri main dan (somsa), biri feature/aksiya dan (stil). Bu merge commit.
Aksiya tugadi, banner olib tashlanishi kerak. Oddiy revert ishlamaydi:
git revert 1041b72error: commit 1041b724c5146a11739b669f52eecb6421a736d6 is a merge but no -m option was given.
fatal: revert failedTarjimasi: "Xato: commit 1041b72... — merge, lekin -m varianti berilmadi. Revert bajarilmadi".
Nega? Oddiy commitning bitta otasi bor — Git "ota bilan farqni teskari qil" deydi. Merge commitning esa ikki otasi bor. Git qaysi biriga nisbatan teskari qilishni bilmaydi. -m 1 — "birinchi otaga qayt". Birinchi ota — merge qilingan paytdagi main, ya'ni aksiyasiz holat:
git revert -m 1 --no-edit 1041b72
git log -1 --format=%B[main 8eaa25e] Revert "Merge branch 'feature/aksiya'"
Date: Thu Oct 8 12:00:00 2026 +0500
2 files changed, 2 deletions(-)
Revert "Merge branch 'feature/aksiya'"
This reverts commit 1041b724c5146a11739b669f52eecb6421a736d6, reversing
changes made to 6352fa6b8a6f020bb325b5bf4de488c0646a170f.Xabar endi aniqroq: "6352fa6 ga kiritilgan o'zgarishlarni teskari qiladi" — 6352fa6 birinchi ota, main dagi somsa commiti. Aksiya branch'ining ikki commiti bitta revert bilan bekor bo'ldi. Somsa narxi esa joyida qoldi.
Diqqat: Merge revert qilingandan keyin o'sha branch'ni qayta merge qilsangiz, Git "bu commitlar allaqachon qo'shilgan" deb hisoblaydi va ularni qaytarmaydi. Qaytarish uchun revert commitning o'zini revert qilish kerak. Bu nozik holat — hozircha shunchaki eslab qoling.
7. Qachon qaysi?
Bu darsning eng muhim jadvali. Birinchi savol doim bitta: commit boshqalarga yetib borganmi?
| Vaziyat | Buyruq |
|---|---|
| Oxirgi commit xabarini tuzatish, hali yubormagan | commit --amend (oldingi dars) |
| Bir necha commitni bittaga jamlash, hali yubormagan | reset --soft HEAD~n |
| Commitni ochib, qayta bo'lish, hali yubormagan | reset HEAD~1 |
| Sinovni butunlay tashlash, hali yubormagan | reset --hard HEAD~1 |
| Vaziyat | Buyruq |
|---|---|
| Commit GitHub'da, boshqalar olgan | revert <commit> |
| Tarix o'rtasidagi bitta commitni bekor qilish | revert <commit> |
| Bir necha commitni bitta commit bilan qaytarish | revert --no-commit A..B |
| Branch merge'ini bekor qilish | revert -m 1 <merge> |
flowchart TD
A{"Commit boshqalarga<br/>yuborilganmi?"} -->|Ha| R["git revert"]
A -->|Yo'q| B{"O'zgarish<br/>kerakmi?"}
B -->|Ha, qutida| S["reset --soft"]
B -->|Ha, stolda| M["reset (--mixed)"]
B -->|Yo'q| H["reset --hard"]Nimaga qarang: birinchi savolga "ha" desangiz — boshqa savol yo'q, faqat revert. reset faqat "yo'q" tarmog'ida.
Tekshirib ko'ring: Malika uch commit qildi, hech qayerga yubormadi. Endi ularni bitta chiroyli commitga aylantirmoqchi. Qaysi buyruq?
Javob
git reset --soft HEAD~3, keyin git commit -m "...". --soft uchala commitni tarixdan chiqaradi, lekin ularning barcha o'zgarishlari qutida qoladi. Bitta commit ularni birga saqlaydi. Commitlar yuborilmagani uchun reset xavfsiz.
8. Ko'p uchraydigan xatolar
8.1 --hard ni "tozalash" uchun ishlatish
Eng og'ir xato. Kimdir "fayllar aralashib ketdi, reset --hard qilaman" deydi va bir soatlik commit qilinmagan ishini yo'qotadi. Bitta faylni tozalash uchun git restore fayl yetarli. --hard dan oldin doim git status.
8.2 Yuborilgan commitni reset qilish
reset sizning kompyuteringizdagi tarixni o'zgartiradi, GitHub'dagini emas. Keyin yuborishga urinsangiz, GitHub rad etadi. Kimdir "majburlab" yuborsa (--force), jamoadoshlarning tarixi buziladi. Bu holatlarni Ajralgan tarix darsida ko'rasiz. Yuborilgan commit — faqat revert.
8.3 HEAD~1 o'rniga HEAD
git reset --soft HEADHech narsa o'zgarmaydi: "hozirgi commitga qayt" — siz allaqachon o'shandasiz. Oxirgi commitni ochish uchun HEAD~1 kerak. Commit ko'rsatilmasa, reset ham HEAD ni oladi. Shuning uchun git reset --hard tarixga tegmaydi — faqat stol va qutini tozalaydi. «--hard ning xavfi» bo'limida aynan shuni ko'rdik.
8.4 Merge commitni -m siz revert
error: commit 1041b724c5146a11739b669f52eecb6421a736d6 is a merge but no -m option was given.Yuqorida ko'rdik: merge commitning ikki otasi bor. Deyarli har doim -m 1 kerak — main ga qaytish.
8.5 Fayl bilan --hard
fatal: Cannot do hard reset with paths.Bitta faylni oxirgi commitdagi holatga qaytarish — git restore fayl. Qutidan olish — git restore --staged fayl yoki git reset fayl.
8.6 "Revert — bu reset'ning boshqa nomi"
Yo'q. Ular teskari ishlaydi: reset tarixni kesadi, revert esa tarixga qo'shadi. Nomlari o'xshash, xulqi butunlay boshqa.
9. Mashqlar
1-mashq (oson): Qaysi flag?
Har vaziyatga --soft, --mixed yoki --hard ni tanlang (commitlar hech qayerga yuborilmagan):
- Oxirgi commitda bir fayl yetishmaydi. Commitni ochib, faylni qo'shib, qayta saqlamoqchisiz.
- Oxirgi ikki commit — sinov edi, hech narsasi kerak emas.
- Oxirgi commit ikki ishni aralashtirgan, ularni alohida
addqilmoqchisiz.
Ishora: «Uch hudud va reset» bo'limidagi jadvalga qarang — o'zgarish qayerda qolishi kerak?
Yechim
git reset --soft HEAD~1— o'zgarish qutida qoladi, faqat yangi faylniaddqilasiz. (Bitta commit uchuncommit --amendham to'g'ri.)git reset --hard HEAD~2— ikkala commit ham, ularning o'zgarishlari ham yo'qoladi.git reset HEAD~1(--mixed) — o'zgarishlar stolda, quti bo'sh; har birini alohidaaddqilasiz.
2-mashq (o'rta): Revert zanjiri
«Bahor»da xato commit topildi. Bo'sh joylarni to'ldiring:
git log --oneline -3694f30b (HEAD -> main) Bosh sahifa: ish vaqtini qo'sh
b62b84a Menyu: osh narxini 45 000 so'mga ko'tar
0062838 CSS: sarlavhaga rang berOsh narxi commitini, ish vaqtiga tegmasdan, xabarni tahrirlamay bekor qiling: git [:revert] --no-edit b62b84a. Yangi commit xabari [:Revert] so'zi bilan boshlanadi: ... "Menyu: osh narxini 45 000 so'mga ko'tar". Keyin git log --oneline da jami ta commit ko'rinadi (yuqoridagi uchta + yangisi).
Ishora: revert hech narsani o'chirmaydi («Birinchi revert» bo'limi).
Yechim
git revert --no-edit b62b84a
git log --oneline -427fe0f2 (HEAD -> main) Revert "Menyu: osh narxini 45 000 so'mga ko'tar"
694f30b Bosh sahifa: ish vaqtini qo'sh
b62b84a Menyu: osh narxini 45 000 so'mga ko'tar
0062838 CSS: sarlavhaga rang berXato commit tarixda qoladi, uning ustiga teskari commit qo'shiladi. Ish vaqti commitiga tegilmaydi — revert faqat ko'rsatilgan commitning o'zgarishini qaytaradi.
3-mashq (qiyin): Stajyor Sardorning savoli
Sardor shunday ketma-ketlik yozdi va "somsa narxim qayerga ketdi?" deb so'rayapti:
echo "<p>Somsa — 8 000 so'm</p>" >> menyu/index.html
git add menyu/index.html
git commit -m "Menyu: somsa narxini qo'sh"
echo "<p>Manti — 30 000 so'm</p>" >> menyu/index.html
git reset --hard HEAD~1reset --harddan keyin menyuda somsa bormi? Manti-chi?- Qaysi birini qaytarsa bo'ladi va qaysi birini — yo'q? Nega?
- Sardor aslida nima qilmoqchi edi va qaysi buyruq to'g'ri bo'lardi?
Ishora: «--hard ning xavfi» bo'limi — commit qilingan va qilinmagan ish farqi.
Yechim
- Ikkalasi ham yo'q.
HEAD~1— somsa commitidan oldingi holat.--hardcommitni ham, stoldagi manti qatorini ham o'chirdi. - Somsa commit qilingan edi — u Git ichida bir muddat saqlanadi va uni Reflog orqali qaytarish mumkin. Manti hech qachon commit yoki
addqilinmagan — Git uni hech qayerga yozmagan, qaytarib bo'lmaydi. - Ehtimol u manti qatorini bekor qilmoqchi edi. Buning uchun
git restore menyu/index.htmlyetarli edi — faqat stoldagi o'zgarish yo'qoladi, somsa commiti joyida qoladi. Agar u somsa commitini ochmoqchi bo'lsa —git reset --soft HEAD~1, bunda manti ham, somsa ham faylda qolardi.
4-mashq: Portfolio qadami — sinov va qaytarish
Portfolio'ingizda ikkala asbobni sinaymiz. Portfolio hali GitHub bilan bog'lanmagan — lekin Remote darsidan keyin bog'lanadi. Shuning uchun ikki odatni hozirdan mashq qilamiz.
kurs/portfoliodasayt/assets/css/asosiy.cssoxiriga sinov qatori qo'shing:body { background: #fff3c4; }. Brauzerda qarang, keyinSinov: fonni sariq qilxabari bilan commit qiling.- Sinov yoqmadi va hech qayerga yuborilmagan.
resetning qaysi turi uni izsiz olib tashlaydi? Bajaring vagit log --onelinebilan tekshiring. - Endi "haqiqiy" o'zgarish: sarlavhaga
h1 { letter-spacing: 0.3em; }qo'shing vaCSS: sarlavha harflarini kengaytirxabari bilan commit qiling. Tasavvur qiling: bu commit allaqachon GitHub'da. Uni qaysi buyruq bilan qaytarasiz? Bajaring. git log --onelinevacat sayt/assets/css/asosiy.cssbilan natijani tekshiring.
mashqlar repo: shu darsning 1–3-mashq javoblarini mashqlar/07/10-reset-revert/javoblar.md ga yozing va commit qiling: 07/10: reset va revert mashqlari javoblarini qo'sh.
Yechim
cd ~/kurs/portfolio
echo 'body { background: #fff3c4; }' >> sayt/assets/css/asosiy.css
git commit -a -m "Sinov: fonni sariq qil"
git reset --hard HEAD~1
git log --oneline
echo 'h1 { letter-spacing: 0.3em; }' >> sayt/assets/css/asosiy.css
git commit -a -m "CSS: sarlavha harflarini kengaytir"
git revert --no-edit HEAD
git log --oneline
cat sayt/assets/css/asosiy.cssBiz Birinchi repo darsidagi qisqa portfolio'da sinadik. reset --hard HEAD~1 natijasi:
HEAD is now at 63190c1 Portfolio: 06-qism oxiridagi holatOxirgi git log --oneline:
676fde9 (HEAD -> main) Revert "CSS: sarlavha harflarini kengaytir"
7b663e1 CSS: sarlavha harflarini kengaytir
63190c1 Portfolio: 06-qism oxiridagi holatSizda oldingi darslardan ko'proq commit bo'ladi va SHA'lar boshqacha — tartib muhim. Sariq fon izsiz yo'qoldi: yuborilmagan sinov uchun reset --hard to'g'ri. Harflar oralig'i esa tarixda qoldi, uning ustida revert commit bor: yuborilgan commit uchun revert to'g'ri. asosiy.css oxirida ikkala qator ham yo'q.
10. Real ishda
revert— ishlab chiqarish (production) dagi xatoning birinchi dori. Sayt buzildi — dasturchi xato commitni topadi,git revertqiladi va yuboradi. Avtomatik deploy (buni GitHub Actions darslarida ko'rasiz) eski holatni bir necha daqiqada qaytaradi. Keyin xato bemalol tuzatiladi.- GitHub'da birlashtirilgan Pull Request sahifasining pastida Revert tugmasi bor. U asl merge commitni bekor qiladigan yangi Pull Request ochadi — ya'ni merge revert'ining o'zi, faqat brauzerda. Pull Request'ni shu qismda o'rganamiz.
reset --soft— PR'dan oldin tartib. Ko'p dasturchilar ish davomida "wip" (work in progress — "ish davom etyapti"), "yana tuzatish" kabi mayda commitlar qiladi. Yuborishdan oldinreset --softbilan ularni bitta toza commitga jamlaydi. Buning qulayroq yo'li — Interaktiv rebase.- Intervyuda klassik savol: "
resetvarevertfarqi nima? Qachon qaysi birini ishlatasiz?" Javob — «Qachon qaysi?» bo'limidagi birinchi savol: commit boshqalarga yetib borganmi. Ikkinchi savol ham tez-tez: "Merge commitni qanday revert qilasiz?" —-m 1.
Xulosa
resetmainyorlig'ini orqaga suradi:--soft— o'zgarish qutida,--mixed— stolda,--hard— o'chiriladi.--hardcommit qilinmagan ishni qaytarib bo'lmaydigan qilib o'chiradi — oldidan doimgit status.reverttarixga tegmaydi, xatoni bekor qiladigan yangi commit qo'shadi — umumiy tarix uchun xavfsiz.- Revert konflikt bersa —
--abortbilan xavfsiz chiqasiz; merge commitni qaytarish —revert -m 1. - Qoida: yuborilmagan commit —
reset, yuborilgan —revert.
Keyingi dars: Git ichkaridan: obyektlar, SHA va snapshot — revert natijasida faylning nomi nega eski nomga qaytganini va commit aslida nimadan yasalganini ko'ramiz.
Manbalar
- Git hujjati: "git-reset", "git-revert" — git-scm.com/docs
- Pro Git kitobi: "Reset Demystified" — git-scm.com/book
Izohlar (0)
Izoh yozish uchun kiring.
- Hozircha izoh yo'q. Birinchi bo'ling!