IlmHamroh
JavaScript Full-stack/7-qism. Git va GitHub asoslari22/36-dars17 daqiqa
Mundarija (37)

Git tag va relizlar: versiyaga doimiy nom berish

Qisqacha: Tag (teg) — tarixdagi bitta commitga berilgan doimiy nom, masalan v1.0.0. Branch yangi commit bilan oldinga suriladi, tag esa joyidan qimirlamaydi. Relizlar uchun annotated tag ishlating: git tag -a v1.0.0 -m "izoh" — u kim, qachon va nega qo'yganini ham saqlaydi. Taglar git push bilan o'zi ketmaydi — ularni alohida yuborish kerak, GitHub esa ulardan reliz sahifasi yasaydi.

Bu darsda

  • Lightweight va annotated tag farqini .git ichida ko'rib tushuntira olasiz.
  • git tag -a -m bilan joriy va eski commitga tag qo'ya olasiz, ro'yxatini filtrlab, o'chira olasiz.
  • git describe natijasini (v1.1.0-1-g30abd8b) o'qiysiz.
  • Semantik versiya (MAJOR.MINOR.PATCH) bo'yicha keyingi raqamni tanlaysiz.
  • Taglarni yuborish yo'llari va GitHub Release nima ekanini bilasiz.

Oldin bilishingiz kerak: Branch nima: arzon ko'rsatkich, HEAD, refs va detached HEAD, Git ichkaridan: obyektlar, SHA va snapshot.

1. Nega bu kerak?

Oldingi darsda bitta tuzatishni main ga ko'chirdik va «Bahor» sayti tayyor bo'ldi. Jasur aka saytni mehmonlarga ochdi.

Bir oydan keyin u so'raydi: "Sayt ochilgan kundagi holatini ko'rsata olasizmi? O'shanda menyuda nima bor edi?" Aziz git log ni ochadi va 40 ta commit ichidan qidiradi. "Bosh sahifa: ish vaqtini qo'sh"mi? Yoki undan keyingisimi? SHA'larni hech kim yodlamaydi.

Hayotda ham muhim kunlarni belgilab qo'yamiz. Choyxonaning ochilish kuni devordagi taqvimda doira ichiga olingan. Kitobning birinchi nashri muqovasida "1-nashr" deb yoziladi, ikkinchisida — "2-nashr, to'ldirilgan". Keyingi nashrlar chiqsa ham, birinchisi o'z nomi bilan qoladi.

Tag (tag) — Git'dagi o'sha belgi: tarixdagi bitta commitga berilgan, o'zgarmaydigan nom. O'zbekcha "teg" ham deyiladi, kursda tag deb yozamiz. HTML'dagi teg (<h1>) bilan adashtirmang — nomi o'xshash, ma'nosi boshqa.

Taglar asosan reliz (release) uchun ishlatiladi. Reliz — dasturning foydalanuvchilarga chiqarilgan, raqamlangan versiyasi: v1.0.0, v1.1.0.

2. Tag va branch: farqi nimada?

Branch nima darsida branchni "commitga yopishtirilgan yorliq" deb tanishtirgan edik. Tag ham yorliq. Farqi bitta, lekin muhim:

Branch Tag
Yangi commit qilinganda oldinga suriladi joyida qoladi
Nima uchun ish davom etayotgan chiziq tarixdagi bitta nuqta
Joyi .git/refs/heads/ .git/refs/tags/
gitGraph
  commit id: "dab5bff" tag: "v0.1.0"
  commit id: "f4238e7"
  commit id: "9084599"
  commit id: "b09fa2a"
  commit id: "bd98d1b"
  commit id: "07b061d"
  commit id: "a579eaa" tag: "v1.0.0"
  commit id: "923b91e"
  commit id: "6adc4cc" tag: "v1.1.0"
  commit id: "30abd8b"

Nimaga qarang: main eng oxirgi commitda turibdi va har yangi commit bilan yuradi. Taglar esa tarixdagi "bayroqchalar" — o'z commitlariga mahkam qoqilgan. Bu dars oxirida «Bahor» tarixi aynan shunday ko'rinadi.

3. Lightweight tag — oddiy yorliq

3.1 Yaratish

«Bahor» tarixi hozir shunday:

bash
git log --oneline
text
a579eaa (HEAD -> main) Bosh sahifa: ish vaqtini 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

