Hotfix di chapter sebelumnya menutup lubang yang tidak direncanakan. Rilis adalah kebalikannya: perubahan yang direncanakan sejak awal, dibawa ke pengguna lewat alur yang bisa diulang tanpa drama. Fitur-fitur sudah mengalir ke main lewat siklus branch — tetapi main yang sehat belum menjawab pertanyaan pengguna: apa yang baru di versi terbaru, dan di titik mana persisnya kumpulan perubahan ini dibekukan menjadi v1.3.0? Workflow release menjawabnya dengan satu branch singkat yang punya tugas tunggal: membekukan calon rilis, menstabilkannya, lalu menutupnya dengan tag. Kerangka koordinasinya sudah dibahas di Koordinasi Release ; chapter ini menjalankan alurnya utuh pada satu rilis sungguhan.

Alur dari Fitur ke Tag #

Satu putaran rilis terdiri dari lima fase — empat di antaranya perintah Git, satu di antaranya keputusan manusia:

FasePerintah kunciIsinya
1. Fitur menyatugit merge --no-ff fitur/…siklus feature branch ke main, seperti biasa
2. Freezepengumuman, bukan perintahtidak ada fitur baru yang menyatu sejak titik ini
3. Branch rilisgit switch -c release/1.3calon rilis dibekukan dari main
4. Stabilisasigit commit -m "fix: …"hanya perbaikan — fitur baru ditolak
5. Penomoran & tagCHANGELOG, VERSION, git tag -a v1.3.0lalu merge balik dan push

Fase kedua sering diremehkan padahal menentukan: freeze adalah pengumuman — “mulai sekarang, kereta berhenti menerima penumpang baru”. Pekerjaan fitur tidak berhenti; ia menunggu di branch masing-masing untuk rilis berikutnya. Yang tetap mengalir ke branch rilis hanya perbaikan, termasuk yang muncul di main setelah pembekuan dan diambil dengan git cherry-pick — pola yang dibedah di Cherry-Pick .

Sesi Nyata: Rilis 1.3.0 dari Dua Fitur #

Katalog produk kecil akan dirilis. Dua fitur sudah menyatu ke main lewat siklus yang sama dengan chapter Workflow Feature Branch — diringkas di sini:

bash
mkdir katalog && cd katalog
git init -b main
git config user.name "Budi Santoso"
git config user.email "[email protected]"
printf '# Katalog Produk\n' > beranda.md
git add beranda.md
git commit -m "Buat kerangka katalog"

git switch -c fitur/galeri
printf '# Galeri\n' > galeri.md
git add galeri.md
git commit -m "Tambah galeri produk"
git switch main
git merge --no-ff fitur/galeri -m "Gabungkan fitur galeri produk"
git branch -d fitur/galeri

git switch -c fitur/ulasan
printf '# Ulasan\n' > ulasan.md
git add ulasan.md
git commit -m "Tambah ulasan pembeli"
git switch main
git merge --no-ff fitur/ulasan -m "Gabungkan fitur ulasan pembeli"
git branch -d fitur/ulasan

Output yang Dihasilkan (git commit pertama dan dua merge):

text
[main (root-commit) cec684a] Buat kerangka katalog
 1 file changed, 1 insertion(+)
 create mode 100644 beranda.md
text
Merge made by the 'ort' strategy.
 galeri.md | 1 +
 1 file changed, 1 insertion(+)
 create mode 100644 galeri.md
text
Merge made by the 'ort' strategy.
 ulasan.md | 1 +
 1 file changed, 1 insertion(+)
 create mode 100644 ulasan.md

Dua gelembung fitur menempel di main — bahan baku rilis sudah lengkap. Freeze diumumkan, dan calon rilis dibekukan ke branchnya sendiri:

bash
git switch -c release/1.3

Output yang Dihasilkan:

text
Switched to a new branch 'release/1.3'

Fase stabilisasi: pengujian menemukan judul galeri belum rapi. Perbaikan masuk — dengan prefiks fix: mengikuti Conventional Commits :

bash
printf '# Galeri Produk\n' > galeri.md
git add galeri.md
git commit -m "fix: perbaiki judul galeri"

Output yang Dihasilkan:

text
[release/1.3 90b4d17] fix: perbaiki judul galeri
 1 file changed, 1 insertion(+), 1 deletion(-)

Lalu fase penomoran: changelog diringkas dari pesan commit bergaya conventional — formatnya dibahas tuntas di Changelog — dan nomor versi ditetapkan:

