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:
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):
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:
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 VERSIONOutput yang Dihasilkan (perintah cat src/app.txt):
Katalog Film
============
Catatan film favorit untuk ditonton akhir pekan.Output yang Dihasilkan (perintah cat VERSION):
0.1.0Angka 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:
git status
git add .
git commit -m "chore: rintis proyek katalog film"Output yang Dihasilkan (perintah git status):
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):
[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.txtCommit 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:
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):
Switched to a new branch 'fitur/daftar-film'Output yang Dihasilkan (perintah cat src/app.txt):
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):
[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:
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-filmOutput yang Dihasilkan (perintah git merge --no-ff fitur/daftar-film):
Merge made by the 'ort' strategy.
src/app.txt | 6 ++++++
1 file changed, 6 insertions(+)Output yang Dihasilkan (perintah git log --graph --oneline):
* abc7deb Merge branch 'fitur/daftar-film'
|\
| * 36c8667 feat: tambah daftar film awal
|/
* 1bce001 chore: rintis proyek katalog filmOutput yang Dihasilkan (perintah git branch -d fitur/daftar-film):
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:
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/pencarianOutput yang Dihasilkan (perintah tail -n 12 src/app.txt):
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):
[fitur/pencarian d203019] feat: tambah pencarian judul
1 file changed, 9 insertions(+)Output yang Dihasilkan (perintah git merge --no-ff fitur/pencarian):
Merge made by the 'ort' strategy.
src/app.txt | 9 +++++++++
1 file changed, 9 insertions(+)Output yang Dihasilkan (perintah git log --graph --oneline):
* 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 filmOutput yang Dihasilkan (perintah git branch -d fitur/pencarian):
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
:
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):
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):
[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:
git log --onelineOutput yang Dihasilkan:
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 filmTujuh 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 SemVer | Keadaan katalog-film | Kesimpulan |
|---|---|---|
| Fitur inti yang direncanakan sudah lengkap? | daftar film dan pencarian — keduanya sudah merged | ya, bekal rilis lengkap |
Masih layak berstatus 0.x “jangan bergantung”? | dua fitur inti tuntas dan stabil | tidak — fase mencari bentuk sudah lewat |
| Ada perubahan yang merusak kompatibilitas? | belum ada pengguna versi sebelumnya | tidak ada yang bisa dirusak |
| Fitur baru sejak rilis terakhir? | belum pernah ada rilis — ini yang pertama | seluruhnya 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:
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):
1.0.0Output yang Dihasilkan (perintah git commit):
[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
.