Semua perangkat kolaborasi di section ini — workflow, sinkronisasi, konvensi, proteksi — bekerja agar main sehat setiap hari. Rilis menuntut hal yang berlawanan: pada satu momen tertentu, kereta harus berhenti agar penumpang yang tepat turun di stasiun bernama versi 1.2.0. Tanpa koordinasi, rilis menjadi acak: fitur setengah jadi ikut terkirim, perbaikan penting tertinggal di stasiun sebelumnya, dan tidak ada yang tahu siapa memegang kendali. Chapter penutup ini menyusun seluruh siklusnya — pengumuman freeze, pemotongan branch rilis, perbaikan yang menyusul lewat cherry-pick, penandaan versi, dan penutupan siklus dengan merge balik — lengkap dengan pembagian peran yang membuatnya bisa dijalankan manusia.

Freeze: Menghentikan Kereta Fitur #

Siklus rilis dibuka bukan dengan perintah Git, melainkan dengan pengumuman. Release manager — satu orang yang ditunjuk memegang kendali rilis — menetapkan tanggal dan mengumumkan merge freeze: mulai saat itu sampai rilis terkirim, tidak ada fitur baru yang menyatu ke main. Pekerjaan fitur tidak berhenti; ia hanya menunggu di branch masing-masing — pola Feature Branch Workflow justru memudahkan penundaan ini, karena yang belum digabung memang tidak pernah masuk. Yang tetap mengalir selama freeze hanyalah perbaikan: galat yang ditemukan justru diprioritaskan sebelum versi terkirim.

Panggungnya kita bangun dari riwayat yang sudah akrab: kerangka toko dan halaman kontak dirilis sebagai versi 1.1.0, lalu fitur pencarian menyatu ke main sebagai calon isi 1.2.0:

bash
mkdir toko-rilis && cd toko-rilis
git init -b main
git config user.name "Budi Santoso"
git config user.email "[email protected]"
printf 'bernda\n' > situs.md
git add situs.md
git commit -m "Buat kerangka toko"
printf 'kontak\n' > kontak.md
git add kontak.md
git -c user.name="Siti Rahma" -c user.email="[email protected]" \
  commit -m "Tambah halaman kontak"
git tag -a v1.1.0 -m "Rilis 1.1.0"
printf 'kolom pencarian\n' > pencarian.md
git add pencarian.md
git -c user.name="Siti Rahma" -c user.email="[email protected]" \
  commit -m "Tambah fitur pencarian"

Output yang Dihasilkan (perintah terakhir):

text
[main 3b765ca] Tambah fitur pencarian
 1 file changed, 1 insertion(+)
 create mode 100644 pencarian.md

Memotong Branch Rilis #

Freeze berlaku, uji menandai main siap distabilkan, dan release manager memotong snapshotnya menjadi branch rilis:

bash
git switch -c release/1.2 main

Output yang Dihasilkan:

text
Switched to a new branch 'release/1.2'