Sizning tarixingizda oldingi darslarning commitlari ham bor, SHA'lar boshqacha. Mazmuni muhim: oxirgi commit — sayt ochilgan holat.

Eng oddiy tag — faqat nom:

bash
git tag v1.0.0
git tag
text
v1.0.0

Birinchi buyruq hech narsa chiqarmadi — Git'da jimlik "muvaffaqiyat" degani. git tag argumentsiz esa barcha taglar ro'yxatini chiqaradi.

3.2 Ichkarida nima?

HEAD va refs darsida branch fayli ichida bitta SHA yozilganini ko'rgan edik. Tag ham shunday:

bash
cat .git/refs/tags/v1.0.0
git rev-parse HEAD
text
a579eaa756188d6455e4dcc3cbeb978c5e8b2d83
a579eaa756188d6455e4dcc3cbeb978c5e8b2d83

Tag fayli ichida — commitning to'liq SHA'si, boshqa hech narsa. Obyekt turini tekshiramiz (Git ichkaridan darsidagi cat-file):

bash
git cat-file -t v1.0.0
text
commit

Tag to'g'ridan-to'g'ri commitni ko'rsatyapti. Shuning uchun uni lightweight tag ("yengil tag") deyishadi: bu shunchaki commitga yopishtirilgan nom. Kim qo'ygani, qachon va nima uchun — hech qayerda yozilmagan.

4. Annotated tag — to'liq ma'lumotli tag

4.1 Yaratish

Relizlar uchun bu yetarli emas. Keyin kimdir "bu versiyani kim va nega chiqargan?" deb so'raydi. Yengil tagni o'chirib, to'liq ma'lumotli tag qo'yamiz:

bash
git tag -d v1.0.0
git tag -a v1.0.0 -m "Bahor sayti ochildi"
text
Deleted tag 'v1.0.0' (was a579eaa)

-d (delete) — tagni o'chiradi. Git qaysi commitda turganini ham aytadi — adashib o'chirsangiz, shu SHA bilan qaytarasiz. -a (annotated) — "izohli tag yarat". -m — commitdagidek xabar. -m siz yozsangiz, Git xabar uchun muharrirni ochadi.

4.2 Ichkarida nima?

bash
git cat-file -t v1.0.0
git cat-file -p v1.0.0
text
tag
object a579eaa756188d6455e4dcc3cbeb978c5e8b2d83
type commit
tag v1.0.0
tagger Aziz Karimov <aziz@example.com> 1791347400 +0500

Bahor sayti ochildi

Endi tur — tag! Git ichkaridan darsida to'rt xil obyekt ko'rgan edik: blob, tree, commit va annotated tag. Mana to'rtinchisi. U alohida obyekt bo'lib, .git/objects ichida saqlanadi va o'z SHA'si bor. Ichida:

  • object — qaysi commitga qo'yilgan.
  • type commit — o'sha obyekt turi.
  • tag v1.0.0 — nomi.
  • tagger — kim qo'ygani. Katta son — vaqt, 1970-yildan beri o'tgan soniyalarda (Unix vaqti), yonida vaqt mintaqasi.
  • Bo'sh qatordan keyin — xabar.

git show buni o'qishga qulay shaklda ko'rsatadi:

bash
git show v1.0.0 --stat
text
tag v1.0.0
Tagger: Aziz Karimov <aziz@example.com>
Date:   Wed Oct 7 09:30:00 2026 +0500

Bahor sayti ochildi

commit a579eaa756188d6455e4dcc3cbeb978c5e8b2d83 (HEAD -> main, tag: v1.0.0)
Author: Aziz Karimov <aziz@example.com>
Date:   Wed Oct 7 09:00:00 2026 +0500

    Bosh sahifa: ish vaqtini qo'sh

 index.html | 1 +
 1 file changed, 1 insertion(+)

Avval tag haqida ma'lumot (kim, qachon, nega), keyin u ko'rsatgan commit. Yengil tagda birinchi qism umuman yo'q edi — git show to'g'ridan-to'g'ri commitdan boshlangan edi.

Taglarni xabarlari bilan ko'rish uchun -n:

bash
git tag -n
text
v1.0.0          Bahor sayti ochildi

4.3 Qaysi birini tanlash kerak?

