17-bo‘lim
Xatolarni topish va tarixni qidirish
git bisect bilan xato sababini avtomatik topish, reflog, fsck va murakkab qidiruv usullari.
Ushbu bo‘lim mundarijasi
"Kecha ishlayotgan edi, bugun ishlamayapti." Bu holatda Git ning tergov vositalari qo'l keladi.
git bisect - ikkilik qidiruv #
Sizda 200 ta kommit bor va qaysi birida xato paydo bo'lganini bilmaysiz.
Har birini tekshirish - 200 ta urinish. bisect esa buni 8 ta
urinishda topadi.
# Qidiruvni boshlash
git bisect start
# Joriy holat buzuq
git bisect bad
# v1.0.0 da ishlar edi
git bisect good v1.0.0
Bisecting: 98 revisions left to test after this (roughly 7 steps)
[8f3a1d0e4b7c2a5f9d1e3b6c8a0f2d4e7b9c1a35] Savat mantiqi qayta yozildi
Git avtomatik o'rtadagi kommitga o'tdi. Endi tekshiring:
php tests/savat_test.php
Natijaga qarab javob bering:
git bisect good # bu kommitda ishlaydi
# yoki
git bisect bad # bu kommitda ham buzuq
Git keyingi kommitga o'tadi. Takrorlang:
Bisecting: 49 revisions left to test after this (roughly 6 steps)
...
Bisecting: 0 revisions left to test after this (roughly 1 step)
2c7b4e9a1f5d8b3c6e0a2d4f7b9c1e3a5d8f0b26 is the first bad commit
commit 2c7b4e9a1f5d8b3c6e0a2d4f7b9c1e3a5d8f0b26
Author: Jasur Toshmatov <[email protected]>
Date: Wed Jun 12 11:20:15 2026 +0500
Narx hisobi optimallashtirildi
manba/narx.php | 18 ++++++++--------
Topildi. Endi shu kommitni ko'rib chiqing:
git show 2c7b4e9
# Qidiruvni tugatish - boshlang'ich holatga qaytish
git bisect reset
Avtomatik bisect #
Agar tekshiruvni skript qila olsa, hammasi avtomatik bo'ladi:
git bisect start HEAD v1.0.0
git bisect run php tests/savat_test.php
running php tests/savat_test.php
...
2c7b4e9a1f5d8b3c6e0a2d4f7b9c1e3a5d8f0b26 is the first bad commit
bisect run success
bisect run skriptning chiqish kodiga qaraydi:
| Kod | Ma'nosi |
|---|---|
0 | good - ishlaydi |
1-124 | bad - buzuq |
125 | skip - tekshirib bo'lmadi |
#!/bin/bash
# tekshir.sh
composer install --quiet || exit 125 # qurib bo'lmadi - skip
php tests/savat_test.php
git bisect run ./tekshir.sh
Qo'shimcha imkoniyatlar #
# Bu kommitni tekshirib bo'lmaydi (masalan, qurilmaydi)
git bisect skip
# Jarayonni ko'rish
git bisect log
# Saqlab, keyin davom ettirish
git bisect log > bisect.log
git bisect replay bisect.log
# Faqat ma'lum papkadagi o'zgarishlar orasidan qidirish
git bisect start -- manba/savat/
Ba'zan siz xatoni emas, qachon tuzatilganini qidirasiz:
git bisect start --term-old=ishlamaydi --term-new=ishlaydi
git reflog - hammasini eslaydi #
reflog - HEAD va tarmoqlarning barcha harakatlari jurnali.
git reflog
8f3a1d0 HEAD@{0}: rebase (finish): returning to refs/heads/feature/savat
2c7b4e9 HEAD@{1}: rebase (pick): Savat mantiqi
c9d2e71 HEAD@{2}: rebase (start): checkout main
5a8b3f0 HEAD@{3}: commit: Savat sahifasi
1f4c6d9 HEAD@{4}: checkout: moving from main to feature/savat
c9d2e71 HEAD@{5}: reset: moving to HEAD~2
# Ma'lum tarmoq uchun
git reflog show main
# Sana bilan
git reflog --date=iso
# Vaqt bo'yicha murojaat
git show HEAD@{2.hours.ago}
git diff main@{yesterday} main
Deyarli har qanday "yo'qotdim" holatida reflog yordam beradi:
reset --hardbilan o'chirilgan kommitlar- Muvaffaqiyatsiz rebase
- Tasodifan o'chirilgan tarmoq
--amendbilan almashtirilgan kommit
git reflog
git reset --hard HEAD@{5}
| Obyekt | Saqlanish muddati |
|---|---|
| Yetib boriladigan kommitlar | 90 kun |
| Yetib bo'lmaydigan kommitlar | 30 kun |
Bu muddatdan keyin git gc ularni o'chiradi. Muhim narsani
topganingizda darhol tarmoq yarating:
git branch qutqarilgan 8f3a1d0
git fsck - yo'qolgan obyektlarni topish #
Reflog ham yordam bermasa:
git fsck --lost-found
Checking object directories: 100% (256/256), done.
dangling commit 8f3a1d0e4b7c2a5f9d1e3b6c8a0f2d4e7b9c1a35
dangling commit 5e1d8b3c6a9f2e4d7b0c3a5f8e1d4b7c0a3f6e29
dangling blob a45bd7f9c2e18d3b6045f7a9c1e3b5d7f9028a4c
# Har birini ko'rib chiqish
git show 8f3a1d0
# Kerakligini topsangiz
git branch topilgan 8f3a1d0
"Osilgan" obyekt - hech qanday tarmoq, teg yoki kommitdan unga havola yo'q.
U hali diskda turibdi, lekin oddiy usullar bilan topib bo'lmaydi.
Kuchli qidiruv #
# Kod ichida qidirish - qaysi kommitda qo'shilgan/o'chirilgan
git log -S "hisoblaJami" --oneline
# Doimiy ifoda bilan
git log -G "function\s+hisobla" --oneline
# Faqat ma'lum faylda
git log -S "narx" -- manba/savat.php
# O'zgarishni ham ko'rsatish
git log -S "narx" -p -- manba/savat.php
# Kommit xabarida
git log --grep="savat" --grep="narx" --all-match
# Muallif va sana bilan
git log --author="Jasur" --since="2026-06-01" --oneline
-S va -G farqi-S "matn"- shu matn soni o'zgargan kommitlarni topadi (qo'shilgan yoki o'chirilgan)-G "ifoda"- diff ichida shu ifodaga mos keladigan har qanday o'zgarishni topadi
Odatda -S aniqroq natija beradi.
git blame chuqurroq #
# Bo'sh joy o'zgarishlarini e'tiborsiz qoldirish
git blame -w manba/savat.php
# Ko'chirilgan satrlarni kuzatish
git blame -C manba/savat.php
# Fayllar orasida ko'chirishni ham
git blame -C -C -C manba/savat.php
# Ma'lum satrlar
git blame -L 40,60 manba/savat.php
# Ma'lum funksiyani
git blame -L :hisoblaJami manba/savat.php
blame ni buzadiKimdir butun loyihani qayta formatlagan bo'lsa, blame hamma satr uchun
o'sha kommitni ko'rsatadi.
Yechim - shunday kommitlarni e'tiborsiz qoldirish:
echo "8f3a1d0e4b7c2a5f9d1e3b6c8a0f2d4e7b9c1a35" >> .git-blame-ignore-revs
git config blame.ignoreRevsFile .git-blame-ignore-revs
GitHub ham bu faylni tan oladi.
Kommitni topish #
# Bu kommit qaysi tarmoqlarda bor?
git branch --contains 8f3a1d0
# Qaysi teglarda?
git tag --contains 8f3a1d0
# Ikki tarmoqning umumiy otasi
git merge-base main feature/savat
# Kommit qachon merge qilingan?
git log --merges --ancestry-path 8f3a1d0..main | tail -1
Tarmoq holatini tekshirish #
# Nima birlashtirilmagan?
git log --no-merges main..feature/savat --oneline
# Ikkala tomonda ham nima bor?
git log --left-right --oneline main...feature/savat
< c9d2e71 main dagi kommit
> 8f3a1d0 feature dagi kommit
> 2c7b4e9 feature dagi kommit
Repozitoriy salomatligi #
# Yaxlitlikni tekshirish
git fsck --full
# Statistika
git count-objects -vH
count: 1284
size: 12.48 MiB
in-pack: 8420
packs: 3
size-pack: 42.15 MiB
# Tozalash va siqish
git gc --aggressive --prune=now
--prune=now reflog ni ham tozalaydiBu buyruqdan keyin yo'qolgan kommitlarni topib bo'lmaydi.
Odatiy holatda oddiy git gc yetarli - Git buni o'zi kerak bo'lganda
bajaradi.
Amaliy tergov #
# 1. Qachondan boshlab? Ikki hafta oldin ishlar edi
git bisect start
git bisect bad HEAD
git bisect good HEAD@{2.weeks.ago}
# 2. Har bir bosqichda tezlikni o'lchash
git bisect run ./tezlik-testi.sh
# 3. Topilgan kommitni ko'rish
git show <topilgan-xesh>
# 4. Kim va nima uchun qilgan?
git log -1 --format="%an %ae%n%n%B" <topilgan-xesh>
# 5. Shu faylning butun tarixi
git log -p --follow -- manba/qidiruv.php
- Repozitoriyda 10 ta kommit yarating, ulardan birida ataylab xato qiling.
git bisectbilan xato kommitni toping.- Xatoni aniqlaydigan oddiy skript yozing (chiqish kodi 0 yoki 1).
git bisect runbilan avtomatik qidiring.git reset --hard HEAD~5qiling vareflogbilan qaytaring.- Tarmoq yaratib, kommit qiling, tarmoqni
-Dbilan o'chiring vagit fsck --lost-foundbilan toping. git log -Sbilan biror so'z qaysi kommitda qo'shilganini toping.git blame -w -Cni sinab ko'ring.git branch --containsbilan kommit qaysi tarmoqlarda borligini ko'ring.git count-objects -vHbilan repozitoriy hajmini o'lchang.
Xulosa #
git bisectikkilik qidiruv bilan xato kommitni tez topadi: 1000 kommit uchun ~10 ta tekshiruv.git bisect runskript bilan butun jarayonni avtomatlashtiradi.git reflogbarchaHEADharakatlarini eslaydi - eng ishonchli qutqaruvchi.- Yo'qolgan obyektlar 30-90 kun saqlanadi, keyin
gcularni o'chiradi. git fsck --lost-foundreflog dan ham chuqurroq qidiradi.-Skod ichida matn qidiradi,-Gdoimiy ifoda bilan.git blame -w -Cformatlash va ko'chirishlarni e'tiborsiz qoldiradi..git-blame-ignore-revsformatlash kommitlariniblamedan chiqaradi.git branch --containskommit qaysi tarmoqlarda borligini ko'rsatadi.
Keyingi bo'limda avtomatlashtirish va GitHub Actions ni ko'ramiz.
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.