IlmHamroh
JavaScript Full-stack/7-qism. Git va GitHub asoslari6/36-dars21 daqiqa
Mundarija (39)

Git log: tarixni o'qish, filtrlash va git show

Qisqacha: git log — loyiha tarixi: har commitning SHA'si, muallifi, sanasi va xabari. --oneline uni qisqa ro'yxatga, --stat va -p esa "nima o'zgardi" ko'rinishiga aylantiradi. --author, --since, --grep va -- <fayl> filtrlari kerakli commitni bir necha soniyada topadi. Bitta commitni git show ochadi, HEAD~2 esa "oxirgidan ikki qadam oldingi commit" degani.

Bu darsda

  • git log natijasini o'qiysiz va sahifalagichdan (q) chiqishni bilasiz.
  • --oneline, --graph, --stat, -p va --format bilan tarixni turli ko'rinishda chiqarasiz.
  • --author, --since, --until, --grep va -- <yo'l> bilan kerakli commitni topasiz.
  • git show, HEAD~n va HEAD^ bilan bitta commitni va undagi faylni ochasiz.
  • git shortlog bilan kim qancha ish qilganini ko'rasiz.

Oldin bilishingiz kerak: Birinchi repo: init, status, add, commit, Yaxshi commit.

1. Nega bu kerak?

Oldingi darsda tarixni "kundalik" dedik va yaxshi yozishni o'rgandik. Endi kundalikni o'qishni o'rganamiz.

«Bahor» jamoasi kattalashdi. Dizayner Malika saytning ranglari va logotipi ustida ishlay boshladi. U fayllarini Telegram orqali yuboradi, Aziz esa ularni repoga Malika nomidan commit qiladi. Bir kuni Jasur aka so'radi:

  • "Lag'mon narxini kim va qachon o'zgartirgan edi?"
  • "Malika shu hafta nima qildi?"
  • "Menyu sahifasi boshidan beri qanday o'zgargan?"

Javoblarning hammasi tarixda bor. Faqat to'g'ri so'rash kerak. Bu darsning oxirida har bir savolga bitta buyruq bilan javob bera olasiz.

Aziz Malikaning ishini qanday qilib uning nomidan commit qildi? --author flagi bilan — commit muallifini aniq ko'rsatish mumkin:

bash
git add assets
git commit --author="Malika Rahimova <malika@example.com>" \
  -m "CSS: sarlavhalarga choyxona rangini ber"
text
[main 0993720] CSS: sarlavhalarga choyxona rangini ber
 Author: Malika Rahimova <malika@example.com>
 2 files changed, 1 insertion(+)
 create mode 100644 assets/css/.DS_Store

Oxirgi qatorga e'tibor bering: .DS_Store degan g'alati fayl ham commitga tushib qoldi. U nima ekanini shu darsda aniqlaymiz, uni tarixdan to'g'ri chiqarishni esa .gitignore darsida qilamiz. Qator oxiridagi \ — "buyruq keyingi qatorda davom etadi" degani, uni bitta qatorda yozsangiz ham bo'ladi.

Shundan keyin Malika logotip qo'shdi, Aziz esa lag'mon narxini o'zgartirdi. «Bahor» tarixida endi 12 ta commit bor.

2. git log — to'liq ko'rinish

2.1 Bitta yozuvni o'qish

bash
git log

Natijaning boshi:

text
commit d023ae0c49369a4aef3702d567952f7f73d2e62c (HEAD -> main)
Author: Aziz Karimov <aziz@example.com>
Date:   Sun Oct 4 11:00:00 2026 +0500

    Menyu: lag'mon narxini 30 000 so'mga ko'tar

commit 884500cab40753bcf14b1b126b389d8a24c751c3
Author: Malika Rahimova <malika@example.com>
Date:   Sun Oct 4 10:30:00 2026 +0500

    Bosh sahifa: logotip qo'sh
...

Qolgan 10 ta yozuvni ... bilan qisqartirdik. Har yozuv to'rt qismdan iborat:

  • commit d023ae0... — to'liq SHA, 40 belgi. Odatda boshidagi 7 tasi yetarli. Yonidagi (HEAD -> main) — "hozir shu yerdasiz": main branch va HEAD eng oxirgi commitni ko'rsatadi. Bu yorliq faqat bitta commit yonida turadi.
  • Author — kim yozgan: ism va email (Git'ni sozlash darsida o'rnatgansiz).
  • Date — qachon. Sun Oct 4 — yakshanba, 4-oktabr. +0500 — Toshkent vaqti (UTC dan 5 soat oldinda).
  • Xabar — 4 bo'sh joy surilgan. Tana bo'lsa, u ham to'liq chiqadi.

Tartib — eng yangisi tepada, eng eskisi pastda.

