7-bo‘lim

O'zgarishlarni bekor qilish

restore, reset, revert va amend - xatolarni tuzatishning to'g'ri usullarini tanlash.

🕑 14 daqiqa o‘qish 📄 800 so‘z 👁 6 marta ko‘rilgan
Ushbu bo‘lim mundarijasi
  1. Qaysi buyruqni tanlash?
  2. 1. Tahrirlangan faylni qaytarish
  3. 2. Sahnadan chiqarish
  4. 3. Oxirgi kommitni tuzatish
  5. 4. git reset - kommitlarni orqaga surish
  6. 5. git revert - xavfsiz bekor qilish
  7. reset va revert solishtiruvi
  8. 6. git reflog - qutqaruvchi buyruq
  9. 7. Faylni eski holatga qaytarish
  10. Amaliy vaziyatlar
  11. Xavfsizlik qoidalari
  12. Xulosa

Har bir dasturchi xato qiladi. Git da deyarli har qanday xatoni tuzatish mumkin - faqat to'g'ri buyruqni tanlash kerak.

Qaysi buyruqni tanlash? #

Nimani bekor qilmoqchisiz? o'zgarish qaysi bosqichda? Faylni tahrirlagansiz hali add qilmagansiz Sahnaga qo'ygansiz hali commit qilmagansiz Kommit qilgansiz lekin push qilmagansiz git restore git restore --staged git reset git commit --amend Push qilib bo'lgansiz git revert - yagona xavfsiz yo'l
Bosqichni aniqlang - keyin buyruq o'zi ma'lum bo'ladi

1. Tahrirlangan faylni qaytarish #

Faylni buzdingiz va oxirgi kommitdagi holatga qaytarmoqchisiz:

Terminal
git restore manba/index.php

# Barcha fayllar
git restore .
Bu o'zgarishlarni butunlay yo'q qiladi

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:

Terminal
git restore --staged manba/index.php

# Hammasini
git restore --staged .

O'zgarish yo'qolmaydi - fayl shunchaki sahnadan chiqadi.

Eski uslub

Ilgari (Git 2.23 gacha) bu buyruqlar ishlatilardi:

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

Terminal
# 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 yaratadi

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

RejimKommitSahnaIsh papkasi
--softorqagategilmayditegilmaydi
--mixed (standart)orqagatozalanaditegilmaydi
--hardorqagatozalanaditozalanadi
git reset HEAD~1 --soft o'zgarish sahnada qoladi darhol qayta kommit qilishga tayyor --mixed sahna tozalanadi fayllar joyida, qaytadan add qilish kerak --hard hammasi o'chadi fayllar oxirgi kommit holatiga qaytadi Eslatma --hard dan tashqari hech biri ish papkasidagi fayllarga tegmaydi
Shubhalansangiz --soft ishlating - u eng xavfsiz
Terminal
# 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
Eng ko'p ishlatiladigan holat

"Uchta kommitni bitta qilib birlashtirmoqchiman":

Terminal
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 buyruq

git 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.

Terminal
git revert c9d2e71
Natija
[main 4b8e2a1] Revert "Kitoblar sahifasi qo'shildi"
 1 file changed, 3 deletions(-)
Terminal
git log --oneline
Natija
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'li

Push 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.

Terminal
# Bir nechta kommitni
git revert HEAD~3..HEAD

# Kommit yaratmasdan, faqat o'zgarishni sahnaga qo'yish
git revert -n c9d2e71

reset va revert solishtiruvi #

resetrevert
Tarixni o'zgartiradiHaYo'q
Yangi kommit yaratadiYo'qHa
Push qilingandan keyinXavfliXavfsiz
Jamoaviy loyihadaTavsiya etilmaydiTavsiya etiladi
Shaxsiy tarmoqdaQulayOrtiqcha

6. git reflog - qutqaruvchi buyruq #

Git barcha HEAD harakatlarini yozib boradi:

Terminal
git reflog
Natija
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
Kommitni "yo'qotdim" - qutqaruv

git reset --hard bilan kommitni o'chirib yubordingiz. Vahima qilmang:

Terminal
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.

Terminal
# Yo'qolgan kommitni yangi tarmoqqa olish
git branch qutqarilgan 8f3a1d0

7. Faylni eski holatga qaytarish #

Butun loyihani emas, faqat bitta faylni:

Terminal
# 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 #

Vaziyat 1: "Xato faylni kommit qildim"
Terminal
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.

Vaziyat 2: "Kommit xabarini noto'g'ri yozdim"
Terminal
# Oxirgisini
git commit --amend -m "To'g'ri xabar"

# Push qilingan bo'lsa - shunchaki qoldiring
# yoki jamoa bilan kelishib force-push qiling
Vaziyat 3: "Noto'g'ri tarmoqqa kommit qildim"
Terminal
# 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
Vaziyat 4: "Hamma narsani buzdim"
Terminal
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 #

Uchta oltin qoida
  1. Push qilingan tarixni o'zgartirmang - revert ishlating.
  2. --hard dan oldin git status ni tekshiring.
  3. Shubhalansangiz - avval tarmoq yarating:
    Terminal
     git branch zaxira-$(date +%s)

    Endi xohlagan narsani sinashingiz mumkin - kommitlar shu tarmoqda qoladi.

Amaliy topshiriq
  1. Faylni tahrirlang va git restore bilan qaytaring.
  2. git add qiling va git restore --staged bilan sahnadan chiqaring.
  3. Kommit qiling, keyin git commit --amend bilan xabarini o'zgartiring.
  4. Uchta kommit qiling va git reset --soft HEAD~3 bilan ularni birlashtiring.
  5. Bitta kommitni git revert qiling va tarixda ikkalasi ham turganini ko'ring.
  6. git reset --hard HEAD~2 qiling, keyin git reflog bilan qaytaring.
  7. git restore --source=HEAD~2 bilan faqat bitta faylni eski holatga qaytaring.
  8. reset va revert farqini 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.

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.