Mundarija (37)
- Bu darsda
- 1. Nega bu kerak?
- 2. Tag va branch: farqi nimada?
- 3. Lightweight tag — oddiy yorliq
- 3.1 Yaratish
- 3.2 Ichkarida nima?
- 4. Annotated tag — to'liq ma'lumotli tag
- 4.1 Yaratish
- 4.2 Ichkarida nima?
- 4.3 Qaysi birini tanlash kerak?
- 5. Eski commitga tag qo'yish
- 6. Semantik versiya: qaysi raqam?
- 6.1 MAJOR.MINOR.PATCH
- 6.2 «Bahor» relizlari
- 7. git describe — "men qaysi versiyadaman?"
- 7.1 Natijani o'qish
- 7.2 describe yengil taglarni ko'rmaydi
- 8. Taglar bilan ishlash
- 8.1 Filtr va tartiblash
- 8.2 Tagdagi holatni ko'rish
- 9. Taglarni yuborish va GitHub Release
- 9.1 Taglar o'zi ketmaydi
- 9.2 GitHub Release
- 10. Ko'p uchraydigan xatolar
- 10.1 Tag allaqachon bor
- 10.2 Noto'g'ri SHA
- 10.3 Nomda bo'sh joy
- 10.4 Mavjud bo'lmagan tagni o'chirish
- 10.5 describe hech narsa topmadi
- 11. Mashqlar
- 1-mashq (oson): Versiya raqami
- 2-mashq (o'rta): Bo'sh joylarni to'ldiring
- 3-mashq (qiyin): Taglar tartibsizligi
- 4-mashq: Portfolio qadami — portfolio'ning birinchi relizi
- 12. Real ishda
- Xulosa
- Manbalar
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. Taglargit pushbilan o'zi ketmaydi — ularni alohida yuborish kerak, GitHub esa ulardan reliz sahifasi yasaydi.
Bu darsda
- Lightweight va annotated tag farqini
.gitichida ko'rib tushuntira olasiz. git tag -a -mbilan joriy va eski commitga tag qo'ya olasiz, ro'yxatini filtrlab, o'chira olasiz.git describenatijasini (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:
git log --onelinea579eaa (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 yaratSizning tarixingizda oldingi darslarning commitlari ham bor, SHA'lar boshqacha. Mazmuni muhim: oxirgi commit — sayt ochilgan holat.
Eng oddiy tag — faqat nom:
git tag v1.0.0
git tagv1.0.0Birinchi 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:
cat .git/refs/tags/v1.0.0
git rev-parse HEADa579eaa756188d6455e4dcc3cbeb978c5e8b2d83
a579eaa756188d6455e4dcc3cbeb978c5e8b2d83Tag fayli ichida — commitning to'liq SHA'si, boshqa hech narsa. Obyekt turini tekshiramiz (Git ichkaridan darsidagi cat-file):
git cat-file -t v1.0.0commitTag 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:
git tag -d v1.0.0
git tag -a v1.0.0 -m "Bahor sayti ochildi"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?
git cat-file -t v1.0.0
git cat-file -p v1.0.0tag
object a579eaa756188d6455e4dcc3cbeb978c5e8b2d83
type commit
tag v1.0.0
tagger Aziz Karimov <aziz@example.com> 1791347400 +0500
Bahor sayti ochildiEndi 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:
git show v1.0.0 --stattag 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:
git tag -nv1.0.0 Bahor sayti ochildi4.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
v1va annotatedv2tag qo'yildi.git cat-file -t v1vagit cat-file -t v2nima 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:
git tag -a v0.1.0 dab5bff -m "Birinchi tuzilma"
git log --oneline --decoratea579eaa (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.
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:
git describev1.0.0-2-g6adc4ccBo'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:
v1.1.0
v1.1.0-1-g30abd8bFaqat tag nomi kerak bo'lsa — --abbrev=0:
git describe --abbrev=0v1.1.0describe 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:
git tag sinov
git describe
git describe --tagsv1.1.0-1-g30abd8b
sinovOddiy 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:
git tag -l "v1.*"v1.0.0
v1.1.0
v1.10.0
v1.2.0
v1.9.0Tartibga 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:
git tag -l "v1.*" --sort=-v:refnamev1.10.0
v1.9.0
v1.2.0
v1.1.0
v1.0.0v: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:
git switch v1.0.0fatal: 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:
git switch --detach v1.0.0
cat menyu/index.html
git switch mainHEAD 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:
git diff v1.0.0 v1.1.0 --stat
git log --oneline v1.0.0..v1.1.0 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:
git push origin v1.1.0
git push origin --tags
git push --follow-tags- Birinchisi — bitta aniq tagni yuboradi.
- Ikkinchisi — barcha taglarni, shu jumladan
sinovkabi 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:
git config --global push.followTags trueShundan keyin oddiy git push ham annotated taglarni o'zi olib ketadi.
Diqqat: Yuborilgan tagni qayta ishlatmang. Kimdir
v1.1.0ni allaqachon yuklab olgan bo'lsa, siz uni boshqa commitga ko'chirsangiz, ikkita har xilv1.1.0paydo 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):
- Repo bosh sahifasida, fayllar ro'yxatining o'ng tomonidagi Releases ni bosasiz.
- Tepada Draft a new release.
- Choose a tag ro'yxatidan mavjud tagni tanlaysiz (yoki yangi versiya raqamini yozib, Create new tag).
- Release title — sarlavha, Describe this release — izoh. Generate release notes tugmasi izohni commitlar va PR'lardan avtomatik tuzib beradi.
- Kerak bo'lsa fayllar (masalan, tayyor arxiv) yuklanadi, beqaror versiya uchun This is a pre-release belgilanadi.
- 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
git tag -a v1.1.0 -m "Qayta"fatal: tag 'v1.1.0' already existsTarjimasi: "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
git tag v2.0.0 abc1234fatal: 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
git tag "v1 yangi"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
git tag -d v9.9.9error: tag 'v9.9.9' not found.Oddiy yozuv xatosi — git tag bilan ro'yxatni tekshiring.
10.5 describe hech narsa topmadi
Yangi, tagsiz repoda:
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:
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)?
- Bron formasidagi telefon maydoni ishlamayotgan edi — tuzatildi.
- Saytga ingliz tilidagi sahifalar qo'shildi.
- Barcha manzillar o'zgardi:
/menyu/endi/taomlar/— eski havolalar ishlamaydi.
Yechim
v1.4.3— faqat xato tuzatildi, PATCH.v1.5.0— yangi imkoniyat, MINOR; PATCH nolga tushadi.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:
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
git tag -a v1.1.1 -m "Chuchvara narxi tuzatildi"
git tag -n
git describegit 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:
git tag v2.0
git tag v2.0.1-tuzatish abc1234
git tag -a "v2.1 yangi" -m "Yangi versiya"
git describe
git push- Qaysi buyruqlar xato beradi va nega?
- Qaysi tag reliz uchun noto'g'ri tanlangan (xato bermasa ham)?
git describev2.0ni ko'rsatadimi?git pushdan 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
- Ikkinchisi —
abc1234bunday commit yo'q bo'lsa,Failed to resolve 'abc1234' as a valid ref.Uchinchisi — nomda bo'sh joy:is not a valid tag name. v2.0— yengil tag, relizga izoh va muallif yozilmagan. Bundan tashqari, SemVer uchta raqam talab qiladi:v2.0.0.- Yo'q. Oddiy
describefaqat annotated taglarni ko'radi. Boshqa annotated tag bo'lmasa,No annotated tags can describe ...xatosi chiqadi;--tagsbilan esav2.0ni topadi. - Yo'q — oddiy
git pushtaglarni yubormaydi. To'g'ri yo'l:git tag -d v2.0, keyingit tag -a v2.0.0 -m "..."vagit push --follow-tags(yokipush.followTagssozlamasi).
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.
git log --onelinebilan birinchi commit SHA'sini toping.- Unga
v1.0.0annotated tagini qo'ying. Xabar:Portfolio v1: HTML va CSS. git tag -nvagit describebilan tekshiring.describenatijasini 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
cd ~/kurs/portfolio
git log --oneline
git tag -a v1.0.0 63190c1 -m "Portfolio v1: HTML va CSS"
git tag -n
git describe63190c1 o'rniga o'z birinchi commitingizning SHA'sini yozing. Biz qisqa portfolio nusxasida sinadik:
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-g1aaefc2v1.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.0uning 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 pushtaglarni yuboradimi?", "SemVer'da2.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 pushtaglarni yubormaydi:--follow-tagsyoki 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
Izohlar (0)
Izoh yozish uchun kiring.
- Hozircha izoh yo'q. Birinchi bo'ling!