2.2 Sahifalagich: : va q

Uzun tarixda terminal pastida : belgisi paydo bo'ladi va buyruq "tugamaydi". Qo'rqmang — Git natijani sahifalagich (pager) dasturida ochdi. Standart sahifalagich — less: u uzun matnni ekranma-ekran ko'rsatadi.

Tugma Nima qiladi
Space yoki f Keyingi ekran
b Oldingi ekran
↑ / ↓ Bir qator yuqori / pastga
/so'z + Enter Matndan qidirish
q Chiqish

Oxiriga yetganda (END) yozuvi chiqadi. Qaytib buyruq yozish uchun q bosing. Boshlovchilarning eng ko'p savoli — "git log'dan qanday chiqaman?" Javob: q.

Maslahat: Sahifalagichni bitta buyruq uchun o'chirish mumkin: git --no-pager log. Natija oddiy matn bo'lib terminalga to'kiladi.

3. Qisqa ko'rinishlar

3.1 --oneline va -n

bash
git log --oneline
text
d023ae0 (HEAD -> main) Menyu: lag'mon narxini 30 000 so'mga ko'tar
884500c Bosh sahifa: logotip qo'sh
0993720 CSS: sarlavhalarga choyxona rangini ber
e979a8e Menyu: sarlavhaga choyxona nomini qo'sh
285ac84 Menyu: manti narxini qo'sh
e50f485 Bron: telefon raqamini qo'sh
07b061d Menyu: lag'mon narxini qo'sh
bd98d1b Bron: rahmat sahifasini qo'sh
b09fa2a Aloqa: sahifa yarat
9084599 Bosh sahifa: aloqa havolasini qo'sh
f4238e7 Menyu: osh narxini qo'sh
dab5bff Bahor: sayt tuzilmasini yarat

Har commit — bitta qator: qisqa SHA va sarlavha. Mana nega oldingi darsda sarlavhani 50 belgigacha va o'zi yetarli qilib yozdik: --oneline faqat uni ko'rsatadi. Tana ko'rinmaydi.

Faqat oxirgi bir nechtasi kerak bo'lsa — son bilan: -3 yoki -n 3:

bash
git log --oneline -3
text
d023ae0 (HEAD -> main) Menyu: lag'mon narxini 30 000 so'mga ko'tar
884500c Bosh sahifa: logotip qo'sh
0993720 CSS: sarlavhalarga choyxona rangini ber

-n boshqa flaglar bilan ham ishlaydi: git log -2 — oxirgi ikkitasi to'liq ko'rinishda.

3.2 --graph va --all

bash
git log --oneline --graph
text
* d023ae0 (HEAD -> main) Menyu: lag'mon narxini 30 000 so'mga ko'tar
* 884500c Bosh sahifa: logotip qo'sh
* 0993720 CSS: sarlavhalarga choyxona rangini ber
* e979a8e Menyu: sarlavhaga choyxona nomini qo'sh
...

--graph har commit oldiga * qo'yadi va ular orasidagi bog'lanishni chiziqlar bilan chizadi. Hozir tariximiz bitta to'g'ri chiziq, shuning uchun faqat yulduzchalar ko'rinadi. Tarix tarmoqlana boshlaganda (|, /, \ chiziqlari bilan) bu flag eng foydali vositaga aylanadi — buni Branch va Merge darslarida ko'rasiz.

--all — "hamma branch'larning tarixi". Standart holatda git log faqat joriy branch tarixini ko'rsatadi. Hozir bizda bitta branch bor, shuning uchun natija farq qilmaydi. Lekin --oneline --graph --all uchligini eslab qoling — keyinroq uni har kuni yozasiz.

3.3 O'z formatingiz: --format

Ko'rinishni o'zingiz tuzishingiz mumkin. % bilan boshlangan belgilar — commit ma'lumotlari:

bash
git log --format="%h %ad %an: %s" --date=short -5
text
d023ae0 2026-10-04 Aziz Karimov: Menyu: lag'mon narxini 30 000 so'mga ko'tar
884500c 2026-10-04 Malika Rahimova: Bosh sahifa: logotip qo'sh
0993720 2026-10-04 Malika Rahimova: CSS: sarlavhalarga choyxona rangini ber
e979a8e 2026-10-03 Aziz Karimov: Menyu: sarlavhaga choyxona nomini qo'sh
285ac84 2026-10-03 Aziz Karimov: Menyu: manti narxini qo'sh
Belgi Ma'nosi
%h Qisqa SHA
%an Muallif ismi (author name)
%ad Muallif sanasi; ko'rinishini --date=short belgilaydi
%s Sarlavha (subject)

Belgilarning to'liq ro'yxati git help log ning "PRETTY FORMATS" bo'limida. Hammasini yodlash shart emas — kerak bo'lganda qarab olasiz.

