17-bo‘lim

Xatolarni topish va tarixni qidirish

git bisect bilan xato sababini avtomatik topish, reflog, fsck va murakkab qidiruv usullari.

🕑 17 daqiqa o‘qish 📄 617 so‘z 👁 5 marta ko‘rilgan
Ushbu bo‘lim mundarijasi
  1. git bisect - ikkilik qidiruv
  2. Avtomatik bisect
  3. Qo'shimcha imkoniyatlar
  4. git reflog - hammasini eslaydi
  5. git fsck - yo'qolgan obyektlarni topish
  6. Kuchli qidiruv
  7. git blame chuqurroq
  8. Kommitni topish
  9. Tarmoq holatini tekshirish
  10. Repozitoriy salomatligi
  11. Amaliy tergov
  12. Xulosa

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

Har bir tekshiruv qidiruv maydonini ikki barobar qisqartiradi good bad 1-tekshiruv 200 kommit 2-tekshiruv 100 kommit 3-tekshiruv 50 kommit 1000 kommit uchun atigi 10 ta tekshiruv yetarli
Har bir javob qidiruv maydonini yarmiga qisqartiradi
Terminal
# Qidiruvni boshlash
git bisect start

# Joriy holat buzuq
git bisect bad

# v1.0.0 da ishlar edi
git bisect good v1.0.0
Natija
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:

Terminal
php tests/savat_test.php

Natijaga qarab javob bering:

Terminal
git bisect good    # bu kommitda ishlaydi
# yoki
git bisect bad     # bu kommitda ham buzuq

Git keyingi kommitga o'tadi. Takrorlang:

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

Terminal
git show 2c7b4e9
Terminal
# Qidiruvni tugatish - boshlang'ich holatga qaytish
git bisect reset

Avtomatik bisect #

Agar tekshiruvni skript qila olsa, hammasi avtomatik bo'ladi:

Terminal
git bisect start HEAD v1.0.0
git bisect run php tests/savat_test.php
Natija
running php tests/savat_test.php
...
2c7b4e9a1f5d8b3c6e0a2d4f7b9c1e3a5d8f0b26 is the first bad commit
bisect run success
Skript talabi

bisect run skriptning chiqish kodiga qaraydi:

KodMa'nosi
0good - ishlaydi
1-124bad - buzuq
125skip - tekshirib bo'lmadi
Terminal
#!/bin/bash
# tekshir.sh
composer install --quiet || exit 125    # qurib bo'lmadi - skip
php tests/savat_test.php
Terminal
git bisect run ./tekshir.sh

Qo'shimcha imkoniyatlar #

Terminal
# 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/
"good" va "bad" nomlarini o'zgartirish

Ba'zan siz xatoni emas, qachon tuzatilganini qidirasiz:

Terminal
git bisect start --term-old=ishlamaydi --term-new=ishlaydi

git reflog - hammasini eslaydi #

reflog - HEAD va tarmoqlarning barcha harakatlari jurnali.

Terminal
git reflog
Natija
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
Terminal
# 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
Reflog - eng ishonchli qutqaruvchi

Deyarli har qanday "yo'qotdim" holatida reflog yordam beradi:

  • reset --hard bilan o'chirilgan kommitlar
  • Muvaffaqiyatsiz rebase
  • Tasodifan o'chirilgan tarmoq
  • --amend bilan almashtirilgan kommit
Terminal
git reflog
git reset --hard HEAD@{5}
Reflog abadiy emas
ObyektSaqlanish muddati
Yetib boriladigan kommitlar90 kun
Yetib bo'lmaydigan kommitlar30 kun

Bu muddatdan keyin git gc ularni o'chiradi. Muhim narsani topganingizda darhol tarmoq yarating:

Terminal
git branch qutqarilgan 8f3a1d0

git fsck - yo'qolgan obyektlarni topish #

Reflog ham yordam bermasa:

