Push tag

Mengirim tag ke remote, menghapusnya, dan menelusuri commit yang ditandai.

Daftar isi

Tag tidak ikut terkirim oleh git push yang biasa, dan itulah alasan pengelolaan tag di remote memerlukan langkah tersendiri. Topik ini membahas pengiriman tag satu per satu, pengiriman massal beserta kehati-hatiannya, pembacaan tag pada remote melalui git ls-remote, dan penghapusannya. Setelah topik ini, penanda rilis dapat dibagikan sebagaimana commitnya.

Mengirim tag secara eksplisit#

Pengiriman tag dilakukan dengan menyebut namanya setelah nama remote, dan Git memperlakukannya sebagai referensi yang dikirim terpisah dari branch.

bash
# tanggal commit ditetapkan agar keluaran contoh dapat direproduksi secara persis
export GIT_AUTHOR_DATE="2026-11-01T09:00:00+07:00"
export GIT_COMMITTER_DATE="2026-11-01T09:00:00+07:00"
bash
rm -rf /tmp/lab-pusat.git /tmp/lab-tag-push
git init --bare /tmp/lab-pusat.git
git init -b main /tmp/lab-tag-push
cd /tmp/lab-tag-push
git config user.name "Budi"
git config user.email "[email protected]"
printf "Aplikasi.\n" > app.txt
git add app.txt
git commit -m "Versi awal"
git tag v1.0.0
printf "Aplikasi.\nLaporan siap.\n" > app.txt
git commit -am "Fitur laporan"
git tag -a v1.1.0 -m "Rilis 1.1.0"
git remote add origin /tmp/lab-pusat.git
git push -q -u origin main
git push origin v1.0.0
git push origin v1.1.0
text Keluaran
hint: Using 'master' as the name for the initial branch. This default branch name
hint: is subject to change. To configure the initial branch name to use in all
hint: of your new repositories, which will suppress this warning, call:
hint:
hint: 	git config --global init.defaultBranch <name>
hint:
hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and
hint: 'development'. The just-created branch can be renamed via this command:
hint:
hint: 	git branch -m <name>
Initialized empty Git repository in /tmp/lab-pusat.git/
Initialized empty Git repository in /tmp/lab-tag-push/.git/
[main (root-commit) c4e4710] Versi awal
 1 file changed, 1 insertion(+)
 create mode 100644 app.txt
[main 488952e] Fitur laporan
 1 file changed, 1 insertion(+)
To /tmp/lab-pusat.git
 * [new tag]         v1.0.0 -> v1.0.0
To /tmp/lab-pusat.git
 * [new tag]         v1.1.0 -> v1.1.0

Pengiriman yang eksplisit satu per satu adalah bentuk yang paling terkendali, karena penanda rilis memang dilepaskan secara sadar. Kebiasaan yang menyertainya adalah mengirim tag setelah branch yang memuat commitnya terkirim, sehingga tag selalu menunjuk commit yang sudah ada di remote.

Membaca tag pada remote#

Perintah git ls-remote --tags membaca daftar tag langsung dari remote tanpa mengunduh riwayatnya, dan keluarannya mengungkap perbedaan kedua bentuk tag secara langsung.

bash
git ls-remote --tags origin
text Keluaran
c4e471072c442af2f1faaa7849e4b9505a063020	refs/tags/v1.0.0
94bd077463cdb2d759d83c711239603c6c50f6fb	refs/tags/v1.1.0
488952e502d856496c5948a671109cb350a0a85b	refs/tags/v1.1.0^{}

Tag ringan v1.0.0 menampilkan satu baris berisi hash commitnya. Tag beranotasi v1.1.0 menampilkan dua baris, yaitu hash objek tag pada baris pertama dan hash commit setelah penunjuknya diikuti pada baris kedua yang berakhiran tanda sirkumfleks dan kurung kurawal. Bentuk kedua baris ini adalah cerminan langsung dari lapisan objek yang dibahas pada topik tag beranotasi.

Pengiriman massal dan penghapusannya#

