7-bo‘lim
O'zgarishlarni bekor qilish
restore, reset, revert va amend - xatolarni tuzatishning to'g'ri usullarini tanlash.
Ushbu bo‘lim mundarijasi
- Qaysi buyruqni tanlash?
- 1. Tahrirlangan faylni qaytarish
- 2. Sahnadan chiqarish
- 3. Oxirgi kommitni tuzatish
- 4. git reset - kommitlarni orqaga surish
- 5. git revert - xavfsiz bekor qilish
- reset va revert solishtiruvi
- 6. git reflog - qutqaruvchi buyruq
- 7. Faylni eski holatga qaytarish
- Amaliy vaziyatlar
- Xavfsizlik qoidalari
- Xulosa
Har bir dasturchi xato qiladi. Git da deyarli har qanday xatoni tuzatish mumkin - faqat to'g'ri buyruqni tanlash kerak.
Qaysi buyruqni tanlash? #
1. Tahrirlangan faylni qaytarish #
Faylni buzdingiz va oxirgi kommitdagi holatga qaytarmoqchisiz:
git restore manba/index.php
# Barcha fayllar
git restore .
git restore bekor qilgan o'zgarishlarni qaytarib bo'lmaydi -
ular hech qayerda saqlanmagan edi.
Ishonchingiz komil bo'lmasa, avval git stash qiling (14-bo'lim) -
u o'zgarishni saqlab qo'yadi.
2. Sahnadan chiqarish #
Tasodifan git add qildingiz:
git restore --staged manba/index.php
# Hammasini
git restore --staged .
O'zgarish yo'qolmaydi - fayl shunchaki sahnadan chiqadi.
Ilgari (Git 2.23 gacha) bu buyruqlar ishlatilardi:
git checkout -- fayl.php # hozir: git restore
git reset HEAD fayl.php # hozir: git restore --staged
Ular hali ham ishlaydi va eski maqolalarda ko'p uchraydi. Lekin restore
aniqroq va chalkashtirmaydi - checkout juda ko'p vazifani bajaradi.
3. Oxirgi kommitni tuzatish #
Kommit qildingiz, keyin xatoni ko'rdingiz:
# Xabarni tuzatish
git commit --amend -m "To'g'ri xabar"
# Unutilgan faylni qo'shish
git add unutilgan.php
git commit --amend --no-edit
--no-edit - xabarni o'zgartirmaslik degani.
--amend yangi kommit yaratadiBu eski kommitni "tahrirlamaydi" - u yangi kommit yaratib, eskisini almashtiradi. Yangi kommitda boshqa xesh bo'ladi.
Agar eski kommit allaqachon push qilingan bo'lsa - bu muammoga olib keladi. Jamoadagilarning tarixi sizniki bilan mos kelmay qoladi.
Qoida: push qilingan kommitni amend qilmang.
4. git reset - kommitlarni orqaga surish #
reset uch xil rejimda ishlaydi:
| Rejim | Kommit | Sahna | Ish papkasi |
|---|---|---|---|
--soft | orqaga | tegilmaydi | tegilmaydi |
--mixed (standart) | orqaga | tozalanadi | tegilmaydi |
--hard | orqaga | tozalanadi | tozalanadi |
# Kommitni bekor qilish, o'zgarishni sahnada qoldirish
git reset --soft HEAD~1
# Kommitni bekor qilish, o'zgarishni ish papkasida qoldirish
git reset HEAD~1
# Hammasini o'chirish
git reset --hard HEAD~1
# Ma'lum kommitga qaytish
git reset --hard 1f4c6d9
"Uchta kommitni bitta qilib birlashtirmoqchiman":
git reset --soft HEAD~3
git commit -m "Foydalanuvchi profili to'liq yozildi"
Uch kommitning barcha o'zgarishlari sahnada qoladi va siz ularni bitta toza kommitga jamlaysiz.
--hard - eng xavfli buyruqgit reset --hard saqlanmagan barcha o'zgarishlarni butunlay yo'q qiladi.
Ishga tushirishdan oldin git status bilan tekshiring.
5. git revert - xavfsiz bekor qilish #
revert eski kommitni o'chirmaydi - u teskari kommit yaratadi.
git revert c9d2e71
[main 4b8e2a1] Revert "Kitoblar sahifasi qo'shildi"
1 file changed, 3 deletions(-)
git log --oneline
4b8e2a1 Revert "Kitoblar sahifasi qo'shildi"
c9d2e71 Kitoblar sahifasi qo'shildi
5a8b3f0 Bosh sahifa yaratildi
Ikkala kommit ham tarixda turibdi.
revert - jamoaviy ishning yagona to'g'ri yo'liPush qilingan kommitni bekor qilish kerak bo'lsa, faqat revert.
reset tarixni o'zgartiradi - jamoadagi boshqalar bilan konflikt chiqadi.
revert esa yangi kommit qo'shadi, tarix buzilmaydi.
# Bir nechta kommitni
git revert HEAD~3..HEAD
# Kommit yaratmasdan, faqat o'zgarishni sahnaga qo'yish
git revert -n c9d2e71
reset va revert solishtiruvi #
reset | revert | |
|---|---|---|
| Tarixni o'zgartiradi | Ha | Yo'q |
| Yangi kommit yaratadi | Yo'q | Ha |
| Push qilingandan keyin | Xavfli | Xavfsiz |
| Jamoaviy loyihada | Tavsiya etilmaydi | Tavsiya etiladi |
| Shaxsiy tarmoqda | Qulay | Ortiqcha |
6. git reflog - qutqaruvchi buyruq #
Git barcha HEAD harakatlarini yozib boradi:
git reflog
4b8e2a1 HEAD@{0}: revert: Revert "Kitoblar sahifasi qo'shildi"
c9d2e71 HEAD@{1}: reset: moving to HEAD~1
8f3a1d0 HEAD@{2}: commit: Yangi dizayn qo'shildi
c9d2e71 HEAD@{3}: commit: Kitoblar sahifasi qo'shildi
5a8b3f0 HEAD@{4}: commit: Bosh sahifa yaratildi
git reset --hard bilan kommitni o'chirib yubordingiz. Vahima qilmang:
git reflog # yo'qolgan kommit xeshini toping
git reset --hard 8f3a1d0 # qaytaring
Git obyektlarni darhol o'chirmaydi - ular kamida 30 kun saqlanadi. Bu vaqt ichida deyarli hamma narsani qaytarish mumkin.
# Yo'qolgan kommitni yangi tarmoqqa olish
git branch qutqarilgan 8f3a1d0
7. Faylni eski holatga qaytarish #
Butun loyihani emas, faqat bitta faylni:
# Uch kommit oldingi holatga
git restore --source=HEAD~3 manba/index.php
# Ma'lum kommitdan
git restore --source=c9d2e71 manba/index.php
# Eski uslub
git checkout c9d2e71 -- manba/index.php
Amaliy vaziyatlar #
git rm --cached maxfiy.env
git commit --amend --no-edit
echo "maxfiy.env" >> .gitignore
git add .gitignore
git commit -m ".env chetlab o'tildi"
Push qilgan bo'lsangiz - parolni albatta almashtiring.
# Oxirgisini
git commit --amend -m "To'g'ri xabar"
# Push qilingan bo'lsa - shunchaki qoldiring
# yoki jamoa bilan kelishib force-push qiling
# main da turibsiz, lekin feature da bo'lishi kerak edi
git branch feature-nomi # shu joyda tarmoq yaratamiz
git reset --hard HEAD~1 # main ni orqaga suramiz
git checkout feature-nomi # tarmoqqa o'tamiz
git reset --hard origin/main
git clean -fd
Bu lokal holatni serverdagi holat bilan to'liq almashtiradi. Barcha lokal o'zgarishlar yo'qoladi.
Xavfsizlik qoidalari #
- Push qilingan tarixni o'zgartirmang -
revertishlating. --harddan oldingit statusni tekshiring.- Shubhalansangiz - avval tarmoq yarating:
git branch zaxira-$(date +%s)Endi xohlagan narsani sinashingiz mumkin - kommitlar shu tarmoqda qoladi.
- Faylni tahrirlang va
git restorebilan qaytaring. git addqiling vagit restore --stagedbilan sahnadan chiqaring.- Kommit qiling, keyin
git commit --amendbilan xabarini o'zgartiring. - Uchta kommit qiling va
git reset --soft HEAD~3bilan ularni birlashtiring. - Bitta kommitni
git revertqiling va tarixda ikkalasi ham turganini ko'ring. git reset --hard HEAD~2qiling, keyingit reflogbilan qaytaring.git restore --source=HEAD~2bilan faqat bitta faylni eski holatga qaytaring.resetvarevertfarqini o'z so'zlaringiz bilan yozing.
Xulosa #
git restore fayl- tahrirlangan faylni qaytaradi (o'zgarish yo'qoladi).git restore --staged fayl- faylni sahnadan chiqaradi.git commit --amend- oxirgi kommitni almashtiradi.git reset --soft- kommitni bekor qiladi, o'zgarishni sahnada qoldiradi.git reset --hard- hammasini o'chiradi, ehtiyot bo'ling.git revert- teskari kommit yaratadi, tarixni buzmaydi.- Push qilingandan keyin faqat
revert. git reflog- yo'qolgan kommitni topishning eng ishonchli yo'li.
Keyingi bo'limda tarmoqlar bilan ishlashni boshlaymiz.
O‘qish tarixini saqlamoqchimisiz?
Tizimga kirsangiz, tugatgan bo‘limlaringiz saqlanadi va qoldirgan joyingizdan davom etasiz.
Xatolik topdingizmi?
Imlo xatosi, ishlamaydigan kod yoki noto‘g‘ri ma‘lumotni ko‘rsangiz - bizga xabar bering. Har bir xabar administrator tomonidan ko‘rib chiqiladi.