Lightweight Annotated
Buyruq git tag v1.0.0 git tag -a v1.0.0 -m "..."
Kim, qachon, xabar yo'q bor
git describe ko'radimi faqat --tags bilan ha
Qachon shaxsiy, vaqtinchalik belgi reliz, umumiy versiya

Git hujjatining o'zi shunday tavsiya qiladi: annotated tag — reliz uchun, lightweight — shaxsiy yoki vaqtinchalik belgilar uchun. Kursda relizlarni doim -a bilan qo'yamiz.

Tekshirib ko'ring: Bitta commitga lightweight v1 va annotated v2 tag qo'yildi. git cat-file -t v1 va git cat-file -t v2 nima chiqaradi?

Javob

commit va tag. Lightweight tag to'g'ridan-to'g'ri commitni ko'rsatadi. Annotated tag esa alohida tag obyekti; u o'z navbatida commitni ko'rsatadi.

5. Eski commitga tag qo'yish

Tagni faqat oxirgi commitga emas, istalgan commitga qo'yish mumkin — nomdan keyin SHA yoziladi. Aziz saytning birinchi tuzilmasini ham belgilamoqchi:

bash
git tag -a v0.1.0 dab5bff -m "Birinchi tuzilma"
git log --oneline --decorate
text
a579eaa (HEAD -> main, tag: v1.0.0) Bosh sahifa: ish vaqtini 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 (tag: v0.1.0) Bahor: sayt tuzilmasini yarat

--decorate qavs ichida yorliqlarni ko'rsatadi: branch (main), HEAD va tag:. Terminalda Git ularni --decorate siz ham ko'rsatadi, biz flagni aniqlik uchun yozdik.

Bu relizlarni unutib qo'yganda juda foydali. Loyiha uch oy tagsiz yashagan bo'lsa ham, tarixdan kerakli commitlarni topib, orqaga qarab belgilab chiqish mumkin.

6. Semantik versiya: qaysi raqam?

6.1 MAJOR.MINOR.PATCH

v1.0.0 dagi uch raqam tasodifiy emas. Dunyodagi ko'p loyihalar semantik versiyalash (Semantic Versioning, SemVer) qoidasiga amal qiladi (semver.org). Versiya uch qismdan iborat:

Qism Qachon oshadi Misol
MAJOR (katta) eski bilan mos kelmaydigan o'zgarish 1.4.2 → 2.0.0
MINOR (kichik) yangi imkoniyat, eskisi buzilmaydi 1.4.2 → 1.5.0
PATCH (tuzatish) faqat xato tuzatildi 1.4.2 → 1.4.3

Katta raqam oshsa, kichiklari nolga tushadi. 0.x.y — "hali tayyor emas, hamma narsa o'zgarishi mumkin" degan boshlang'ich bosqich. Oldidagi v harfi SemVer'ning qismi emas, lekin Git taglarida shunday yozish odat bo'lib ketgan.

Hozircha SemVer siz uchun reliz raqamini tanlash qoidasi. Keyinroq Semver va versiya diapazonlari darsida ishlaganda u juda muhim bo'ladi: package.json dagi ^1.4.2 belgisi aynan shu qoidaga tayanadi.

6.2 «Bahor» relizlari

Aziz menyuga manti va chuchvara qo'shdi. Bu — yangi imkoniyat, hech narsa buzilmadi. Demak, MINOR: v1.1.0.

bash
git tag -a v1.1.0 -m "Menyuga yangi taomlar"

Keyin chuchvara narxi xato ekani ma'lum bo'ldi va tuzatildi. Bu PATCH bo'ladi — v1.1.1. Uni mashqda o'zingiz qo'yasiz.

Tekshirib ko'ring: Hozirgi versiya v2.3.1. Saytga yangi "Bron bekor qilish" sahifasi qo'shildi, eski sahifalarning hech biri o'zgarmadi. Keyingi versiya qaysi?

Javob

v2.4.0. Yangi imkoniyat — MINOR oshadi, PATCH nolga tushadi. MAJOR o'zgarmaydi, chunki hech narsa buzilmadi.

7. git describe — "men qaysi versiyadaman?"

7.1 Natijani o'qish

Tag qo'yilgandan keyin ham ish davom etadi. "Hozirgi kod qaysi relizga yaqin?" degan savolga git describe javob beradi. v1.1.0 qo'yilishidan oldin, ikkita menyu commitidan keyin shunday edi:

bash
git describe
text
v1.0.0-2-g6adc4cc

Bo'laklaymiz:

  • v1.0.0 — eng yaqin annotated tag.
  • 2 — undan keyin 2 ta commit bor.
  • g — "git" harfi (SHA'dan oldin qo'yiladi).
  • 6adc4cc — joriy commitning qisqa SHA'si.

Ya'ni: "v1.0.0 dan 2 commit keyin, aniq commit — 6adc4cc". Tag qo'yilgan commitning o'zida esa faqat tag nomi chiqadi. v1.1.0 qo'yilgach, keyin narx tuzatilgach:

text
v1.1.0
v1.1.0-1-g30abd8b

Faqat tag nomi kerak bo'lsa — --abbrev=0:

bash
git describe --abbrev=0
text
v1.1.0

describe qulay versiya nomi beradi. Uni sayt pastiga "versiya: v1.1.0-1-g30abd8b" deb yozishadi yoki xato hisobotiga qo'shishadi — kod aynan qaysi holatda ekanini darhol ko'rish uchun.

7.2 describe yengil taglarni ko'rmaydi

Aziz tajriba uchun sinov degan yengil tag qo'ydi:

bash
git tag sinov
git describe
git describe --tags
text
v1.1.0-1-g30abd8b
sinov

Oddiy describe yengil tagga e'tibor bermadi — u hali ham v1.1.0 ni ko'rsatyapti. --tags bilan esa sinov ni topdi. Bu yengil taglarni "shaxsiy" deyishimizning yana bir sababi: ular relizlar hisobiga aralashmaydi. sinov ni o'chirib qo'yamiz: git tag -d sinov.

8. Taglar bilan ishlash

8.1 Filtr va tartiblash

Taglar ko'payganda ro'yxatni filtrlash kerak. -l (list) bilan shablon beriladi — * "istalgan belgilar" (Fayl qidirish darsidagi kabi). Sinash uchun uchta qo'shimcha tag qo'ydik:

bash
git tag -l "v1.*"
text
v1.0.0
v1.1.0
v1.10.0
v1.2.0
v1.9.0

Tartibga qarang: v1.10.0 v1.2.0 dan oldin! Git nomlarni alifbo bo'yicha, harfma-harf solishtiradi: 1 belgisi 2 dan oldin keladi. Versiyalar uchun maxsus tartiblash bor:

bash
git tag -l "v1.*" --sort=-v:refname
text
v1.10.0
v1.9.0
v1.2.0
v1.1.0
v1.0.0

v:refname — "nomni versiya sifatida solishtir", - — teskari tartibda (eng yangisi tepada). Endi 1.10 1.9 dan katta — to'g'ri.

8.2 Tagdagi holatni ko'rish

"Sayt ochilgan kunda menyu qanday edi?" — Jasur akaning savoliga endi javob bera olamiz. Tagga o'tishga urinamiz:

bash
git switch v1.0.0
text
fatal: a branch is expected, got tag 'v1.0.0'
hint: If you want to detach HEAD at the commit, try again with the --detach option.

Tarjimasi: "branch kutilgan edi, tag berildi. HEAD'ni commitga ajratmoqchi bo'lsangiz, --detach bilan qayta urinib ko'ring." switch faqat branchlar uchun. Tag o'zgarmas — unda commit qila olmaysiz. Shuning uchun Git detached HEAD holatini ongli ravishda so'rashingizni talab qiladi:

bash
git switch --detach v1.0.0
cat menyu/index.html
git switch main
text
HEAD is now at a579eaa Bosh sahifa: ish vaqtini qo'sh
<h1>Menyu</h1>
<p>Osh — 35 000 so'm</p>
<p>Lag'mon — 28 000 so'm</p>
Previous HEAD position was a579eaa Bosh sahifa: ish vaqtini qo'sh
Switched to branch 'main'

Sayt ochilganda menyuda faqat osh va lag'mon bor edi. Tekshirdik va main ga qaytdik.

Ko'pincha ko'chish ham shart emas. Taglar SHA o'rnida ishlaydi — ikki versiyani to'g'ridan-to'g'ri solishtirish mumkin:

bash
git diff v1.0.0 v1.1.0 --stat
git log --oneline v1.0.0..v1.1.0
text
 menyu/index.html | 2 ++
 1 file changed, 2 insertions(+)