Opsi --tags mengirim seluruh tag lokal sekaligus, dan opsi ini memang tersedia, tetapi penggunaannya perlu disadari: tag pribadi, tag percobaan, dan tag yang lupa dihapus ikut terkirim bersama tag rilisnya. Pada repository dengan riwayat penandaan yang panjang, pengiriman massal juga berarti mengirim banyak objek tag sekaligus. Kebiasaan yang lebih sehat adalah mengirim tag rilis satu per satu pada saat melepaskannya, dan menampung penanda lain secara lokal.

Penghapusan di remote memakai opsi --delete, dan penghapusannya hanya menyentuh penunjuk tag di remote, bukan commit yang ditandainya.

bash
git push origin --delete v1.0.0
git ls-remote --tags origin
text Keluaran
To /tmp/lab-pusat.git
 - [deleted]         v1.0.0
94bd077463cdb2d759d83c711239603c6c50f6fb	refs/tags/v1.1.0
488952e502d856496c5948a671109cb350a0a85b	refs/tags/v1.1.0^{}

Menghapus tag tidak mengubah komitmen riwayat: commit yang ditandai tetap ada dan dapat diakses, sedangkan penunjuk namanya yang hilang. Tag pengganti dapat dibuat pada commit yang sama apabila kesalahan hanya pada namanya.

Tag pada salinan yang di-clone#

Tag yang sudah ada di remote ikut tersalin pada clone baru secara otomatis, tanpa perintah tambahan, sepanjang commit yang ditandainya memang ikut terunduh. Salinan yang diperoleh git clone karenanya langsung memuat penanda rilisnya.

bash
cd /tmp
rm -rf lab-salinan-tag
git clone -q lab-pusat.git lab-salinan-tag
cd lab-salinan-tag
git tag
text Keluaran
warning: remote HEAD refers to nonexistent ref, unable to checkout
v1.1.0

Keluaran di atas memperlihatkan satu tag tersisa setelah v1.0.0 dihapus pada bagian sebelumnya, dan itulah isi remote saat salinan dibuat. Perilaku yang sama berlaku pada git fetch pada salinan yang sudah ada, yaitu tag baru yang menunjuk commit yang dikenal ikut terunduh. Apabila commit yang ditandai belum dikenal secara lokal, tag tetap terunduh bersama objek yang diperlukannya, sehingga penanda rilis tidak pernah terpisah dari isinya.

Menyusun ritual rilis#

Pengelolaan tag menjadi paling berguna apabila dilekatkan pada satu urutan langkah yang dipakai setiap kali rilis dibuat. Urutan yang lazim dijalankan dari branch yang siap rilis adalah menuntaskan penggabungan pekerjaan terakhir, menjalankan pengujian pada keadaan final, membuat tag beranotasi dengan pesan yang merangkum rilisnya, mengirim branch lalu tag-nya, dan mengumumkan nomor versinya bersama catatan perubahan.

bash
git tag -a v1.2.0 -m "Rilis 1.2.0"
git push origin v1.2.0
text Keluaran
fatal: Failed to resolve 'HEAD' as a valid ref.
error: src refspec v1.2.0 does not match any
error: failed to push some refs to '/tmp/lab-pusat.git'

Urutan yang tetap membuat rilis dapat dipercaya karena langkahnya dapat diperiksa ulang, dan tag yang dilepaskan pada akhir urutan menjadi bukti bahwa nomor versi menunjuk keadaan yang benar-benar lolos pemeriksaan. Banyak tim menambahkan langkah otomatis pada titik ini, misalnya alat pengemasan yang dipicu oleh tag baru di remote, dan fondasi semua itu adalah tag yang dikirim secara sadar seperti pada topik ini.

Ringkasan#

  • Tag tidak ikut terkirim oleh push biasa, dan pengirimannya memakai git push origin nama-tag.
  • git ls-remote --tags membaca tag langsung dari remote, dengan dua baris pada tag beranotasi karena objek tag dan commitnya.
  • Opsi --tags mengirim seluruh tag lokal sekaligus, sehingga pengiriman eksplisit satu per satu lebih terkendali untuk rilis.
  • Penghapusan tag di remote memakai git push origin --delete nama-tag dan hanya melepas penunjuknya, bukan commitnya.

Referensi#