Tekshirib ko'ring: git log --oneline da commitlardan biri tanali (bir necha qatorli) xabarga ega. Tana qayerda ko'rinadi?

Javob

Hech qayerda — --oneline faqat sarlavhani ko'rsatadi. Tanani ko'rish uchun oddiy git log yoki git show <sha> kerak. Shuning uchun sarlavha tanasiz ham tushunarli bo'lishi kerak.

4. Nima o'zgardi: --stat, -p va git show

4.1 --stat — qaysi fayllar

bash
git log --stat -3
text
commit d023ae0c49369a4aef3702d567952f7f73d2e62c (HEAD -> main)
Author: Aziz Karimov <aziz@example.com>
Date:   Sun Oct 4 11:00:00 2026 +0500

    Menyu: lag'mon narxini 30 000 so'mga ko'tar

 menyu/index.html | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

commit 884500cab40753bcf14b1b126b389d8a24c751c3
Author: Malika Rahimova <malika@example.com>
Date:   Sun Oct 4 10:30:00 2026 +0500

    Bosh sahifa: logotip qo'sh

 assets/images/logo.svg | 1 +
 index.html             | 1 +
 2 files changed, 2 insertions(+)

commit 099372088258746aa58b0b408e43269f6048b539
Author: Malika Rahimova <malika@example.com>
Date:   Sun Oct 4 10:00:00 2026 +0500

    CSS: sarlavhalarga choyxona rangini ber

 assets/css/.DS_Store  | Bin 0 -> 9 bytes
 assets/css/asosiy.css |   1 +
 2 files changed, 1 insertion(+)

Har commit ostida o'zgargan fayllar ro'yxati. 2 +- — shu faylda 2 qator o'zgardi: bittasi qo'shildi (+), bittasi o'chdi (-). Narxni almashtirish Git uchun shunday ko'rinishini Yaxshi commit darsida ko'rgan edik.

Uchinchi commitda Bin 0 -> 9 bytes — binar fayl (binary file): matn emas, dastur uchun baytlar (Matnli va binar fayllar darsidagi farq). Git uning ichini qatorlarga bo'lib ko'rsata olmaydi, faqat hajmini aytadi: 0 baytdan 9 baytga.

Bu .DS_Store — macOS'ning Finder dasturi har papkada yaratadigan yashirin xizmat fayli. Malikaning kompyuteri Mac, u fayllarni papka bilan yuborgan. Saytga hech qanday aloqasi yo'q, repoda turishi ham kerak emas. --stat bo'lmaganda buni sezmay qolardik. Uni .gitignore darsida tozalaymiz.

4.2 -p — qaysi qatorlar

-p (--patch) har commitning to'liq farqini ko'rsatadi:

bash
git log -p -1
text
commit d023ae0c49369a4aef3702d567952f7f73d2e62c (HEAD -> main)
Author: Aziz Karimov <aziz@example.com>
Date:   Sun Oct 4 11:00:00 2026 +0500

    Menyu: lag'mon narxini 30 000 so'mga ko'tar

diff --git a/menyu/index.html b/menyu/index.html
index e4f0bdb..a874f85 100644
--- a/menyu/index.html
+++ b/menyu/index.html
@@ -1,4 +1,4 @@
 <h1>Bahor menyusi</h1>
 <p>Osh — 35 000 so'm</p>
-<p>Lag'mon — 28 000 so'm</p>
+<p>Lag'mon — 30 000 so'm</p>
 <p>Manti — 30 000 so'm</p>

Pastki qism — git add -p da ko'rgan bo'lak ko'rinishi: - eski qator, + yangi qator. Jasur akaning birinchi savoliga javob tayyor: lag'mon 28 000 dan 30 000 ga ko'tarilgan, Aziz, 4-oktabr. diff --git sarlavhasining har qatorini O'zgarishlarni ko'rish darsida o'qiymiz.

-p ni -1 siz ishlatmang: har bir commitning to'liq farqi juda uzun bo'ladi. Faqat bitta commit kerak bo'lsa, undan ham qulay buyruq bor.

4.3 git show — bitta commit

bash
git show 285ac84
text
commit 285ac849a71ba53aaff4d42b85706d0861428a51
Author: Aziz Karimov <aziz@example.com>
Date:   Sat Oct 3 09:05:00 2026 +0500

    Menyu: manti narxini qo'sh

diff --git a/menyu/index.html b/menyu/index.html
index 8eecc12..6af07ae 100644
--- a/menyu/index.html
+++ b/menyu/index.html
@@ -1,3 +1,4 @@
 <h1>Menyu</h1>
 <p>Osh — 35 000 so'm</p>
 <p>Lag'mon — 28 000 so'm</p>
