Asosiy kontentga o‘tish
Innovialabs

Git’da o‘zgarishlarni bekor qilish: reset, revert va restore

Amaliyot3 daq

Qisqacha

restore fayllardagi tahrirlarni bekor qiladi, reset branch’ni lokal tarixda orqaga suradi, revert e’lon qilingan kod uchun yangi bekor qiluvchi commit yaratadi, reflog esa «yo‘qolgan»ni qaytaradi.

Qisqa javob

Buyruq tanlovi ikki savolga bog‘liq: nimani bekor qilmoqchisiz va o‘zgarishlar allaqachon push qilinganmi.

HolatBuyruq
Faylni buzdim, hali git add qilmadimgit restore <fayl>
Indeksga ortiqcha narsa qo‘shdimgit restore --staged <fayl>
Oxirgi commit noto‘g‘ri, push qilinmagangit reset --soft HEAD~1
Oxirgi commit xabarini tuzatish kerakgit commit --amend
Bug allaqachon umumiy branch’dagit revert <hash>
Branch’ni o‘chirdim yoki xato bilan reset --hard qildimgit reflog + git branch / git reset

Asosiy qoida: boshqalar allaqachon tortib olgan tarixni qayta yozmang. E’lon qilingan commit’lar uchun revert ishlating.

restore: fayllardagi tahrirlarni bekor qilish

git restore commit’lar bilan emas, fayllar bilan ishlaydi.

git restore src/app.js           # faylni oxirgi commit holatiga qaytarish
git restore --staged src/app.js  # indeksdan olib tashlash, tahrirlar qoladi
git restore --source=HEAD~2 src/app.js  # ikki commit oldingi versiyani olish

Ehtiyot bo‘ling: --stagedsiz git restore <fayl> shu fayldagi commit qilinmagan tahrirlarni qaytarib bo‘lmas darajada o‘chiradi. Git ularni saqlamagan — reflog yordam bermaydi.

reset: branch’ni orqaga surish

git reset joriy branch ko‘rsatkichini boshqa commit’ga ko‘chiradi. Uch rejim «tashlab yuborilgan» commit’lardagi o‘zgarishlarga nima bo‘lishi bilan farqlanadi:

RejimBranchIndeks (staged)Ishchi fayllar
--softsuriladio‘zgarishlar indeksda qoladitegilmaydi
--mixed (standart)suriladitozalanadio‘zgarishlar fayllarda qoladi
--hardsuriladitozalanadiqayta yoziladi

Amaliyotda:

  • git reset --soft HEAD~1 — commit’ni qayta qilish yoki bir nechtasini bittaga birlashtirish uchun «commit’dan chiqarish».
  • git reset HEAD~1 — xuddi shunday, lekin o‘zgarishlarni git add bilan qayta qo‘shish kerak; commit’ni bir nechtaga bo‘lish uchun qulay.
  • git reset --hard origin/main — barcha lokal o‘zgarishlarni tashlab, branch’ni remote holatiga keltirish. Commit qilinmagan ish yo‘qoladi.

Agar branch allaqachon push qilingan bo‘lsa, resetdan keyin git push --force-with-lease kerak bo‘ladi. Shaxsiy branch’da bu maqbul, mainda esa deyarli hech qachon.

revert: e’lon qilingan ishni xavfsiz bekor qilish

git revert commit’ni o‘chirmaydi, balki teskari o‘zgarishlarga ega yangi commit yaratadi. Tarix saqlanadi, hamkasblar hech narsani tuzatishi shart emas.

git revert a1b2c3d          # bitta commit’ni bekor qilish
git revert HEAD~3..HEAD     # oxirgi uchtasini bekor qilish
git revert -m 1 <merge-hash> # merge commit’ni bekor qilish

Merge commit uchun -m 1 qaysi ota-commit asosiy ekanini ko‘rsatadi (odatda birinchisi — birlashtirilgan branch). E’tibor bering: keyinroq xuddi shu branch’ni yana birlashtirsangiz, Git uning o‘zgarishlarini allaqachon qo‘llangan deb hisoblaydi va «bekor qilishni bekor qilish» kerak bo‘ladi.

reflog: qutqaruv chambaragi

Git HEADning har bir harakatini reflog’ga yozadi. Bu lokal jurnal bo‘lib, commit’lar bilan bog‘liq deyarli har qanday xatoni tuzatadi.

git reflog
# 9f8e7d6 HEAD@{0}: reset: moving to HEAD~3
# 4c5d6e7 HEAD@{1}: commit: add payment form
# ...

git reset --hard 4c5d6e7        # branch’ni avvalgi holatga qaytarish
git branch recovered 4c5d6e7    # yoki o‘chirilgan branch’ni tiklash

Cheklovlar: reflog faqat sizning kompyuteringizda saqlanadi, eski yozuvlar vaqt o‘tib garbage collection tomonidan o‘chiriladi va unda hech qachon commit qilinmagan narsa yo‘q.

Ko‘p uchraydigan xatolar

  • Commit qilinmagan ish bilan reset --hard. Xavfli amaldan oldin git stash yoki vaqtinchalik commit qiling.
  • Umumiy branch’ga force push. Hamkasblar uchun tarixni buzadi. revert ishlating.
  • revert va resetni adashtirish. Revert commit qo‘shadi, reset branch’ni suradi.
  • Vahima. Agar biror narsa bir marta bo‘lsa ham commit qilingan bo‘lsa, uni deyarli har doim reflog orqali tiklash mumkin.

Ko‘p beriladigan savollar

git checkout tarixan ham branch almashtirish, ham fayllarni tiklash vazifasini bajargan. Git 2.23 dan boshlab bu rollar git switch va git restore o‘rtasida bo‘lingan, shunda ularni adashtirish qiyinroq. Eski variant hali ham ishlaydi.

Bunda yordam beramiz

O‘zingiz shug‘ullanmasdan natija olishni istasangiz — biz har kuni shu bilan shug‘ullanamiz.

Loyihani muhokama qilish

Yana o‘qing

G‘oya yoki vazifangiz bormi? Bizga aytib bering

Ish kuni davomida javob beramiz va yechim taklif qilamiz. Konsultatsiya bepul.