git tag — versiyalarni belgilash, lightweight va annotated tag

~15 daq · Git · Professional Git Workflow

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 push teglarni 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 ga
  • git push teglarni yubormaydi: git push --tags yoki --follow-tags; push.followTags true
  • Push qilingan tegni ko'chirmang — yangi versiya chiqaring
  • git describe --tags — eng yaqin teg + masofa
  • npm version minor && git push --follow-tags — tezkor reliz

Keyingi dars

37-dars: Monorepo da Git — katta loyihalarda ishlash