Terminal
git fsck --lost-found
Natija
Checking object directories: 100% (256/256), done.
dangling commit 8f3a1d0e4b7c2a5f9d1e3b6c8a0f2d4e7b9c1a35
dangling commit 5e1d8b3c6a9f2e4d7b0c3a5f8e1d4b7c0a3f6e29
dangling blob a45bd7f9c2e18d3b6045f7a9c1e3b5d7f9028a4c
Terminal
# Har birini ko'rib chiqish
git show 8f3a1d0

# Kerakligini topsangiz
git branch topilgan 8f3a1d0
"Dangling" nima?

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

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

Terminal
# 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
Formatlash kommitlari blame ni buzadi

Kimdir butun loyihani qayta formatlagan bo'lsa, blame hamma satr uchun o'sha kommitni ko'rsatadi.

Yechim - shunday kommitlarni e'tiborsiz qoldirish:

Terminal
echo "8f3a1d0e4b7c2a5f9d1e3b6c8a0f2d4e7b9c1a35" >> .git-blame-ignore-revs
git config blame.ignoreRevsFile .git-blame-ignore-revs

GitHub ham bu faylni tan oladi.

Kommitni topish #

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

Terminal
# Nima birlashtirilmagan?
git log --no-merges main..feature/savat --oneline

# Ikkala tomonda ham nima bor?
git log --left-right --oneline main...feature/savat
Natija
< c9d2e71 main dagi kommit
> 8f3a1d0 feature dagi kommit
> 2c7b4e9 feature dagi kommit

Repozitoriy salomatligi #

Terminal
# Yaxlitlikni tekshirish
git fsck --full

# Statistika
git count-objects -vH
Natija
count: 1284
size: 12.48 MiB
in-pack: 8420
packs: 3
size-pack: 42.15 MiB
Terminal
# Tozalash va siqish
git gc --aggressive --prune=now
--prune=now reflog ni ham tozalaydi

Bu buyruqdan keyin yo'qolgan kommitlarni topib bo'lmaydi.

Odatiy holatda oddiy git gc yetarli - Git buni o'zi kerak bo'lganda bajaradi.

Amaliy tergov #

Vaziyat: sayt sekinlashdi
Terminal
# 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
Amaliy topshiriq
  1. Repozitoriyda 10 ta kommit yarating, ulardan birida ataylab xato qiling.
  2. git bisect bilan xato kommitni toping.
  3. Xatoni aniqlaydigan oddiy skript yozing (chiqish kodi 0 yoki 1).
  4. git bisect run bilan avtomatik qidiring.
  5. git reset --hard HEAD~5 qiling va reflog bilan qaytaring.
  6. Tarmoq yaratib, kommit qiling, tarmoqni -D bilan o'chiring va git fsck --lost-found bilan toping.
  7. git log -S bilan biror so'z qaysi kommitda qo'shilganini toping.
  8. git blame -w -C ni sinab ko'ring.
  9. git branch --contains bilan kommit qaysi tarmoqlarda borligini ko'ring.
  10. git count-objects -vH bilan repozitoriy hajmini o'lchang.

Xulosa #

  • git bisect ikkilik qidiruv bilan xato kommitni tez topadi: 1000 kommit uchun ~10 ta tekshiruv.
  • git bisect run skript bilan butun jarayonni avtomatlashtiradi.
  • git reflog barcha HEAD harakatlarini eslaydi - eng ishonchli qutqaruvchi.
  • Yo'qolgan obyektlar 30-90 kun saqlanadi, keyin gc ularni o'chiradi.
  • git fsck --lost-found reflog dan ham chuqurroq qidiradi.
  • -S kod ichida matn qidiradi, -G doimiy ifoda bilan.
  • git blame -w -C formatlash va ko'chirishlarni e'tiborsiz qoldiradi.
  • .git-blame-ignore-revs formatlash kommitlarini blame dan chiqaradi.
  • git branch --contains kommit qaysi tarmoqlarda borligini ko'rsatadi.

Keyingi bo'limda avtomatlashtirish va GitHub Actions ni ko'ramiz.

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.