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:
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):
[main 3b765ca] Tambah fitur pencarian
1 file changed, 1 insertion(+)
create mode 100644 pencarian.mdMemotong Branch Rilis #
Freeze berlaku, uji menandai main siap distabilkan, dan release manager memotong snapshotnya menjadi branch rilis:
git switch -c release/1.2 mainOutput yang Dihasilkan:
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.)
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 -1Output yang Dihasilkan (dua perintah terakhir):
[main dd8c690] fix: perbaiki typo beranda
1 file changed, 1 insertion(+), 1 deletion(-)dd8c690 fix: perbaiki typo berandaPerbaikan 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:
git switch release/1.2
git cherry-pick dd8c690Output yang Dihasilkan (perintah terakhir):
[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:
cat situs.mdOutput yang Dihasilkan:
berandaMenandai 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
:
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 tagOutput yang Dihasilkan (dua perintah terakhir):
[release/1.2 56d9327] Siapkan rilis 1.2.0
1 file changed, 1 insertion(+)
create mode 100644 VERSIONv1.1.0
v1.2.0Sebelum 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
.
Menutup Siklus: Merge Balik ke main #
Rilis terkirim, freeze diangkat, kereta bergerak lagi. Siti jadi penumpang pertama pasca-rilis dengan eksperimen temanya di main:
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):
[main 50a6eaf] Tambah eksperimen tema
1 file changed, 1 insertion(+)
create mode 100644 tema.mdSisa satu urusan: isi rilis — berkas VERSION, dan jejak resmi penyatuannya — harus pulang ke main, supaya pekerjaan berikutnya tidak berangkat dari titik yang tertinggal:
git merge --no-ff release/1.2
git branch -d release/1.2Output yang Dihasilkan (dua perintah):
Merge made by the 'ort' strategy.
VERSION | 1 +
1 file changed, 1 insertion(+)
create mode 100644 VERSIONDeleted 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:
git log --oneline --graph --all --decorateOutput yang Dihasilkan:
* 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 tokoDua 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:
| Fase | Komunikasi | Aktivitas Git |
|---|---|---|
| Freeze | pengumuman tanggal dan batas “tidak ada fitur baru” | merge fitur ditunda di branch masing-masing; hanya fix ke main |
| Potong rilis | pengumuman kandidat rilis | git switch -c release/1.2 main, git push -u origin release/1.2 |
| Stabilisasi | kanal galat khusus rilis, triage tiap temuan | fix ke main, git cherry-pick ke release/1.2, uji ulang |
| Penandaan | catatan rilis diterbitkan | git tag -a v1.2.0, git push origin v1.2.0 |
| Pasca-rilis | freeze diangkat, kalender berikutnya dibuka | git 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.