Rilis tidak dimulai dari perintah git tag — rilis dimulai dari keputusan tentang apa saja yang sedang dirilis. Bagian ini karena itu mengerjakan pekerjaan yang paling mirip hari kerja biasa: kita membangun katalog-film dari nol, menuntaskan dua fitur lewat branch pendek masing-masing, memasang satu perbaikan kecil, lalu membekukan riwayat dan menimbangnya dengan aturan Semantic Versioning. Baru setelah angka 1.0.0 yakin, angka itu dikunci ke berkas VERSION sebagai satu commit tersendiri.

Menyiapkan Repository Katalog Film #

Mulai dari folder kerja kosong, buat repository dengan branch main sejak awal:

bash
mkdir katalog-film && cd katalog-film
git init -b main
git config user.name "Budi Santoso"
git config user.email "[email protected]"

Output yang Dihasilkan (perintah git init -b main):

text
Initialized empty Git repository in /home/z/my-project/tutorial-extracted/work/sandbox/proyek-git/proyek-07/katalog-film/.git/

Tiga berkas fondasi masuk sekaligus: README.md yang menjelaskan proyek, VERSION yang mencatat versi saat ini, dan src/app.txt berisi kerangka aplikasi:

bash
mkdir -p src
printf 'Katalog Film\n============\n\nCatatan film favorit untuk ditonton akhir pekan.\n' > src/app.txt
printf '# Katalog Film\n\nAplikasi teks sederhana untuk mencatat film favorit — latihan\nrilis untuk Course Git Proyek 07.\n\n## Struktur\n\n- `src/app.txt` — isi aplikasi katalog film\n- `VERSION` — penanda versi proyek\n' > README.md
printf '0.1.0\n' > VERSION
cat src/app.txt
cat VERSION

Output yang Dihasilkan (perintah cat src/app.txt):

text
Katalog Film
============

Catatan film favorit untuk ditonton akhir pekan.

Output yang Dihasilkan (perintah cat VERSION):

text
0.1.0

Angka 0.1.0 sengaja dipilih sebagai titik berangkat: sesuai aturan SemVer, fase 0.x adalah pengumuman “jangan bergantung pada saya dulu”. Periksa keadaannya sebelum mencatat:

bash
git status
git add .
git commit -m "chore: rintis proyek katalog film"

Output yang Dihasilkan (perintah git status):

text
On branch main

No commits yet

Untracked files:
  (use "git add <file>..." to include in what will be committed)
	README.md
	VERSION
	src/

nothing added to commit but untracked files present (use "git add" to track)

Output yang Dihasilkan (perintah git commit):

text
[main (root-commit) 1bce001] chore: rintis proyek katalog film
 3 files changed, 14 insertions(+)
 create mode 100644 README.md
 create mode 100644 VERSION
 create mode 100644 src/app.txt

Commit pertama memasang fondasi: tiga berkas, 14 baris, ditandai (root-commit) karena tidak punya induk. Hash 1bce001 di mesin kita akan berbeda — hash dipengaruhi isi, pesan, dan waktu pembuatan.

Menggabungkan Dua Fitur Lewat Branch #

Fitur pertama adalah inti aplikasinya: daftar film. Sesuai latihan Proyek 02 , fitur dikerjakan di branch pendek lalu digabungkan — cara yang sama seperti tim sungguhan memasukkan fitur ke rilis:

bash
git switch -c fitur/daftar-film
printf '\n## Daftar Film\n\n1. Laskar Pelang (2008)\n2. Dilan 1990 (2018)\n3. Habibie & Ainun (2012)\n' >> src/app.txt
cat src/app.txt
git add src/app.txt
git commit -m "feat: tambah daftar film awal"

Output yang Dihasilkan (perintah git switch -c fitur/daftar-film):

text
Switched to a new branch 'fitur/daftar-film'

Output yang Dihasilkan (perintah cat src/app.txt):

text
Katalog Film
============

Catatan film favorit untuk ditonton akhir pekan.

## Daftar Film

