Proyek yang dikerjakan sendirian tidak butuh pull request, reviewer, atau branch rilis — memasang semuanya hanya memperlambat. Tetapi “sendirian” bukan berarti Git-nya boleh asal: riwayat yang berantakan tetap menyulitkan kita sendiri enam bulan kemudian, saat bertanya “kapan persisnya fitur ini berubah?”. Kabar baiknya, workflow pribadi hanya menuntut tiga kebiasaan — commit berkala di main, tag pada setiap milestone, dan cadangan yang dibuat rutin. Section Kolaborasi Tim sudah membahas pola-pola besarnya; section praktik ini mulai dari ujung paling sederhana: satu orang, satu repository, tetap rapi.

Kebutuhan Sendirian Tanpa Birokrasi #

Workflow tim membeli kualitas dengan upacara: branch, review, proteksi. Pada proyek pribadi tidak ada yang mengecek pekerjaan kita, jadi upacara itu tidak punya pembeli — disiplinnya berpindah sepenuhnya ke tangan sendiri. Kebutuhan yang tersisa justru yang paling mendasar:

  • Checkpoint — titik aman untuk kembali ketika eksperimen sore ini merusak semalaman kerja kemarin.
  • Riwayat yang terbaca — pesan commit yang menjelaskan apa dan mengapa, bukan “update lagi”.
  • Milestone — penanda versi saat proyek mencapai keadaan yang layak diingat, misalnya situs pertama kali tayang.
  • Cadangan — salinan di luar laptop, karena git init tidak melindungi apa pun dari disk yang rusak.

Pola: main-Only dengan Ritme #

Pola kerjanya memangkas semua birokrasi: satu branch, main, menerima semua commit langsung. Yang menggantikan upacara adalah ritme:

ElemenPerintahKapan dijalankan
Commit berkalagit status, git add, git commitsetiap satu satuan kerja selesai (bukan akhir pekan)
Tag milestonegit tag -a v0.x.0 -m "..."saat proyek mencapai keadaan layak ditandai
Kirim cadangangit pushtiap akhir sesi kerja, atau lebih sering
Arsip luringgit bundle create ... --allrutin mingguan, disimpan di luar repo

Tag memakai bentuk annotated — penanda yang membawa pesan dan pembuatnya, pola dari section Tags dan Releases . Penomorannya boleh jujur mulai dari v0.1.0: proyek pribadi lazim dinyatakan belum stabil sebelum v1.0.0.

Sesi Nyata: Satu Pekan Situs Pribadi #

Budi membangun situs pribadi statis. Hari pertama dibuka dengan repository dan satu berkas:

bash
mkdir situs-pribadi && cd situs-pribadi
git init -b main
git config user.name "Budi Santoso"
git config user.email "[email protected]"
printf '<h1>Situs Budi</h1>\n' > index.html
git status

Output yang Dihasilkan (perintah terakhir):

text
On branch main

No commits yet

Untracked files:
  (use "git add <file>..." to include in what will be committed)
        index.html

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

Satu berkas, satu satuan kerja — langsung di-commit, bukan ditumpuk:

bash
git add index.html
git commit -m "Rilis kerangka situs"

Output yang Dihasilkan:

text
[main (root-commit) ae274a0] Rilis kerangka situs
 1 file changed, 1 insertion(+)
 create mode 100644 index.html

Sesi berlanjut: profil ditambah, catatan proyek dibuat, lalu commit kedua dan milestone pertama ditandai:

bash
printf '<p>Halo, saya Budi.</p>\n' >> index.html
printf '# Catatan\n\n- belajar git\n' > catatan.md
git add index.html catatan.md
git commit -m "Tambah profil singkat dan catatan"
git tag -a v0.1.0 -m "Milestone: situs pertama tayang"

Output yang Dihasilkan (git commit):

text
[main 8ad64f2] Tambah profil singkat dan catatan
 2 files changed, 4 insertions(+)
 create mode 100644 catatan.md

Sepekan kemudian, ritme yang sama berulang — kali ini cukup diperiksa lewat bentuk ringkas --short:

bash
printf '\n<h2>Proyek</h2>\n' >> index.html
printf '\n- latihan workflow\n' >> catatan.md
git status --short
git add -A
git commit -m "Tambah rubrik proyek dan catatan pekanan"
git tag -a v0.2.0 -m "Milestone: rubrik proyek"

Output yang Dihasilkan (git status –short dan git commit):

text
 M catatan.md
 M index.html
text
[main cf19f1e] Tambah rubrik proyek dan catatan pekanan
 2 files changed, 4 insertions(+)