6adc4cc (tag: v1.1.0) Menyu: chuchvara narxini qo'sh
923b91e Menyu: manti narxini qo'sh

"v1.1.0 da nima yangi?" — ikki commit, bitta fayl. Aynan shu ro'yxat keyin reliz izohiga yoziladi.

9. Taglarni yuborish va GitHub Release

9.1 Taglar o'zi ketmaydi

Keyingi darslarda repongizni GitHub'ga ulab, git push bilan commitlarni yuborishni o'rganasiz (Remote: clone, fetch, pull, push). Hozir bitta muhim faktni bilib qo'ying: oddiy git push taglarni yubormaydi. Taglar faqat sizning kompyuteringizda qolib ketadi. Ularni alohida yuborish kerak:

bash
git push origin v1.1.0
git push origin --tags
git push --follow-tags
  • Birinchisi — bitta aniq tagni yuboradi.
  • Ikkinchisi — barcha taglarni, shu jumladan sinov kabi shaxsiy yengil taglarni ham.
  • Uchinchisi — commitlar bilan birga ularga tegishli annotated taglarni. Yengil taglar ketmaydi.

origin — GitHub'dagi repoga lokal nom. Uni Remote darsida tanishtiramiz. Bu buyruqlarning haqiqiy chiqishini o'sha darslarda ko'rasiz — hozir faqat eslab qoling.

Uchinchi yo'l eng xavfsizi. Uni doimiy qilish uchun sozlama bor:

bash
git config --global push.followTags true

Shundan keyin oddiy git push ham annotated taglarni o'zi olib ketadi.

Diqqat: Yuborilgan tagni qayta ishlatmang. Kimdir v1.1.0 ni allaqachon yuklab olgan bo'lsa, siz uni boshqa commitga ko'chirsangiz, ikkita har xil v1.1.0 paydo bo'ladi. Git hujjati buni alohida ogohlantiradi. Relizda xato topilsa — tuzating va yangi raqam qo'ying: v1.1.1.

9.2 GitHub Release

GitHub taglardan reliz sahifasi yasay oladi. docs.github.com bo'yicha: reliz Git tagiga asoslanadi va GitHub unga repo mazmunining zip va tar.gz arxivlarini avtomatik qo'shadi — tag yaratilgan paytdagi holatda. Relizni yozish ruxsati bor odamlar boshqaradi.

Reliz yaratish tartibi (docs.github.com, 2026-yil sentyabr holati):

  1. Repo bosh sahifasida, fayllar ro'yxatining o'ng tomonidagi Releases ni bosasiz.
  2. Tepada Draft a new release.
  3. Choose a tag ro'yxatidan mavjud tagni tanlaysiz (yoki yangi versiya raqamini yozib, Create new tag).
  4. Release title — sarlavha, Describe this release — izoh. Generate release notes tugmasi izohni commitlar va PR'lardan avtomatik tuzib beradi.
  5. Kerak bo'lsa fayllar (masalan, tayyor arxiv) yuklanadi, beqaror versiya uchun This is a pre-release belgilanadi.
  6. Publish release — e'lon qilish, yoki Save draft — qoralama sifatida saqlash.

Buni amalda GitHub asoslari darsidan keyin, o'z reponigizda qilasiz.

10. Ko'p uchraydigan xatolar

10.1 Tag allaqachon bor

bash
git tag -a v1.1.0 -m "Qayta"
text
fatal: tag 'v1.1.0' already exists

Tarjimasi: "v1.1.0 tagi allaqachon mavjud". Bitta nom — bitta tag. Tag hali hech qayerga yuborilmagan bo'lsa, git tag -d v1.1.0 bilan o'chirib, qayta qo'yish mumkin. Yuborilgan bo'lsa — yangi raqam (yuqoridagi "Diqqat" blokini eslang).

10.2 Noto'g'ri SHA

bash
git tag v2.0.0 abc1234
text
fatal: Failed to resolve 'abc1234' as a valid ref.

Tarjimasi: "abc1234 ni haqiqiy havola sifatida aniqlab bo'lmadi". Bunday commit yo'q. SHA'ni git log --oneline dan nusxalang.

10.3 Nomda bo'sh joy

bash
git tag "v1 yangi"
text
fatal: 'v1 yangi' is not a valid tag name.