1. Laskar Pelang (2008)
2. Dilan 1990 (2018)
3. Habibie & Ainun (2012)

Output yang Dihasilkan (perintah git commit):

text
[fitur/daftar-film 36c8667] feat: tambah daftar film awal
 1 file changed, 6 insertions(+)

Fitur selesai di branchnya — sekarang digabungkan ke main dengan --no-ff supaya gelembung merge tetap terlihat di riwayat:

bash
git switch main
git merge --no-ff fitur/daftar-film -m "Merge branch 'fitur/daftar-film'"
git log --graph --oneline
git branch -d fitur/daftar-film

Output yang Dihasilkan (perintah git merge --no-ff fitur/daftar-film):

text
Merge made by the 'ort' strategy.
 src/app.txt | 6 ++++++
 1 file changed, 6 insertions(+)

Output yang Dihasilkan (perintah git log --graph --oneline):

text
*   abc7deb Merge branch 'fitur/daftar-film'
|\  
| * 36c8667 feat: tambah daftar film awal
|/  
* 1bce001 chore: rintis proyek katalog film

Output yang Dihasilkan (perintah git branch -d fitur/daftar-film):

text
Deleted branch fitur/daftar-film (was 36c8667).

Graf itu adalah bentuk paling berharga dari --no-ff: fitur terlihat sebagai satu gelembung — masuk dari satu sisi, keluar di merge, dan main tetap lurus. Fitur kedua menyusul dengan pola yang persis sama, kali ini pencarian judul:

bash
git switch -c fitur/pencarian
printf '\n## Pencarian\n\ncari(kata_kunci):\n    cocok = judul yang memuat kata_kunci\n    kembalikan cocok\n\nHasil uji:\ncari("dilan") → Dilan 1990 (2018)\n' >> src/app.txt
tail -n 12 src/app.txt
git add src/app.txt
git commit -m "feat: tambah pencarian judul"
git switch main
git merge --no-ff fitur/pencarian -m "Merge branch 'fitur/pencarian'"
git log --graph --oneline
git branch -d fitur/pencarian

Output yang Dihasilkan (perintah tail -n 12 src/app.txt):

text
1. Laskar Pelang (2008)
2. Dilan 1990 (2018)
3. Habibie & Ainun (2012)

## Pencarian

cari(kata_kunci):
    cocok = judul yang memuat kata_kunci
    kembalikan cocok

Hasil uji:
cari("dilan") → Dilan 1990 (2018)

Output yang Dihasilkan (perintah git commit):

text
[fitur/pencarian d203019] feat: tambah pencarian judul
 1 file changed, 9 insertions(+)

Output yang Dihasilkan (perintah git merge --no-ff fitur/pencarian):

text
Merge made by the 'ort' strategy.
 src/app.txt | 9 +++++++++
 1 file changed, 9 insertions(+)

Output yang Dihasilkan (perintah git log --graph --oneline):

text
*   e908983 Merge branch 'fitur/pencarian'
|\  
| * d203019 feat: tambah pencarian judul
|/  
*   abc7deb Merge branch 'fitur/daftar-film'
|\  
| * 36c8667 feat: tambah daftar film awal
|/  
* 1bce001 chore: rintis proyek katalog film

Output yang Dihasilkan (perintah git branch -d fitur/pencarian):

text
Deleted branch fitur/pencarian (was d203019).

Dua gelembung bertumpuk dengan rapi: setiap fitur punya alamat merge-nya sendiri, dan keduanya kelihatan di git log tanpa perlu menggali. Mekanisme di balik --no-ff dibedah tuntas di git merge .

Perbaikan Terakhir Sebelum Pembekuan #

Sebelum riwayat dibekukan, satu typo pada daftar film perlu dibereskan. Periksa dulu perbaikannya dengan git diff — kebiasaan dari Memeriksa Perubahan Sebelum Commit :

bash
sed -i 's/Laskar Pelang (2008)/Laskar Pelangi (2008)/' src/app.txt
git diff
git add src/app.txt
git commit -m "fix: perbaiki typo judul film"

