Membuat tag satu kali memang mudah — praktik nyata jarang sesederhana itu. Pesan tag salah ketik, tag ditempatkan di commit yang keliru, penanda sementara selesai tugasnya dan perlu dibersihkan, atau kita sekadar ingin tahu tag mana saja yang berada di atas sebuah commit. Chapter ini merangkum operasi sehari-hari pengelolaan tag dalam satu repository: membuat ulang, menyaring, menimpa, menghapus, dan memeriksa — termasuk satu perintah penimpa yang perlu diperlakukan dengan hormat.
Repository Latihan dan Tag Typo #
Kita siapkan katalog produk dengan lima commit, lalu menandai dua titik — satu lightweight di commit lama, satu annotated di HEAD:
mkdir latihan-kelola && cd latihan-kelola
git init -b main
git config user.name "Budi Santoso"
git config user.email "[email protected]"
printf 'katalog produk\n' > katalog.md
git add katalog.md
git commit -m "Buat katalog produk"
printf 'katalog produk\ndeskripsi lengkap\n' > katalog.md
git add katalog.md
git commit -m "Tambah deskripsi produk"
printf 'katalog produk\ndeskripsi lengkap dan jelas\n' > katalog.md
git add katalog.md
git commit -m "Perbaiki typo deskripsi"
printf 'katalog produk\ndeskripsi lengkap dan jelas\nharga mulai 10 ribu\n' > katalog.md
git add katalog.md
git commit -m "Tambah harga produk"
printf '# Katalog\nproduk\nharga\n' > katalog.md
git add katalog.md
git commit -m "Rapikan format katalog"
git tag v0.9.0 b15a549
git tag -a v1.0.0 -m "Rilis katalog pertma"Argumen b15a549 pada baris git tag v0.9.0 adalah hash pendek commit “Tambah deskripsi produk”; di mesin pembaca nilainya berbeda dan bisa diganti HEAD~3. Opsi -a dan -m membuat v1.0.0 sebagai annotated tag di HEAD. Daftar dan saringannya bekerja seperti biasa:
git tagOutput yang Dihasilkan:
v0.9.0
v1.0.0git tag -l "v1.*"Output yang Dihasilkan:
v1.0.0Sekarang kita baca kembali isi tag v1.0.0 — cukup kepala tag dan commitnya tanpa diff, lewat --no-patch:
git show v1.0.0 --no-patchOutput yang Dihasilkan:
tag v1.0.0
Tagger: Budi Santoso <[email protected]>
Date: Mon Oct 26 09:30:00 2026 +0700
Rilis katalog pertma
commit cfd561fef2a576056b1425efcab448acd1b616e4
Author: Budi Santoso <[email protected]>
Date: Mon Oct 26 09:25:00 2026 +0700
Rapikan format katalogBaris pesan tag memperlihatkan masalah: “Rilis katalog pertma” — salah ketik, dan kesalahan itu sudah tersimpan di objek tag. Komit menulis ulang pesan salah ketik sudah pernah kita bahas di Opsi git commit ; untuk tag, jalannya berbeda.
Menimpa Tag dengan -f #
Insting pertama — membuat ulang tag dengan pesan yang benar — langsung ditolak Git:
git tag -a v1.0.0 -m "Rilis katalog pertama"Output yang Dihasilkan:
fatal: tag 'v1.0.0' already existsGit menolak menimpa nama tag yang sudah ada: perlindungan agar tag tidak berubah tanpa disadari. Untuk benar-benar menggantinya, diperlukan opsi -f (force):
git tag -f -a v1.0.0 -m "Rilis katalog pertama"Output yang Dihasilkan:
Updated tag 'v1.0.0' (was 06eb9e8)Keluaran Updated tag 'v1.0.0' (was 06eb9e8) jujur melaporkan dua hal: objek tag lama (was 06eb9e8) dibuang dan objek baru menggantikannya. Hash objek lama milik sandbox ini — di mesin pembaca nilainya berbeda, tetapi pola keluarannya sama. Perintah yang sama bisa dipakai untuk memindahkan tag ke commit lain dengan menambahkan argumen hash di belakangnya.
Menghapus Tag #
Tag yang memang tidak diperlukan dihapus dengan -d. Kita buat dulu penanda coba-coba di commit paling awal, lalu buang:
git tag v0.8.0 d4ff714
git tagOutput yang Dihasilkan:
v0.8.0
v0.9.0
v1.0.0git tag -d v0.8.0Output yang Dihasilkan:
Deleted tag 'v0.8.0' (was d4ff714)Keluaran Deleted tag 'v0.8.0' (was d4ff714) menampilkan hash yang ditunjuk tag sebelum dihapus — pada lightweight tag, hash itu adalah commitnya. Penghapusan hanya menyentuh repository lokal; nasib tag di remote dibahas di chapter Berbagi Tag ke Remote
.
Memeriksa Posisi Tag #
Dua perintah pemeriksaan menutup kotak peralatan. Pertama, git tag --contains menjawab: tag mana saja yang riwayatnya memuat sebuah commit?
git tag --contains b15a549Output yang Dihasilkan:
v0.9.0
v1.0.0Commit b15a549 (“Tambah deskripsi produk”) terkandung dalam riwayat yang ditunjuk v0.9.0 maupun v1.0.0, sehingga keduanya tercetak. Tag yang berada di jalur lain — atau di commit yang lebih muda — tidak muncul. Perintah ini berguna saat melacak: “perbaikan ini sudah masuk rilis yang mana saja?”
Kedua, git describe --tags melaporkan posisi HEAD relatif terhadap tag terdekat. Kita tambahkan satu commit di atas v1.0.0:
printf 'pemasok: PT Maju Jaya\n' > catatan.md
git add catatan.md
git commit -m "Tambah catatan pemasok"
git describe --tagsOutput yang Dihasilkan:
v1.0.0-1-gd9619a5Format v1.0.0-1-gd9619a5 terbaca: tag terdekat v1.0.0, HEAD berjarak 1 commit di atasnya, pada hash pendek d9619a5 (awalan g menandai git). Bila HEAD tepat berada di tag, keluarannya nama tag polos saja. Kompas posisi ini akan dipakai berulang kali di alur rilis — rincian opsi lengkapnya di git-describe
.
Rangkuman Perintah #
| Perintah | Peran |
|---|---|
git tag -a <nama> -m "pesan" | buat annotated tag di HEAD |
git tag -a <nama> -m "pesan" <commit> | buat annotated tag di commit tertentu |
git tag <nama> / git tag <nama> <commit> | buat lightweight tag |
git tag, git tag -l "<pola>" | daftar tag, dengan atau tanpa pola |
git show <tag> --no-patch | baca kepala tag dan commit tanpa diff |
git tag -d <nama> | hapus tag lokal |
git tag -f -a <nama> -m "pesan" | timpa tag yang sudah ada |
git tag --contains <commit> | daftar tag yang memuat sebuah commit |
git describe --tags | posisi HEAD relatif tag terdekat |
Seluruh operasi di atas bergerak di satu repository. Padahal kekuatan tag justru muncul saat nama v1.0.0 itu sampai ke tangan rekan dan pengguna — dan di situlah Git menyiapkan kejutan pertama: git push biasa tidak mengirim tag. Bagaimana tag bepergian antar-repository adalah pokok chapter berikutnya: Berbagi Tag ke Remote
.