Tarjimasi: "v1 yangi — yaroqsiz tag nomi". Tag nomida bo'sh joy, ~, ^, : kabi belgilar bo'lmaydi — ular Git buyruqlarida maxsus ma'noga ega (Tarixni o'qish darsidagi HEAD~2, HEAD^). Branch nomlari uchun ham xuddi shu qoida.

10.4 Mavjud bo'lmagan tagni o'chirish

bash
git tag -d v9.9.9
text
error: tag 'v9.9.9' not found.

Oddiy yozuv xatosi — git tag bilan ro'yxatni tekshiring.

10.5 describe hech narsa topmadi

Yangi, tagsiz repoda:

text
fatal: No names found, cannot describe anything.

Tarjimasi: "hech qanday nom topilmadi, tasvirlab bo'lmaydi". Faqat yengil tag qo'yilgan repoda esa xabar boshqacha — va ichida maslahat bor:

text
fatal: No annotated tags can describe '418f3b0805c325ac8ed41fadac95ba800600a1a6'.
However, there were unannotated tags: try --tags.

Tarjimasi: "hech bir annotated tag bu commitni tasvirlay olmaydi. Lekin izohsiz taglar bor: --tags ni sinab ko'ring."

11. Mashqlar

1-mashq (oson): Versiya raqami

Joriy versiya v1.4.2. Har o'zgarishdan keyin qaysi raqam bo'ladi (har biri v1.4.2 dan)?

  1. Bron formasidagi telefon maydoni ishlamayotgan edi — tuzatildi.
  2. Saytga ingliz tilidagi sahifalar qo'shildi.
  3. Barcha manzillar o'zgardi: /menyu/ endi /taomlar/ — eski havolalar ishlamaydi.
Yechim
  1. v1.4.3 — faqat xato tuzatildi, PATCH.
  2. v1.5.0 — yangi imkoniyat, MINOR; PATCH nolga tushadi.
  3. v2.0.0 — eski havolalar buzildi, MAJOR; qolganlari nolga tushadi.

2-mashq (o'rta): Bo'sh joylarni to'ldiring

«Bahor»da chuchvara narxi tuzatildi. Shu commitga PATCH relizi uchun izohli tag qo'ying va tekshiring:

bash
git tag  v1.1.1 -m "Chuchvara narxi tuzatildi"
git tag -n
git 

Ishora: izohli tag flagi — «Annotated tag» bo'limida; "men qaysi versiyadaman?" savoliga javob beradigan buyruq — describe bo'limida.

Yechim
bash
git tag -a v1.1.1 -m "Chuchvara narxi tuzatildi"
git tag -n
git describe

git describe endi faqat v1.1.1 ni chiqaradi — tag aynan joriy commitda turibdi. git tag -n ro'yxatida uchala reliz xabari bilan ko'rinadi.

3-mashq (qiyin): Taglar tartibsizligi

Stajyor Sardor shunday qildi:

bash
git tag v2.0
git tag v2.0.1-tuzatish abc1234
git tag -a "v2.1 yangi" -m "Yangi versiya"
git describe
git push
  1. Qaysi buyruqlar xato beradi va nega?
  2. Qaysi tag reliz uchun noto'g'ri tanlangan (xato bermasa ham)?
  3. git describe v2.0 ni ko'rsatadimi?
  4. git push dan keyin taglar GitHub'ga ketadimi? Qanday tuzatiladi?

Ishora: «Ko'p uchraydigan xatolar» (nomdagi bo'sh joy, noto'g'ri SHA), lightweight va annotated taqqoslash jadvali va «Taglar o'zi ketmaydi» bo'limi.

Yechim
  1. Ikkinchisi — abc1234 bunday commit yo'q bo'lsa, Failed to resolve 'abc1234' as a valid ref. Uchinchisi — nomda bo'sh joy: is not a valid tag name.
  2. v2.0 — yengil tag, relizga izoh va muallif yozilmagan. Bundan tashqari, SemVer uchta raqam talab qiladi: v2.0.0.
  3. Yo'q. Oddiy describe faqat annotated taglarni ko'radi. Boshqa annotated tag bo'lmasa, No annotated tags can describe ... xatosi chiqadi; --tags bilan esa v2.0 ni topadi.
  4. Yo'q — oddiy git push taglarni yubormaydi. To'g'ri yo'l: git tag -d v2.0, keyin git tag -a v2.0.0 -m "..." va git push --follow-tags (yoki push.followTags sozlamasi).