+<p>Manti — 30 000 so'm</p>

git show <sha> = shu commitning to'liq yozuvi va farqi. SHA'ni to'liq yozish shart emas — Git adashtirmasdan taniy oladigan boshi yetarli (odatda 7 belgi). SHA yozilmasa — oxirgi commit ko'rsatiladi.

git show ham --stat ni tushunadi: git show --stat HEAD — oxirgi commit, faqat fayllar ro'yxati bilan.

Tekshirib ko'ring: git show va git log -p -1 — ikkalasi ham oxirgi commitni farqi bilan ko'rsatadi. Unda nega ikki xil buyruq bor?

Javob

Vazifasi boshqa. git log — ro'yxat uchun: ko'p commitni ketma-ket ko'rsatadi, -1 bilan biz uni bittaga cheklaymiz. git show — bitta narsani ochish uchun: commitni, eski commitdagi faylni (sha:yo'l) yoki keyinroq o'rganadigan tagni. Bitta commitga qarash kerak bo'lsa, git show <sha> qisqaroq va tushunarliroq.

4.4 Eski commitdagi fayl: git show <sha>:<yo'l>

Versiya nazorati darsidagi "vaqt mashinasi"ni eslang — ikki nuqta bilan faylning eski versiyasini ochgan edik:

bash
git show HEAD~2:index.html
text
<h1>Bahor choyxonasi</h1>
<a href="aloqa/">Aloqa</a>

Logotip qo'shilishidan oldingi bosh sahifa. HEAD~2 nima ekanini hozir ko'ramiz.

5. Nisbiy nomlar: HEAD~n va HEAD^

SHA'ni har safar ko'chirib yozish noqulay. Git "oxirgi commitdan hisoblab" nom berish imkonini beradi.

HEAD — "hozir turgan joyingiz", odatda joriy branch'ning oxirgi commiti. Uning ichki tuzilishini HEAD va refs darsida ochamiz. Hozircha: HEAD = eng yangi commit.

  • HEAD~1 — bir qadam orqaga (oxirgidan oldingi).
  • HEAD~2 — ikki qadam orqaga.
  • HEAD^ — HEAD~1 bilan bir xil. HEAD^^ = HEAD~2.
gitGraph
  commit id: "e979a8e"
  commit id: "0993720" tag: "HEAD~2"
  commit id: "884500c" tag: "HEAD~1"
  commit id: "d023ae0" tag: "HEAD"

Nimaga qarang: hisob o'ngdan chapga — eng oxirgi commitdan orqaga. Chap chetdagi e979a8e — HEAD~3.

Tekshiramiz. -s — "farqni ko'rsatma":

bash
git show -s --oneline HEAD^
git show -s --oneline HEAD^^
text
884500c Bosh sahifa: logotip qo'sh
0993720 CSS: sarlavhalarga choyxona rangini ber

Nega bir narsaga ikki belgi? Chiziqli tarixda ular bir xil. Farq merge commitda chiqadi: unda ikkita "ota" bo'ladi va ^2 ikkinchisini tanlaydi. Buni Merge darsida ko'rasiz. Kundalik ishda HEAD~n tushunarliroq.

Tekshirib ko'ring: git show -s --oneline HEAD~4 qaysi commitni ko'rsatadi? Yuqoridagi --oneline ro'yxatidan toping.

Javob

285ac84 Menyu: manti narxini qo'sh. Ro'yxatning birinchi qatori — HEAD (0), keyin HEAD~1, HEAD~2, HEAD~3, HEAD~4. Ya'ni tepadan beshinchi qator.

6. Filtrlar: kerakli commitni topish

Katta loyihada tarixda o'n minglab commit bo'ladi. O'qib chiqib bo'lmaydi — faqat filtrlab.

6.1 Muallif bo'yicha: --author

bash
git log --oneline --author="Malika"
text
884500c Bosh sahifa: logotip qo'sh
0993720 CSS: sarlavhalarga choyxona rangini ber

Jasur akaning ikkinchi savoliga javob. --author ism va email ichidan qidiradi, qisman moslik yetarli. Qiziq holat: --author="malika" (kichik harf bilan) ham xuddi shu ikki commitni topadi. Sababi — email malika@example.com kichik harfda. Katta-kichik harfga umuman qaramaslik uchun -i qo'shiladi.

6.2 Sana bo'yicha: --since va --until

bash
git log --oneline --since="2026-10-02 00:00" \
  --until="2026-10-02 23:59"
text
07b061d Menyu: lag'mon narxini qo'sh
bd98d1b Bron: rahmat sahifasini qo'sh