bash
printf '# CHANGELOG\n\n## 1.3.0 - 2026-11-13\n\n### Added\n\n- Galeri produk\n- Ulasan pembeli\n\n### Fixed\n\n- Judul galeri\n' > CHANGELOG.md
printf '1.3.0\n' > VERSION
git add CHANGELOG.md VERSION
git commit -m "chore: siapkan rilis 1.3.0"

Output yang Dihasilkan (perintah terakhir):

text
[release/1.3 fd56002] chore: siapkan rilis 1.3.0
 2 files changed, 13 insertions(+)
 create mode 100644 CHANGELOG.md
 create mode 100644 VERSION

Branch rilis kini berisi dua fitur plus satu perbaikan plus penomoran — tepat apa yang mau dikirim. Penutupnya: merge balik ke main, tag di puncaknya, lalu kirim ke remote:

bash
git switch main
git merge --no-ff release/1.3 -m "Gabungkan rilis 1.3.0"
git tag -a v1.3.0 -m "Rilis 1.3.0"
git init --bare ../katalog-origin.git
git remote add origin ../katalog-origin.git
git push -u origin main
git push origin v1.3.0
git branch -d release/1.3

Output yang Dihasilkan (merge, dua push, dan penghapusan branch):

text
Merge made by the 'ort' strategy.
 CHANGELOG.md | 12 ++++++++++++
 VERSION      |  1 +
 galeri.md    | 2 +-
 3 files changed, 14 insertions(+), 1 deletion(-)
 create mode 100644 CHANGELOG.md
 create mode 100644 VERSION
text
To ../katalog-origin.git
 * [new branch]      main -> main
branch 'main' set up to track 'origin/main'.
text
To ../katalog-origin.git
 * [new tag]         v1.3.0 -> v1.3.0
text
Deleted branch release/1.3 (was fd56002).

Tag sengaja di-push terpisah — git push tidak membawa tag secara bawaan, kebiasaan yang dibedah di Berbagi Tag ke Remote . Riwayat akhirnya:

bash
git log --oneline --graph --decorate

Output yang Dihasilkan:

text
*   f433a1a (HEAD -> main, tag: v1.3.0, origin/main) Gabungkan rilis 1.3.0
|\  
| * fd56002 chore: siapkan rilis 1.3.0
| * 90b4d17 fix: perbaiki judul galeri
|/  
*   a355dd8 Gabungkan fitur ulasan pembeli
|\  
| * 8a198e3 Tambah ulasan pembeli
|/  
*   add2a2a Gabungkan fitur galeri produk
|\  
| * 2a12674 Tambah galeri produk
|/  
* cec684a Buat kerangka katalog

Hash di mesin pembaca berbeda, bentuknya tidak: dua gelembung fitur di bawah, satu gelembung rilis di puncak menaungi fase stabilisasi dan penomoran, dan v1.3.0 menandai titik yang persis dikirim ke origin. Jalur pada keluaran menyesuaikan lokasi direktori.

Tag, Halaman Release, dan Merge Balik #

Di platform hosting, tag v1.3.0 yang barusan di-push menjadi bahan mentah halaman Release: nomor versi, tanggal, dan catatan rilis yang lazim disalin dari CHANGELOG.md — hubungan keduanya dibedah di Release dan Tags . Pengguna mengunduh dari halaman itu, bukan dari git log; changelog yang rapi berbuah tepat di titik ini.

Satu kewajiban terakhir menyisai bila tim menjalankan develop: branch rilis dimerge balik ke develop juga — persis pola hotfix di chapter sebelumnya — supaya perbaikan stabilisasi tidak hilang dari pekerjaan versi berikutnya. Tanpa develop, merge ke main saja sudah menutup siklus. Prefiks fix:/chore: yang menjaga tiap fase terbaca di log berformat Conventional Commits sekaligus menjadi bahan changelog rilis berikutnya.

Rilis 1.3.0 dikirim ke pengguna yang dikenal: tim sendiri, pelanggan yang menunggu. Proyek open source bekerja dengan peta yang lebih ramai — siapa pun di dunia boleh datang membawa perbaikan, dan pemilik repo harus siap menjadi penjaga gerbang. Workflow open source, chapter berikutnya, memainkan kedua sisi meja itu: menerima kontribusi sebagai maintainer, dan mengirimnya sebagai kontributor.