4-mashq: Portfolio qadami — portfolio'ning birinchi relizi

Portfolio'ingizning birinchi commiti — 06-qism oxiridagi holat — aslida sizning v1 versiyangiz: HTML va CSS bilan qurilgan to'liq sayt. Unga tag qo'yamiz.

  1. git log --oneline bilan birinchi commit SHA'sini toping.
  2. Unga v1.0.0 annotated tagini qo'ying. Xabar: Portfolio v1: HTML va CSS.
  3. git tag -n va git describe bilan tekshiring. describe natijasini o'qing: tagdan keyin nechta commit bor?

Tagni hozircha faqat lokal qo'yamiz. GitHub'ga u portfolio GitHub bilan bog'langanda (Remote: clone, fetch, pull, push) yuboriladi.

Yechim
bash
cd ~/kurs/portfolio
git log --oneline
git tag -a v1.0.0 63190c1 -m "Portfolio v1: HTML va CSS"
git tag -n
git describe

63190c1 o'rniga o'z birinchi commitingizning SHA'sini yozing. Biz qisqa portfolio nusxasida sinadik:

text
1aaefc2 (HEAD -> main) Bosh sahifa: footer qo'sh
63190c1 Portfolio: 06-qism oxiridagi holat
v1.0.0          Portfolio v1: HTML va CSS
v1.0.0-1-g1aaefc2

v1.0.0-1-... — tagdan keyin 1 commit. Sizda son kattaroq bo'ladi — oldingi darslardagi portfolio commitlari ham shu yerda sanaladi. JavaScript qo'shilgan portfolio (09-qism) — yaxshi v2.0.0 nomzodi bo'ladi.

12. Real ishda

  • Har bir kutubxona relizni tag bilan belgilaydi. npm'dagi paket versiyasi, GitHub'dagi Releases ro'yxati — hammasi taglarga tayanadi.
  • Avtomatik deploy. Ko'p jamoalarda v* shaklidagi tag yuborilishi GitHub Actions'da reliz jarayonini ishga tushiradi: sayt yig'iladi va serverga chiqadi. Actions bilan keyinroq tanishasiz.
  • Changelog — versiyalar orasidagi o'zgarishlar ro'yxati. git log --oneline v1.0.0..v1.1.0 uning xom manbai. Ba'zi jamoalar commit xabarlarini qat'iy shablonda yozadi (masalan, Conventional Commits — feat: ..., fix: ...), shunda maxsus vositalar changelog'ni o'zi tuzib beradi. Bu vositalarni hozir bilish shart emas.
  • Intervyuda: "lightweight va annotated tag farqi?", "git push taglarni yuboradimi?", "SemVer'da 2.3.1 → qaysi raqam?" — tez-tez beriladigan savollar.

Xulosa

  • Tag — commitga doimiy nom; branchdan farqli, yangi commit bilan joyidan qimirlamaydi.
  • Lightweight tag — faqat nom; annotated tag (-a -m) — kim, qachon, nega bilan alohida obyekt. Relizga — annotated.
  • git tag <nom> <sha> — eski commitga; -l "v1.*" --sort=-v:refname — filtr va versiya tartibi; -d — o'chirish.
  • git describe → v1.1.0-1-g30abd8b: eng yaqin tag, undan keyingi commitlar soni, joriy SHA.
  • SemVer: MAJOR.MINOR.PATCH — buzuvchi o'zgarish, yangi imkoniyat, tuzatish.
  • git push taglarni yubormaydi: --follow-tags yoki aniq tag nomi; GitHub Release taglarga asoslanadi.

Keyingi dars: Reflog va "Git favqulodda yordam" retseptlari — "hammasi yo'qoldi!" degan paytlarda commitlarni qanday qaytarishni o'rganamiz.

Manbalar

  • Git hujjati: "git-tag", "git-describe" — git-scm.com/docs
  • Pro Git kitobi: "Git Basics — Tagging" — git-scm.com/book
  • Semantic Versioning 2.0.0 — semver.org
  • GitHub Docs: "About releases", "Managing releases in a repository" — docs.github.com
Ulashish:Telegram'da

Izohlar (0)

Izoh yozish uchun kiring.

  • Hozircha izoh yo'q. Birinchi bo'ling!
Git tag va relizlar: versiyaga doimiy nom berish — IlmHamroh