Faqat 2-oktabrdagi commitlar. --since — "shu paytdan keyin", --until — "shu paytgacha". Git tabiiy iboralarni ham tushunadi: --since="2 weeks ago" (ikki hafta oldin), --since=yesterday (kechadan beri). Ular bugungi sanaga nisbatan hisoblanadi, shuning uchun natija har kuni boshqacha.

Diqqat: Sanani vaqtsiz yozsangiz (--since="2026-10-03"), Git unga hozirgi soatni qo'shadi. Biz kechqurun, 18:00 dan keyin sinaganimizda, 3-oktabr ertalabki commitlar natijaga tushmadi. Kun boshidan kerak bo'lsa, vaqtni aniq yozing: "2026-10-03 00:00".

6.3 Xabar bo'yicha: --grep

bash
git log --oneline --grep="narx"
text
d023ae0 (HEAD -> main) Menyu: lag'mon narxini 30 000 so'mga ko'tar
285ac84 Menyu: manti narxini qo'sh
07b061d Menyu: lag'mon narxini qo'sh
f4238e7 Menyu: osh narxini qo'sh

--grep commit xabari ichidan qidiradi — Fayl va matn qidirish darsidagi grep kabi. Mana yaxshi xabarlarning yana bir foydasi: "fix", "asdf" kabi xabarlardan hech narsa topib bo'lmaydi. Xabarda emas, kodning o'zida so'z qidirish (log -S) Kod arxeologiyasi darsida.

6.4 Fayl bo'yicha: -- <yo'l>

bash
git log --oneline -- menyu/index.html
text
d023ae0 (HEAD -> main) Menyu: lag'mon narxini 30 000 so'mga ko'tar
e979a8e Menyu: sarlavhaga choyxona nomini qo'sh
285ac84 Menyu: manti narxini qo'sh
07b061d Menyu: lag'mon narxini qo'sh
f4238e7 Menyu: osh narxini qo'sh
dab5bff Bahor: sayt tuzilmasini yarat

Faqat menyu faylini o'zgartirgan commitlar — Jasur akaning uchinchi savoliga javob. Papka ham bo'ladi: git log --oneline -- bron.

Ikki chiziqcha -- Git'ga aytadi: "bundan keyin faqat fayl yo'llari, commit nomlari emas". Ko'pincha usiz ham ishlaydi (git log menyu/index.html). Lekin fayl endi mavjud bo'lmasa yoki nomi commit nomiga o'xshasa, -- majburiy — «Ko'p uchraydigan xatolar» bo'limida ko'rasiz.

6.5 Nomi o'zgargan fayl: --follow

Yaxshi commit darsida Git nom o'zgarishini alohida saqlamasligini, uni mazmun o'xshashligidan topishini ko'rgan edik. Buning tarixga ta'siri bor. Sinov nusxasida menyu faylini git mv bilan menyu/taomlar.html deb nomladik va commit qildik. Endi yangi nom bo'yicha tarix:

bash
git log --oneline -- menyu/taomlar.html
text
4517b93 (HEAD -> main) Menyu: faylni taomlar.html deb nomla

Faqat bitta commit! Git yangi nom bilan yashagan tarixni ko'rsatdi — ya'ni faqat nom o'zgargan paytdan boshlab. Eski nom ostidagi hamma o'zgarish ko'rinmay qoldi. --follow Git'ga "nom o'zgarishidan orqaga ham kuzat" deydi:

bash
git log --oneline --follow -- menyu/taomlar.html
text
4517b93 (HEAD -> main) Menyu: faylni taomlar.html deb nomla
d023ae0 Menyu: lag'mon narxini 30 000 so'mga ko'tar
e979a8e Menyu: sarlavhaga choyxona nomini qo'sh
285ac84 Menyu: manti narxini qo'sh
07b061d Menyu: lag'mon narxini qo'sh
f4238e7 Menyu: osh narxini qo'sh
dab5bff Bahor: sayt tuzilmasini yarat

Endi butun hayoti ko'rinadi. --follow faqat bitta fayl bilan ishlaydi, papka bilan emas. Nomi o'zgargan fayl tarixini qidirayotganda — doim --follow.

6.6 Filtrlarni birlashtirish

Filtrlarni bir buyruqda yozish mumkin — Git hammasiga mos keladigan commitlarni qoldiradi:

bash
git log --oneline --author="Malika" -- index.html
text
884500c Bosh sahifa: logotip qo'sh

"Malika bosh sahifada nima qilgan?" — bitta commit.

flowchart LR
  A["Hamma<br/>12 commit"] --> B["--author=Malika<br/>2 commit"]
  B --> C["-- index.html<br/>1 commit"]

Nimaga qarang: har filtr ro'yxatni toraytiradi, xuddi elakdan o'tkazgandek. Filtr qancha ko'p bo'lsa, natija shuncha aniq.