Output yang Dihasilkan (perintah git diff):

text
diff --git a/src/app.txt b/src/app.txt
index 75edb93..fbd45d2 100644
--- a/src/app.txt
+++ b/src/app.txt
@@ -5,7 +5,7 @@ Catatan film favorit untuk ditonton akhir pekan.
 
 ## Daftar Film
 
-1. Laskar Pelang (2008)
+1. Laskar Pelangi (2008)
 2. Dilan 1990 (2018)
 3. Habibie & Ainun (2012)
 

Diff itu idealnya satu baris: judul Laskar Pelang menjadi Laskar Pelangi — persis beda satu huruf, dan bagian hunk @@ -5,7 +5,7 @@ menegaskan tidak ada baris lain yang tersentuh. Perbaikan kecil seperti inilah yang nanti tercatat di seksi Fixed pada changelog.

Output yang Dihasilkan (perintah git commit):

text
[main 028e7df] fix: perbaiki typo judul film
 1 file changed, 1 insertion(+), 1 deletion(-)

Membekukan dan Menimbang Versi #

Riwayat kini berisi semua yang akan dirilis. Tahap alur rilis bernama feature freeze dimulai dengan meninjau isi beku itu:

bash
git log --oneline

Output yang Dihasilkan:

text
028e7df fix: perbaiki typo judul film
e908983 Merge branch 'fitur/pencarian'
d203019 feat: tambah pencarian judul
abc7deb Merge branch 'fitur/daftar-film'
36c8667 feat: tambah daftar film awal
1bce001 chore: rintis proyek katalog film

Tujuh baris itu dibaca sebagai inventaris rilis: dua feat (daftar film, pencarian), satu fix (typo judul), dua merge yang membungkus fitur, dan dua chore yang menyiapkan fondasi serta versi. Sekarang pertanyaan besarnya: nomor berapa? Pertimbangannya ditimbang satu per satu menurut Semantic Versioning :

Pertanyaan SemVerKeadaan katalog-filmKesimpulan
Fitur inti yang direncanakan sudah lengkap?daftar film dan pencarian — keduanya sudah mergedya, bekal rilis lengkap
Masih layak berstatus 0.x “jangan bergantung”?dua fitur inti tuntas dan stabiltidak — fase mencari bentuk sudah lewat
Ada perubahan yang merusak kompatibilitas?belum ada pengguna versi sebelumnyatidak ada yang bisa dirusak
Fitur baru sejak rilis terakhir?belum pernah ada rilis — ini yang pertamaseluruhnya masuk ke rilis perdana

Empat jawaban menunjuk ke satu angka: 1.0.0 — deklarasi bahwa fitur inti pertama sudah lengkap dan siap diandalkan. Angka itu dikunci ke berkas VERSION, dan README.md ikut diberi seksi versi supaya pembaca repo tahu posisinya:

bash
printf '1.0.0\n' > VERSION
printf '# Katalog Film\n\nAplikasi teks sederhana untuk mencatat film favorit — latihan\nrilis untuk Course Git Proyek 07.\n\n## Struktur\n\n- `src/app.txt` — isi aplikasi katalog film\n- `VERSION` — penanda versi proyek\n\n## Versi\n\nRilis saat ini: v1.0.0 — daftar film dan pencarian judul.\n' > README.md
cat VERSION
git add VERSION README.md
git commit -m "chore: kunci versi 1.0.0"

Output yang Dihasilkan (perintah cat VERSION):

text
1.0.0

Output yang Dihasilkan (perintah git commit):

text
[main 37b21f8] chore: kunci versi 1.0.0
 2 files changed, 5 insertions(+), 1 deletion(-)

Versi sudah dikunci sebagai satu commit tersendiri — keputusan versi tercatat di riwayat, bukan hanya di kepala. Titik ini adalah titik rilis: segala sesuatu yang akan diberi nama v1.0.0 kini berdiri di satu commit yang bisa ditunjuk. Cara menunjuknya adalah pekerjaan Bagian 2: Membuat Tag .