Foydali vositalar: .gitignore, undo, stash
Git kundalik ishda bir qancha juda foydali vositalarga ega: keraksiz fayllarni e'tiborsiz qoldirish (.gitignore), xatolarni orqaga qaytarish (undo), ishni vaqtincha yashirish (stash) va versiyalarni belgilash (tag). Ushbu darsda ushbu amaliy vositalarni va yaxshi commit xabari yozish qoidalarini chuqur o'rganamiz. Bular sizning ishingizni ancha tozaroq va xavfsizroq qiladi.
.gitignore fayli nima?
Har bir loyihada Git kuzatishi shart bo'lmagan fayllar bo'ladi: vaqtinchalik fayllar, o'rnatilgan kutubxonalar, maxfiy parollar, tahrirlagich sozlamalari. Bularni omborga qo'shish keraksiz โ ular joyni to'ldiradi, xavfsizlikka putur yetkazadi va boshqa kompyuterlarda muammo tug'diradi.
.gitignore โ bu maxsus fayl bo'lib, unda Git e'tiborsiz qoldirishi kerak bo'lgan fayl va papkalar ro'yxati yoziladi. U loyihaning ildiz (root) papkasida joylashadi. Bu faylda ko'rsatilgan narsalar git statusda umuman ko'rinmaydi va tasodifan commit qilib bo'lmaydi.
.gitignore namunasi
Mana tipik .gitignore fayli namunasi. Har bir qator โ bir naqsh (pattern):
# Node.js bog'liqliklari (juda katta, kuzatilmaydi)
node_modules/
# Muhit o'zgaruvchilari va maxfiy ma'lumotlar
.env
.env.local
# Log fayllari
*.log
logs/
# Operatsion tizim yaratadigan fayllar
.DS_Store
Thumbs.db
# Tahrirlagich sozlamalari
.vscode/
.idea/
# Yig'ish (build) natijalari
dist/
build/
Naqsh qoidalarini tushunamiz:
node_modules/โ oxiridagi/bu papka ekanligini bildiradi;*.logโ yulduzcha (*) istalgan nomga mos keladi; bu barcha.logbilan tugaydigan fayllarni e'tiborsiz qoldiradi;# bilan boshlanadigan qatorโ bu izoh, Git uni o'qimaydi;.envโ aniq fayl nomi; xavfsizlik uchun parol va kalitlar shu yerda saqlanib, hech qachon commit qilinmaydi.
.gitignore shablonlari bor. github.com/github/gitignore omborida yuzlab tilga mos namunalar mavjud. Yangi loyiha ochganingizda o'z tilingizga mos shablonni oling va kerakli qatorlarni qo'shing..envga yozib, .envni .gitignorega qo'shing. Agar tasodifan maxfiy ma'lumot GitHub'ga tushib qolsa โ uni darhol bekor qiling (o'zgartiring), chunki commit tarixidan uni butunlay o'chirish qiyin va u allaqachon ko'rilgan bo'lishi mumkin.Allaqachon kuzatilayotgan faylni chiqarish: git rm --cached
Muhim nuance: .gitignore faqat hali kuzatilmagan (Git bilmaydigan) fayllarga ta'sir qiladi. Agar fayl allaqachon commit qilingan bo'lsa, uni .gitignorega qo'shish yetarli emas โ Git uni kuzatishda davom etadi.
Masalan, siz .envni adashib commit qildingiz, keyin .gitignorega qo'shdingiz โ lekin u hali ham kuzatilmoqda. Uni kuzatuvdan chiqarish uchun git rm --cached:
# faylni kuzatuvdan chiqaramiz, lekin diskda saqlaymiz
$ git rm --cached .env
rm '.env'
# endi o'zgarishni commit qilamiz
$ git commit -m '.env faylini kuzatuvdan chiqardim'
Muhim: --cached bayrog'i faylni faqat Git kuzatuvidan chiqaradi, diskdagi haqiqiy faylga tegmaydi. Agar oddiy git rm .env (--cached'siz) yozsangiz โ fayl diskdan ham o'chib ketadi!
Papka uchun -r (recursive) qo'shiladi:
# butun papkani kuzatuvdan chiqarish
$ git rm -r --cached node_modules/
O'zgarishni bekor qilish: restore, reset, revert
Xatolar bo'ladi โ Git ularni orqaga qaytarishning uch xil vositasini beradi. Ularni chalkashtirmaslik juda muhim, chunki ular turli darajada ishlaydi:
git restoreโ saqlanmagan (commit qilinmagan) o'zgarishlarni bekor qiladi;git resetโ commitlarni orqaga suradi (tarixni o'zgartiradi);git revertโ mavjud commit'ni bekor qiluvchi yangi commit yaratadi (tarixni saqlaydi).
Har birini alohida ko'ramiz.
git restore โ saqlanmagan o'zgarishni tashlash
Faylni o'zgartirdingiz-u, lekin bu o'zgarish yoqmadi va oxirgi commit holatiga qaytarmoqchisiz. git restore:
# bitta faylni oxirgi commit holatiga qaytarish
$ git restore index.html
# barcha o'zgarishlarni bekor qilish
$ git restore .
git restore saqlanmagan o'zgarishlarni butunlay yo'qotadi โ ularni qaytarib bo'lmaydi. Faqat rostdan kerak emasligiga ishonganingizda ishlating. Agar faylni git add qilib bo'lgan bo'lsangiz, uni staging'dan chiqarish uchun: git restore --staged fayl.git reset โ commitni orqaga surish
git reset branch ko'rsatkichini oldingi commit'ga qaytaradi. Uch rejim bor:
--softโ commit bekor qilinadi, lekin o'zgarishlar staging'da (add qilingan holatda) qoladi;--mixed(standart) โ commit bekor qilinadi, o'zgarishlar saqlanadi lekin staging'dan chiqadi;--hardโ commit ham, o'zgarishlar ham butunlay o'chadi.
# oxirgi commit'ni bekor qilib, o'zgarishlarni saqlash
$ git reset --soft HEAD~1
# oxirgi commit'ni va barcha o'zgarishlarni o'chirish (xavfli!)
$ git reset --hard HEAD~1
Bu yerda HEAD~1 "oxirgi commit'dan bitta oldingisi" degani.
git reset tarixni o'zgartiradi. Allaqachon push qilingan commitlarga reset qilmang โ bu jamoadoshlaringiz uchun katta muammo tug'diradi. Push qilingan o'zgarishni bekor qilish uchun git revertdan foydalaning.git revert โ xavfsiz bekor qilish
git revert eski commit'ni o'chirmaydi โ uning ta'sirini bekor qiluvchi yangi commit yaratadi. Bu tarixni saqlaydi va push qilingan commitlar uchun xavfsiz:
# ma'lum bir commit'ni bekor qiluvchi yangi commit yaratish
$ git revert 1a2b3c4
[main 8h9i0j1] Revert 'Xato funksiya qoshildi'
reset qulay. Push qilingan (jamoa ko'rgan) commitlar uchun esa doim revert ishlating โ u tarixni buzmaydi va hamma xavfsiz sinxron qoladi.Ishni vaqtincha yashirish: git stash
Ba'zan yarim tayyor ish ustida turasiz-u, to'satdan boshqa narsaga o'tishga to'g'ri keladi (masalan, shoshilinch xato tuzatish). Lekin yarim ishni commit qilishni istamaysiz. git stash โ o'zgarishlarni vaqtincha yashiradi va ish stolini tozalaydi:
# joriy o'zgarishlarni yashiramiz
$ git stash
Saved working directory and index state WIP on main: 5d6e7f8 oxirgi commit
# endi ish stoli toza โ boshqa branch'ga o'tsa bo'ladi
$ git status
nothing to commit, working tree clean
Boshqa ishni bajarib bo'lgach, yashirilgan o'zgarishlarni qaytarib olasiz:
# yashirilgan o'zgarishni qaytarib, ro'yxatdan o'chirish
$ git stash pop
# yashirilganlar ro'yxatini ko'rish
$ git stash list
stash@{0}: WIP on main: 5d6e7f8 oxirgi commit
Asosiy stash buyruqlari:
git stashโ joriy o'zgarishlarni yashirish;git stash listโ yashirilganlar ro'yxati;git stash popโ oxirgi yashiringanni qaytarish va ro'yxatdan o'chirish;git stash applyโ qaytarish, lekin ro'yxatda saqlab qolish;git stash dropโ yashirilganni o'chirish;git stash clearโ barcha yashiringanlarni tozalash.
Versiyalarni belgilash: git tag qisqacha
Tag โ bu ma'lum bir commit'ga qo'yilgan doimiy nom (yorliq). U ko'pincha loyiha versiyalarini belgilash uchun ishlatiladi: v1.0.0, v2.1.3 va h.k. Branch'dan farqli, tag siljimaydi โ u doim bir commit'ga ishora qiladi.
# joriy commit'ga versiya tegi qo'yish
$ git tag v1.0.0
# izohli tag (tavsiya etiladi)
$ git tag -a v1.0.0 -m 'Birinchi barqaror versiya'
# barcha teglarni ko'rish
$ git tag
v1.0.0
# teglarni GitHub'ga yuborish (push ularni avtomatik yubormaydi!)
$ git push origin v1.0.0
git push teglarni yubormaydi โ ularni alohida push qilish kerak. Barcha teglarni birdan yuborish uchun: git push origin --tags. Teglar ko'pincha GitHub'da "Releases" (chiqarilishlar) yaratish uchun asos bo'ladi.Yaxshi commit xabari yozish qoidalari
Commit xabari โ bu kelajakdagi o'zingiz va jamoadoshlaringiz uchun izoh. Yaxshi xabar kodni tushunishni osonlashtiradi. Mana asosiy qoidalar:
- Qisqa va aniq sarlavha โ 50 belgidan oshmasin; nima qilinganini aniq bildirsin;
- Buyruq ohangi โ "Login xatosini tuzatdim" yoki "Fix login bug" kabi; "tuzatilyapti" emas;
- Nimani va nima uchun โ sarlavhada nima o'zgargani, kerak bo'lsa tavsifda nima uchun o'zgargani;
- Bitta commit โ bitta mantiqiy o'zgarish โ bir nechta bog'liq bo'lmagan o'zgarishni bitta commit'ga aralashtirmang;
- Ma'nosiz xabarlardan qoching โ "tuzatildi", "o'zgarish", "asdf" kabilar keyinchalik hech narsa aytmaydi.
Yomon va yaxshi misollarni solishtiring:
# Yomon xabarlar:
git commit -m 'tuzatildi'
git commit -m 'o'zgarish'
git commit -m 'asdfgh'
# Yaxshi xabarlar:
git commit -m 'Login formasidagi validatsiya xatosini tuzatdim'
git commit -m 'Bosh sahifaga qidiruv paneli qoshdim'
git commit -m 'README ga o'rnatish yoriqnomasini qoshdim'
Uzunroq izoh kerak bo'lsa, ko'p qatorli commit ham yozish mumkin โ sarlavhadan keyin bo'sh qator qoldirib, batafsil tavsif yoziladi:
$ git commit
# tahrirlagich ochiladi, quyidagicha yoziladi:
Qidiruv funksiyasini optimallashtirdim
Avvalgi qidiruv har bir bosishda serverga so'rov yuborardi,
bu esa yukni oshirardi. Endi 300ms kechikish (debounce)
qo'shildi โ so'rovlar soni sezilarli kamaydi.
feat: (yangi funksiya), fix: (xato tuzatish), docs: (hujjat), refactor: (qayta yozish). Masalan: feat: qidiruv paneli qoshildi. Bu tarixni o'qishni va avtomatlashtirishni osonlashtiradi.Xulosa
- .gitignore โ kuzatilishi shart bo'lmagan fayllar (node_modules, .env, *.log) ro'yxati;
git rm --cached faylโ allaqachon kuzatilayotgan faylni kuzatuvdan chiqarish (diskda qoldirib);git restoreโ saqlanmagan o'zgarishni bekor qilish;git resetโ commitni orqaga surish (mahalliy, push qilinmagan uchun);git revertโ bekor qiluvchi yangi commit (push qilingan uchun xavfsiz);git stashโ ishni vaqtincha yashirish,git stash popโ qaytarish;git tag v1.0.0โ versiyalarni belgilash (push uchun--tags);- yaxshi commit xabari โ qisqa, aniq, buyruq ohangida, ma'noli.
Ushbu vositalar bilan siz Git'ni ishonchli va toza tarzda ishlata olasiz. Bu โ professional dasturchining kundalik asboblar to'plami. Tabriklaymiz, Git va GitHub bo'limini yakunladingiz!