Tekshirib ko'ring: 4-oktabrdan beri Aziz faqat menyuda nima qilganini ko'rsatadigan buyruqni yozing.

Javob

git log --oneline --author="Aziz" --since="2026-10-04 00:00" -- menyu. Bizning tarixda natija bitta: d023ae0 Menyu: lag'mon narxini 30 000 so'mga ko'tar. Filtrlar tartibi muhim emas, faqat -- va yo'l oxirida turadi.

7. Kim qancha ishladi: git shortlog

bash
git shortlog -sn
text
    10	Aziz Karimov
     2	Malika Rahimova

shortlog commitlarni muallif bo'yicha guruhlaydi. -s — faqat sonini ko'rsat (summary), -n — ko'pidan kamiga tartibla. Flaglarsiz git shortlog har muallif ostida uning commit sarlavhalarini ro'yxat qiladi — haftalik hisobot uchun qulay.

Bitta ogohlantirish: commit soni ish hajmini o'lchamaydi. Bitta katta commit o'nta kichikdan qiyinroq bo'lishi mumkin. shortlog — "kim nima bilan shug'ullangan" degan savol uchun, reyting uchun emas.

8. Muallif va commit qiluvchi

Malikaning commitini batafsil ko'raylik. --format=fuller — eng to'liq ko'rinish:

bash
git log --format=fuller -1 HEAD~1
text
commit 884500cab40753bcf14b1b126b389d8a24c751c3
Author:     Malika Rahimova <malika@example.com>
AuthorDate: Sun Oct 4 10:30:00 2026 +0500
Commit:     Aziz Karimov <aziz@example.com>
CommitDate: Sun Oct 4 10:30:00 2026 +0500

    Bosh sahifa: logotip qo'sh

Ikki xil odam! Git har commitda ikki rolni saqlaydi:

  • Author (muallif) — o'zgarishni yozgan odam. Bu yerda — Malika.
  • Commit (commit qiluvchi, committer) — uni repoga yozgan odam. Bu yerda — Aziz.

Odatda ikkalasi bir xil — siz yozasiz, siz commit qilasiz. Farq jamoa ishida chiqadi: birovning o'zgarishini qo'llaganda, boshqa joyga ko'chirganda. Oddiy git log faqat muallifni ko'rsatadi, --author filtri ham muallif bo'yicha ishlaydi.

9. Qisqa nom: alias

git log --oneline --graph --all ni har kuni yozish uzun. Git'da o'z qisqa buyrug'ingizni yaratish mumkin — alias (taxallus):

bash
git config --global alias.lg "log --oneline --graph --all"
git lg -3
text
* d023ae0 (HEAD -> main) Menyu: lag'mon narxini 30 000 so'mga ko'tar
* 884500c Bosh sahifa: logotip qo'sh
* 0993720 CSS: sarlavhalarga choyxona rangini ber

Endi git lg = git log --oneline --graph --all, va unga qo'shimcha flag ham berish mumkin (-3). Alias global sozlama faylingizga yoziladi (Git'ni sozlash darsidagi --global). Alias'ni faqat buyruqni to'liq tushungandan keyin yarating — aks holda boshqa kompyuterda qisqa nom ishlamay qolganda qiynalasiz.

10. Ko'p uchraydigan xatolar

10.1 "git log'dan chiqa olmayapman"

Ekran pastida : yoki (END) turibdi va buyruq yozib bo'lmayapti. Bu sahifalagich — q bosing. Ctrl + C ba'zan ishlamaydi, q doim ishlaydi.

10.2 ambiguous argument

Fayl nomida xato:

bash
git log --oneline menu/index.html
text
fatal: ambiguous argument 'menu/index.html': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'

Tarjimasi: "halokatli xato: noaniq argument menu/index.html: noma'lum commit nomi yoki ishchi papkada bunday yo'l yo'q. Yo'llarni commit nomlaridan ajratish uchun -- ishlating".

Nega aynan shu so'zlar? -- siz Git har bir so'zni ikki xil tushunishi mumkin: commit nomi yoki fayl yo'li. menu/index.html na unisi, na bunisi. Git qaysi biri nazarda tutilganini bilmaydi — shuning uchun "noaniq". Tuzatish: nomni tekshiring (menyu, menu emas).

Xuddi shu xabar mavjud bo'lmagan commitda ham chiqadi. Tarixda 12 ta commit bor, biz esa git show HEAD~20 yozsak — yigirma qadam orqada commit yo'q.

10.3 O'chirilgan faylning tarixi

Fayl o'chirilgan bo'lsa, -- siz Git uni topolmaydi — ishchi papkada yo'q. -- bilan esa tarixini ko'rsatadi. Buni portfolio qadamida sinaysiz.

