git tag — versiyalarni belgilash, lightweight va annotated tag
Muammodan boshlaylik
Mijoz xabar beradi: "v2.3.0 versiyasida eksport ishlamayapti". Sizning main ingiz allaqachon v2.5 ga yetgan. v2.3.0 qaysi commit edi? Tarixda 400 ta commit. "Taxminan oktyabr oyining o'rtasida edi..."
Yoki: Docker image dokon:2.3.0 ni qayta yasash kerak — aynan o'sha koddan.
Branch lar siljiydi — har bir commit bilan oldinga. Versiya esa o'zgarmas nuqta bo'lishi kerak. Buning uchun — teg (tag).
Teg nima?
Teg — muayyan commit ga qo'yilgan doimiy nom. Branch dan farqi — u hech qachon siljimaydi.
v2.3.0 v2.4.0 v2.5.0
↓ ↓ ↓
●────●────●────●────●────●────●────●────●────●────●────● main
↑
(siljiydi)
git switch --detach v2.3.0 # aynan 2.3.0 kodi
git diff v2.3.0 v2.5.0 # ikki versiya farqi
git log v2.4.0..v2.5.0 --oneline # 2.5.0 dagi yangiliklar
Ikki turdagi teg
Annotated — to'liq (tavsiya etiladi)
git tag -a v2.5.0 -m "Versiya 2.5.0: kategoriya filtri, savat tuzatishlari"
Alohida Git obyekti (5-dars): muallif, sana, xabar, ixtiyoriy kriptografik imzo saqlanadi.
git show v2.5.0
tag v2.5.0
Tagger: Otabek Hasanov <otabek@example.com>
Date: Fri Nov 6 15:00:00 2026 +0500
Versiya 2.5.0: kategoriya filtri, savat tuzatishlari
commit a3f9c2b...
Author: ...
Lightweight — oddiy ko'rsatkich
git tag v2.5.0
Shunchaki commit ga nom — xuddi o'zgarmas branch. Qo'shimcha ma'lumot yo'q.
Annotated (-a) |
Lightweight | |
|---|---|---|
| Muallif, sana, xabar | ✅ | ❌ |
Imzolash (-s) |
✅ | ❌ |
git describe standart holatda |
✅ Ko'radi | ❌ |
| Qachon | Relizlar | Shaxsiy, vaqtinchalik belgilar |
Relizlar uchun — doim annotated.
Teglar bilan ishlash
Ro'yxat
git tag # alifbo tartibida
git tag -l "v2.*" # naqsh bo'yicha
git tag --sort=-v:refname # versiya bo'yicha, eng yangisi tepada
git tag -n # xabarlar bilan
Eski commit ga teg
Unutdingizmi? Istalgan commit ga keyin ham qo'yish mumkin:
git tag -a v2.3.0 9f8e7d6 -m "Versiya 2.3.0"
Push
[!WARNING]
git pushteglarni yubormaydi! Teglar alohida push qilinadi. Bu juda ko'p uchraydigan xato: lokalda teg bor, GitHub da — yo'q.
git push origin v2.5.0 # bitta teg
git push --tags # barcha lokal teglar
git push --follow-tags # commitlar + ularga tegishli annotated teglar
Doim avtomatik:
git config --global push.followTags true
O'chirish
git tag -d v2.5.0 # lokal
git push origin --delete v2.5.0 # GitHub dan
[!WARNING] Push qilingan relizni o'chirib, boshqa commit ga qayta qo'ymang — boshqalarda va CI da eski teg qoladi va "v2.5.0" turli joylarda turli kodni anglatadi. Xato reliz bo'lsa — yangi versiya chiqaring:
v2.5.1.
Teglar va remote
Hamkasblaringiz qo'ygan teglarni olish:
git fetch --tags
Odatda git fetch va git pull yangi teglarni ham olib keladi (ular olinayotgan commitlarga ishora qilsa).
git describe — "qayerdaman?"
git describe
v2.5.0-12-ga3f9c2b
"Eng yaqin teg — v2.5.0, undan keyin 12 ta commit, joriy commit — a3f9c2b". Build larga avtomatik versiya qo'yish uchun qulay:
docker build -t dokon:$(git describe --tags --always) .
Reliz jarayoni — hammasi birga
git switch main && git pull
npm test # 1. Hammasi ishlaydimi?
npm version minor # 2. package.json → 2.5.0, commit, teg v2.5.0
git push --follow-tags # 3. Commit va teg GitHub ga
Keyin:
- GitHub da teg asosida Release yaratiladi — CHANGELOG va fayllar bilan (41-dars)
- CI teg ga reaksiya qilib, production build va deploy qiladi (Docker kursi, 41-dars:
tags: ["v*"])
Imzolangan teglar
git tag -s v2.5.0 -m "Versiya 2.5.0" # GPG yoki SSH kalit bilan (51-dars)
git tag -v v2.5.0 # imzoni tekshirish
Ochiq kodli loyihalarda — foydalanuvchilar relizni haqiqatan siz chiqarganingizni tekshira oladi.
Nima uchun shunday?
Nima uchun versiya uchun branch emas, teg ishlatiladi — release-2.5.0 nomli branch ham ishlardi-ku?
Chunki branch — harakatlanish uchun mo'ljallangan: unga commit qilinadi va u oldinga siljiydi. "2.5.0" branch iga kimdir tasodifan commit qilsa, "2.5.0" endi boshqa kodni anglatadi — va bu versiyaning butun ma'nosini yo'q qiladi. Teg esa o'zgarmaslik uchun yaratilgan: u bir marta qo'yiladi va abadiy bir xil commitni ko'rsatadi. "v2.5.0" — yil o'tib ham, har bir kompyuterda, har bir CI da aynan bir xil kod. Bu takrorlanuvchanlik — xatolarni qayta yaratish, eski versiyani qayta build qilish va auditorlik uchun asos.
Xulosa
Eslab qoling:
- Teg — commit ga doimiy, siljimaydigan nom
git tag -a v2.5.0 -m "..."— annotated (relizlar uchun)git tag v2.5.0— lightweight (shaxsiy belgilar)git tag -a v2.3.0 <hash>— eski commit gagit pushteglarni yubormaydi:git push --tagsyoki--follow-tags;push.followTags true- Push qilingan tegni ko'chirmang — yangi versiya chiqaring
git describe --tags— eng yaqin teg + masofanpm version minor && git push --follow-tags— tezkor reliz
Keyingi dars
37-dars: Monorepo da Git — katta loyihalarda ishlash