Reset — Gitda joriy branch pointeri, staging area va ayrim rejimlarda working tree holatini tanlangan commitga moslashtiradigan amal. git reset tarixni yangi commit bilan bekor qilmaydi; reference’ni ko‘chiradi. Shu sababli u lokal xatoni tuzatishda foydali, shared remote tarixda esa ehtiyotsiz ishlatilsa commitlarni branch uchidan yo‘qotadi.
Uchta daraxt modeli
Git resetni tushunish uchun uch holat ajratiladi:
- HEAD joriy branch ko‘rsatgan commit;
- index keyingi commit uchun staging area;
- working tree diskdagi tahrir qilinayotgan fayllar.
Reset rejimi ushbu qatlamlarning qaysi birini o‘zgartirishini belgilaydi.
Soft reset
git reset --soft HEAD~1
Branch pointeri oldingi commitga ko‘chadi, index va working tree saqlanadi. Bekor qilingan commit o‘zgarishlari stage qilingan holatda qoladi. Bir nechta lokal commitni qayta guruhlash yoki commit xabarini boshqacha yaratish uchun ishlatilishi mumkin.
Mixed reset
git reset --mixed default rejim. HEAD ko‘chadi va index tanlangan commitga moslanadi, working tree’dagi o‘zgarishlar saqlanadi. Natijada o‘zgarishlar unstaged holatga o‘tadi. Path bilan ishlatilgan reset branch pointerini ko‘chirmasdan ma’lum faylni indexdan chiqarishi mumkin; zamonaviy Gitda git restore --staged bu niyatni aniqroq ifodalaydi.
Hard reset
git reset --hard <commit>
HEAD, index va tracked working tree fayllari tanlangan commitga moslanadi. Commit qilinmagan tracked o‘zgarishlar yo‘qolishi mumkin. Untracked fayllar odatda alohida qoladi, lekin boshqa cleanup buyrug‘i ularni ham o‘chirishi mumkin.
Hard reset destructive bo‘lgani uchun joriy status va kerakli patch tekshiriladi. Commit qilingan eski tarix reflog orqali vaqtincha tiklanishi mumkin, commit qilinmagan working tree matni esa Git obyektiga yozilmagan bo‘lsa qaytarilmasligi mumkin.
Remote tarixga ta’siri
Lokal branch remote’dan ortda reset qilinib oddiy push qilinsa non-fast-forward rad etiladi. Force push remote branchni yangi tarixga ko‘chiradi va hamkasblar clone’ida divergence hosil qiladi. Shared main branchda protection reset natijasini force push qilishni taqiqlaydi.
Public tarixdagi xatoni bekor qilish uchun revert yangi commit yaratadi. Reset odatda hali ulashilmagan lokal commitlar yoki kelishilgan history rewrite uchun tanlanadi.
Reflog
Reflog lokal reference harakatlarini qayd etadi. Resetdan oldingi HEAD git reflogda topilib, yangi branch bilan saqlanishi mumkin. Reflog remote serverda yoki boshqa clone’da aynan bir xil bo‘lishi shart emas va yozuvlar retentiondan keyin tozalanadi.
Reset database, deploy yoki tashqi tizimda commit sabab yuz bergan side effectni qaytarmaydi. U Git reference va fayl holatiga ta’sir qiladi.
Yo‘l bo‘yicha reset
git reset <commit> -- <path> branch uchini siljitmaydi; u tanlangan yo‘lning indexdagi holatini ko‘rsatilgan commitga moslaydi. Amalda git reset -- <path> ko‘pincha faylni staged holatdan chiqarib, working treedagi tahrirni saqlash uchun ishlatilgan. Zamonaviy Git shu niyatni aniqroq ifodalash uchun git restore --staged <path> buyrug‘ini ham taqdim etadi. Butun branchga qo‘llanadigan --hard bilan yo‘lga oid index amalini aralashtirmaslik muhim. Resetdan oldin git status va git diff --staged natijasini ko‘rish qaysi qatlam o‘zgarishini tushunishga yordam beradi.
Reset submodule ichidagi alohida repository tarixini odatda avtomatik ravishda kerakli holatga keltirmaydi. Asosiy repository faqat submodule commit ko‘rsatkichini saqlaydi; working tree mosligi git submodule update bilan tekshiriladi. Bu farq monorepository bo‘lmagan murakkab loyihalarda muhimdir.
Bog‘liq tushunchalar
Git, HEAD, staging area, working tree, reflog, revert, force push