10.4 Flag nomida xato

text
fatal: unrecognized argument: --autor=Malika

Tarjimasi: "tanilmagan argument". --author da h tushib qolgan. Git bunday flagni bilmaydi.

10.5 Hali commit yo'q

Yangi, bo'sh repoda:

text
fatal: your current branch 'main' does not have any commits yet

Tarjimasi: "joriy main branch'ingizda hali birorta commit yo'q". Xato emas — tarix hali boshlanmagan. Birinchi commitdan keyin git log ishlaydi.

11. Mashqlar

1-mashq (oson): Tarixni o'qing

«Bahor» tarixiga (git log --oneline, «Qisqa ko'rinishlar» bo'limida) qarab javob bering:

  1. Eng birinchi commitning xabari nima?
  2. HEAD~3 qaysi commit?
  3. Rahmat sahifasi qaysi commitda qo'shilgan?

Ishora: ro'yxatda eng yangisi tepada; HEAD — birinchi qator.

Yechim
  1. Bahor: sayt tuzilmasini yarat — ro'yxatning eng pastida (dab5bff).
  2. e979a8e Menyu: sarlavhaga choyxona nomini qo'sh — tepadan to'rtinchi qator (HEAD, ~1, ~2, ~3).
  3. bd98d1b Bron: rahmat sahifasini qo'sh. Tekshirish: git show --stat bd98d1b — bron/rahmat.html ko'rinadi.

2-mashq (o'rta): Filtrni to'ldiring

Bo'sh joylarni to'ldiring.

«Bahor»da bron papkasini o'zgartirgan commitlar:

bash
git log --oneline  bron

Xabarida "Bron" so'zi bor commitlar:

bash
git log --oneline ="Bron"

Oxirgi commitda qaysi fayllar o'zgarganini ro'yxat qilib ko'rsatish:

bash
git show  HEAD

Ishora: «Filtrlar» bo'limidagi -- <yo'l> va --grep, «Nima o'zgardi» bo'limidagi --stat.

Yechim

--, --grep, --stat. Biz sinab ko'rdik: birinchisi uchta commit beradi:

text
e50f485 Bron: telefon raqamini qo'sh
bd98d1b Bron: rahmat sahifasini qo'sh
dab5bff Bahor: sayt tuzilmasini yarat

Uchinchisi — dab5bff — "Bron" so'zisiz, lekin bron/index.html aynan unda yaratilgan. Ikkinchi buyruq esa faqat xabarga qaraydi, shuning uchun dab5bff ni topmaydi. Fayl va xabar — ikki xil savol.

3-mashq (qiyin): Tergovchi

«Bahor» tarixida uchta savolga bittadan buyruq bilan javob toping:

  1. .DS_Store fayli qaysi commitda paydo bo'lgan va uning muallifi kim?
  2. 3-oktabrdan beri Aziz nechta commit qilgan?
  3. Lag'mon narxi qaysi commitlarda o'zgargan va oldin qancha edi?

Ishora: fayl bo'yicha filtr -1 bilan; sana va muallif birga; --grep yoki -p.

Yechim
  1. git log --oneline -1 -- assets/css/.DS_Store:
text
0993720 CSS: sarlavhalarga choyxona rangini ber

Muallifni ko'rish uchun -1 siz oddiy git log -1 -- assets/css/.DS_Store — Author: Malika Rahimova. Xabarda .DS_Store haqida hech narsa yo'q — u tasodifan tushgan. Commit xabari "CSS" deydi, --stat esa ikkinchi faylni ko'rsatadi. Xabar va mazmun mos emas (Yaxshi commit).

  1. git log --oneline --author="Aziz" --since="2026-10-03 00:00":
text
d023ae0 (HEAD -> main) Menyu: lag'mon narxini 30 000 so'mga ko'tar
e979a8e Menyu: sarlavhaga choyxona nomini qo'sh
285ac84 Menyu: manti narxini qo'sh
e50f485 Bron: telefon raqamini qo'sh

To'rtta. Sonini o'zi sanamaslik uchun natijani wc -l ga uzatish mumkin (Oqimlar va pipe).

  1. git log --oneline --grep="lag'mon" ikkita commit beradi: d023ae0 (narxni ko'tarish) va 07b061d (birinchi marta qo'shish). Oldingi narxni git show d023ae0 dagi - qatori aytadi: 28 000 so'm.

4-mashq: Portfolio qadami — o'z tarixingizni o'qing

  1. kurs/portfolio da git log --oneline va git log --stat ni ishga tushiring. Birinchi commitda nechta fayl bor?
  2. Oldingi darsda o'chirilgan asosiy-eski.css ning butun tarixini toping. Avval -- siz urinib ko'ring, keyin -- bilan.
  3. git show --stat HEAD bilan oxirgi commitni oching — tanasi ham ko'rinyaptimi?
  4. git shortlog -sn — hozircha bitta muallif.
  5. lg alias'ini yarating va git lg bilan tekshiring.
  6. Shu darsning 1–3-mashq javoblarini mashqlar/07/06-git-log/javoblar.md ga yozing va mashqlar reposida commit qiling: 07/06: git log mashqlari javoblarini qo'sh.
Yechim
bash
cd ~/kurs/portfolio
git log --oneline
git log --stat
git log --oneline asosiy-eski.css
git log --oneline -- asosiy-eski.css
git show --stat HEAD
git shortlog -sn
git config --global alias.lg "log --oneline --graph --all"
git lg

Biz qisqa portfolio nusxasida sinadik. Birinchi commitning --stat oxiri:

text
 sayt/loyihalar/index.html       | 1 +
 16 files changed, 16 insertions(+)

Sizda fayllar va qatorlar soni boshqacha bo'ladi. -- siz:

text
fatal: ambiguous argument 'asosiy-eski.css': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'

Fayl diskda yo'q — Git uni yo'l deb tanimadi. -- bilan:

text
6dbbf8c (HEAD -> main) CSS: eski zaxira nusxani o'chir
63190c1 Portfolio: 06-qism oxiridagi holat

Fayl tug'ilgan va o'chirilgan commitlar. Tarix o'chirilgan fayllarni ham eslaydi.

git show --stat HEAD da tana to'liq chiqadi (4 bo'sh joy surilgan), keyin asosiy-eski.css | 1 -. git shortlog -sn:

text
     2	Aziz Karimov

Sizda o'z ismingiz. git lg:

text
* 6dbbf8c (HEAD -> main) CSS: eski zaxira nusxani o'chir
* 63190c1 Portfolio: 06-qism oxiridagi holat

6-qadam — Yaxshi commit darsidagi kabi: mkdir -p 07/06-git-log, faylni VS Code'da yozish, git add 07 va commit. mashqlar da git log --oneline endi uchta commit ko'rsatadi.

12. Real ishda

  • Xatoni tekshirish. "Kecha ishlagan, bugun buzildi" — birinchi qadam: git log --since=yesterday --stat. Nima o'zgarganini ko'rgach, aybdor commitni topish oson.
  • Yangi jamoaga kirish. Yangi jamoaga kelganda loyihani git log --oneline --graph va git shortlog -sn bilan o'rganish — kim nima bilan shug'ullanishini tez tushunish yo'li.
  • VS Code va GitHub. VS Code'da Source Control panelining "Graph" bo'limi va fayl ustidagi "Timeline" — xuddi shu git log ning grafik ko'rinishi. GitHub'da har repoda "Commits" sahifasi bor. Ularning hammasi siz terminalda o'qigan ma'lumotni ko'rsatadi.
  • Reliz yozuvlari. git log --oneline v1.0..HEAD kabi buyruq "oxirgi relizdan beri nima qilindi" ro'yxatini beradi. .. belgisini O'zgarishlarni ko'rish darsida, relizlarni Tag darsida ko'rasiz.
  • Intervyuda: "Bitta faylning tarixini qanday ko'rasiz?", "HEAD~1 va HEAD^ farqi nima?" — ikkalasiga ham javob bera olasiz.

Xulosa

  • git log — tarix: SHA, muallif, sana, xabar; eng yangisi tepada; sahifalagichdan q bilan chiqiladi.
  • --oneline, -n, --graph, --format — ko'rinish; --stat va -p — nima o'zgargani.
  • git show <sha> — bitta commit; git show <sha>:<fayl> — faylning eski versiyasi.
  • HEAD~n — oxirgidan n qadam orqa; chiziqli tarixda HEAD^ = HEAD~1.
  • Filtrlar: --author, --since/--until (vaqti bilan), --grep, -- <yo'l>; birga yozilsa — hammasiga mos commitlar.
  • git shortlog -sn — mualliflar bo'yicha; author va committer har xil bo'lishi mumkin.

Keyingi dars: O'zgarishlarni ko'rish: git diff — commit qilishdan oldin "nima o'zgardi?" savoliga aniq javob olishni o'rganamiz.

Manbalar

  • Git hujjati: "git-log" (Commit Limiting, PRETTY FORMATS), "git-show", "git-shortlog", "gitrevisions" (~ va ^) — git-scm.com/docs
  • Pro Git kitobi: "Viewing the Commit History" — git-scm.com/book
Ulashish:Telegram'da

Izohlar (0)

Izoh yozish uchun kiring.

  • Hozircha izoh yo'q. Birinchi bo'ling!
Git log: tarixni o'qish, filtrlash va git show — IlmHamroh