Satu perintah ini adalah seluruh upacara pemotongannya: release/1.2 lahir sebagai salinan main saat itu — kerangka, kontak, pencarian, dan segala yang sudah menyatu. Dari titik ini branch rilis bersifat beku ke arah fitur; pola yang sama dipakai release/* pada GitFlow , hanya saja di sini sumbernya main langsung. Di tim nyata, release manager mendorongnya ke remote (git push -u origin release/1.2) supaya semua anggota bisa menarik dan ikut menguji.

Hanya Perbaikan yang Menyusul #

Stabilisasi selalu melahirkan kejutan. Pengujian menemukan typo yang lolos sejak kerangka — bernda pada situs.md. Siti memperbaikinya di tempat keliru lahir: main. (Di sandbox satu repo memainkan dua peran; di tim nyata Siti mengerjakannya di clone-nya sendiri lalu push.)

bash
git switch main
printf 'beranda\n' > situs.md
git add situs.md
git -c user.name="Siti Rahma" -c user.email="[email protected]" \
  commit -m "fix: perbaiki typo beranda"
git log --oneline -1

Output yang Dihasilkan (dua perintah terakhir):

text
[main dd8c690] fix: perbaiki typo beranda
 1 file changed, 1 insertion(+), 1 deletion(-)
text
dd8c690 fix: perbaiki typo beranda

Perbaikan kini hidup di main — tetapi calon rilis berdiri di branch lain. Membawa satu commit pilihan tanpa seluruh branch: itulah pekerjaan cherry-pick . Release manager menyalin hash dari keluaran di atas (hash di mesin pembaca berbeda — salin dari git log milik kita), lalu menerapkannya di branch rilis:

bash
git switch release/1.2
git cherry-pick dd8c690

Output yang Dihasilkan (perintah terakhir):

text
[release/1.2 134f577] fix: perbaiki typo beranda
 Author: Siti Rahma <[email protected]>
 Date: Sat Oct 31 11:00:00 2026 +0700
 1 file changed, 1 insertion(+), 1 deletion(-)

Hasilnya commit baru — hash 134f577, bukan dd8c690 — dengan isi dan penulis yang sama persis: Siti tetap tercatat sebagai pembuatnya, tanggung jawab tidak hilang saat commit berpindah branch. Bukti perbaikannya hadir di calon rilis:

bash
cat situs.md

Output yang Dihasilkan:

text
beranda

Menandai dan Menguji Rilis #

Bila stabilitas tercapai, rilis dibekukan menjadi versi. Nomor 1.2.0 mengikuti SemVer — angka minor naik karena ada fitur baru, rincian cara membacanya dibedah di Semantic Versioning :

bash
printf '1.2.0\n' > VERSION
git add VERSION
git commit -m "Siapkan rilis 1.2.0"
git tag -a v1.2.0 -m "Rilis 1.2.0"
git tag

Output yang Dihasilkan (dua perintah terakhir):

text
[release/1.2 56d9327] Siapkan rilis 1.2.0
 1 file changed, 1 insertion(+)
 create mode 100644 VERSION
text
v1.1.0
v1.2.0

Sebelum tag dipatri, kandidat rilis melewati putaran uji terakhir — di tim sungguhan: seluruh suite tes, uji instalasi, telaah catatan rilis. Tag annotated menjadi kontrak bahwa commit 56d9327-lah yang dirilis, bukan “yang ada di main sore ini”. Menyerahkannya ke dunia mengikuti pola berbagi tag dari Berbagi Tag ke Remote — git push origin v1.2.0 — dan seluruh delapan langkah upacara lengkapnya dirangkum di Release Workflow .

Rilis terkirim, freeze diangkat, kereta bergerak lagi. Siti jadi penumpang pertama pasca-rilis dengan eksperimen temanya di main:

bash
git switch main
printf 'tema gelap\n' > tema.md
git add tema.md
git -c user.name="Siti Rahma" -c user.email="[email protected]" \
  commit -m "Tambah eksperimen tema"

Output yang Dihasilkan (perintah terakhir):

text
[main 50a6eaf] Tambah eksperimen tema
 1 file changed, 1 insertion(+)
 create mode 100644 tema.md

Sisa satu urusan: isi rilis — berkas VERSION, dan jejak resmi penyatuannya — harus pulang ke main, supaya pekerjaan berikutnya tidak berangkat dari titik yang tertinggal:

bash
git merge --no-ff release/1.2
git branch -d release/1.2

Output yang Dihasilkan (dua perintah):

text
Merge made by the 'ort' strategy.
 VERSION | 1 +
 1 file changed, 1 insertion(+)
 create mode 100644 VERSION
text
Deleted branch release/1.2 (was 56d9327).

Diffstat merge-nya menarik: satu-satunya berkas yang berpindah adalah VERSION. Perbaikan typo sudah hadir di main sejak commit Siti — salinan cherry-pick di sisi rilis berisi ubahan yang sama, sehingga merge tiga arah tidak perlu mengutak-atik situs.md lagi. Graf akhirnya merangkum seluruh siklus:

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

Output yang Dihasilkan:

text
*   8b509bb (HEAD -> main) Merge branch 'release/1.2'
|\  
| * 56d9327 (tag: v1.2.0) Siapkan rilis 1.2.0
| * 134f577 fix: perbaiki typo beranda
* | 50a6eaf Tambah eksperimen tema
* | dd8c690 fix: perbaiki typo beranda
|/  
* 3b765ca Tambah fitur pencarian
* 10d06d5 (tag: v1.1.0) Tambah halaman kontak
* 511795f Buat kerangka toko

Dua dunia terbaca jelas: jalur rilis berhenti di tag v1.2.0 — persis yang berjalan di produksi — sementara main sudah melaju dengan fitur pasca-rilis. Hash di mesin pembaca berbeda; komposisinya tidak.

Kalender Rilis dan Komunikasi #

Seluruh perintah di atas hanyalah sepertiga pekerjaan; dua pertiganya komunikasi. Release manager menjalankan kalender — tanggal freeze, tanggal target, tanggal cadangan — mengumumkan tiap perpindahan fase, menjawab “apakah boleh merge ini sekarang?”, dan memutuskan galat mana menunda rilis versus menyusul. Tanpa satu orang pemegang kendali, freeze melunak diam-diam dan tanggal melesat tanpa perlawanan. Peta lengkap fasenya:

FaseKomunikasiAktivitas Git
Freezepengumuman tanggal dan batas “tidak ada fitur baru”merge fitur ditunda di branch masing-masing; hanya fix ke main
Potong rilispengumuman kandidat rilisgit switch -c release/1.2 main, git push -u origin release/1.2
Stabilisasikanal galat khusus rilis, triage tiap temuanfix ke main, git cherry-pick ke release/1.2, uji ulang
Penandaancatatan rilis diterbitkangit tag -a v1.2.0, git push origin v1.2.0
Pasca-rilisfreeze diangkat, kalender berikutnya dibukagit merge --no-ff release/1.2, git branch -d release/1.2

Rilis yang terkoordinasi seperti ini berdiri di atas semua kebiasaan section ini: branch yang sinkron, konflik yang diselesaikan lewat prosedur, konvensi pesan yang membuat changelog mudah disusun, dan main yang dijaga proteksi server-side. Semua itu berlangsung di atas satu infrastruktur yang selama section ini cukup kita wakili dengan bare repo sederhana. Di dunia nyata, infrastruktur itu bernama platform hosting — GitHub, GitLab, Bitbucket — tempat pull request, review, dan proteksi branch bekerja penuh waktu. Section Git Hosting Platforms memperkenalkan mereka satu per satu.