Revert — Gitda oldingi commit kiritgan o‘zgarishning teskarisini yangi commit sifatida qo‘llash amali. git revert tarixni o‘chirmaydi yoki eski commit IDlarini almashtirmaydi. Shu sababli remote’ga push qilingan va jamoa foydalanayotgan branchdagi xatoli o‘zgarishni xavfsiz bekor qilish uchun keng ishlatiladi.
Oddiy revert
git revert a1b2c3d
Git tanlangan commit bilan uning parenti orasidagi patchni hisoblaydi, teskarisini current branchga qo‘llaydi va yangi commit yaratadi. Eski commit logda qoladi, yangi commit esa uning ta’sirini bekor qiladi. Commit message qaysi commit va nima sababdan revert qilinganini ko‘rsatadi.
Revert working tree aynan tarixdagi eski snapshotga qaytadi degani emas. Tanlangan commitdan keyingi boshqa o‘zgarishlar saqlanadi. Agar keyingi kod o‘sha satrlarni o‘zgartirgan bo‘lsa conflict yuz berishi mumkin.
Bir nechta commit
Bir nechta commitni revert qilishda tartib muhim. Odatda eng yangisidan eskisiga teskari qo‘llash dependencylarni to‘g‘ri yechadi. --no-commit bir nechta teskari patchni working tree va indexga yig‘ib, keyin bitta commit yaratishga imkon beradi.
Range sintaksisi qaysi commitlar kirishini diqqat bilan tekshirishni talab qiladi. git log va git diff bilan yakuniy natija tasdiqlanadi.
Merge commitni revert qilish
Merge commit ikki yoki undan ortiq parentga ega, shuning uchun qaysi parent asosiy tarix ekanini ko‘rsatish kerak:
git revert -m 1 <merge-commit>
-m 1 birinchi parentni mainline deb oladi va boshqa parentdan kelgan o‘zgarishni bekor qiladi. Noto‘g‘ri parent tanlash katta, kutilmagan patch yaratadi.
Merge’ni revert qilish Git tarixiga shu merge o‘zgarishi istalmaganini yozadi. Keyin ayni branchni oddiy merge qilish eski commitlarni “allaqachon birlashtirilgan” deb ko‘rishi mumkin. O‘zgarishni qayta kiritish uchun revert commitini yana revert qilish yoki yangi commitlar yaratish talab etiladi.
Revert va reset
Revert yangi commit qo‘shadi va shared historyni saqlaydi. Reset branch pointerini boshqa commitga ko‘chiradi va local index yoki working treega ham ta’sir qilishi mumkin. Public main branchda revert odatda xavfsizroq, chunki boshqalarning tarixini qayta yozmaydi.
Hosting platformasidagi pull request revert tugmasi merge commit yoki squash commitga teskari pull request yaratishi mumkin. Avtomatik revert conflict bo‘lsa lokal hal qilish talab qilinadi.
Database va deploy
Kod revert qilinishi database migration yoki tashqi side effectni avtomatik qaytarmaydi. Oldingi kod yangi schema bilan mos bo‘lmasligi mumkin. Feature flag, forward fix yoki alohida data recovery reja kerak bo‘ladi. Revertdan keyin test va deployment monitoring oddiy commit kabi bajariladi.
Qayta qo‘llash oqibati
Revert asl commitni tarixdan o‘chirmagani uchun Git uning o‘zgarishi bir marta kiritilganini biladi. Merge commit revert qilingach, ayni branchni yana merge qilish avvalgi o‘zgarishlarni avtomatik qaytarmasligi mumkin: merge ancestry allaqachon birlashgan deb hisoblanadi. Kerakli kodni qayta kiritish uchun revert commitning o‘zini revert qilish yoki yangi commit tayyorlash talab etiladi. Katta o‘zgarishni qaytarishda avval test muhitida natija tekshiriladi, chunki keyingi commitlar qaytarilayotgan kodga bog‘langan bo‘lishi mumkin. Revert xabari hodisa sababi va ta’sir doirasini qayd etsa, tarix operatsion jurnal sifatida foydaliroq bo‘ladi.
Bog‘liq tushunchalar
Git, commit, reset, merge commit, rollback, conflict, shared history