Dua huruf M di posisi berbeda pada status --short memangkas ritual pagi: dua berkas berubah, belum ada yang dipentaskan. Hasil satu pekan kerja lalu terbaca utuh:

bash
git log --oneline --decorate
git tag -n1

Output yang Dihasilkan (dua perintah):

text
cf19f1e (HEAD -> main, tag: v0.2.0) Tambah rubrik proyek dan catatan pekanan
8ad64f2 (tag: v0.1.0) Tambah profil singkat dan catatan
ae274a0 Rilis kerangka situs
text
v0.1.0          Milestone: situs pertama tayang
v0.2.0          Milestone: rubrik proyek

Hash di mesin pembaca akan berbeda — bentuknya tidak: tiga commit berbaris lurus di main, dua milestone tercatat sebagai tag. Riwayat semacam ini menjawab pertanyaan enam bulan mendatang tanpa perlu arkeologi; jalur pada keluaran menyesuaikan lokasi direktori.

Ritme Commit: Harian atau per Fitur #

Kapan sebaiknya tombol commit ditekan? Dua gaya yang sehat berdiri bersebelahan:

GayaBentuknyaCocok saatRisiko bila salah
per satuan kerja“selesai satu fungsi/berkas → commit”proyek aktif dikembangkanjarang menumpuk utang
per sesi“akhir sesi → commit semua”proyek iseng / eksplorasicommit raksasa berisi 10 hal sekaligus

Commit raksasa adalah musuh utama proyek pribadi: pesannya terpaksa generik dan git bisect kehilangan presisinya. Aturan praktisnya satu kalimat — bila pesan commit butuh kata “dan”, pertimbangkan memecahnya.

Backup: Remote Rutin, Bundle Mingguan #

Ritme terakhir menjawab kebutuhan yang paling sering diabaikan: cadangan. Push rutin membarui salinan pekerjaan di tempat lain, dan tag ikut serta secara eksplisit:

bash
git init --bare ../situs-pribadi-backup.git
git remote add origin ../situs-pribadi-backup.git
git push -u origin main
git push origin --tags

Output yang Dihasilkan (dua push):

text
To ../situs-pribadi-backup.git
 * [new branch]      main -> main
branch 'main' set up to track 'origin/main'.
text
To ../situs-pribadi-backup.git
 * [new tag]         v0.1.0 -> v0.1.0
 * [new tag]         v0.2.0 -> v0.2.0

git push memang tidak membawa tag secara bawaan — perilaku ini dibahas tuntas di Berbagi Tag ke Remote . Lapis kedua untuk arsip luring: git bundle membungkus seluruh riwayat menjadi satu berkas biasa, layak disimpan di USB atau disandarkan ke penyimpanan awan:

bash
git bundle create cadangan-mingguan.bundle --all
git bundle verify cadangan-mingguan.bundle

Output yang Dihasilkan (git bundle verify):

text
cadangan-mingguan.bundle is okay
The bundle contains these 5 refs:
cf19f1e90f4b395dfc15d21edbab77eff534e557 refs/heads/main
cf19f1e90f4b395dfc15d21edbab77eff534e557 refs/remotes/origin/main
a4a1706f98df5dc92fca03d8f079336c14adadcf refs/tags/v0.1.0
c8631bccdcc01a7263796ca43a9a0af556059c5b refs/tags/v0.2.0
cf19f1e90f4b395dfc15d21edbab77eff534e557 HEAD
The bundle records a complete history.
The bundle uses this hash algorithm: sha1

Satu berkas, seluruh riwayat, terverifikasi utuh — teknik ini dibedah lengkap di Backup Repository dan rincian perintahnya terdokumentasi di dokumentasi git bundle .

Kapan Saatnya Naik Kelas #

Pola main-only berhenti pas begitu satu kebutuhan muncul: eksperimen. Saat Budi ingin mencoba desain ulang beranda tanpa merusak versi tayang, main tidak lagi cukup — ia butuh jalur paralel tempat kegagalan tidak meracuni riwayat utama. Saat itulah branch masuk: bukan birokrasi, melainkan alat isolasi, persis maknanya di Konsep Branch . Tanda-tanda lain menyusul: proyek mulai dirilis ke orang lain (butuh alur rilis), atau ada kontributor kedua (butuh review). Chapter berikutnya mengambil tanda pertama itu dan menjalankannya tuntas: satu fitur nyata — pencarian pada situs web kecil — dikerjakan lewat branch penuh, dari scaffold sampai merge dan tag.