Setiap komponennya sudah kita kuasai satu per satu: branch untuk isolasi, push untuk mengirim, pull request untuk mengajukan, review untuk menimbang, merge untuk menggabungkan. Feature Branch Workflow — pola paling banyak dipakai tim kecil dan menengah — hanyalah aturan main yang merangkai semuanya: semua pekerjaan hidup di branch fitur, dan main selalu stabil. Chapter ini menari satu putaran penuh antara dua meja di sandbox: Siti berkontribusi, Budi mereview dan menggabungkan, lalu keduanya merapian.

Aturan Mainnya #

Aturannya pendek tapi dipegang mutlak. Branch main adalah rak pajangan yang selalu siap rilis — siapa pun boleh menyalinnya kapan pun tanpa takut mendapat setengah jadi. Semua perubahan, sekecil apa pun, lahir di branch fitur tersendiri, matang lewat review, dan bergabung lewat merge. Nama branch mengikuti konvensi dari Strategi Branching : prefix jenis pekerjaan, kebab-case, menyebut tugas — fitur/kontak, bukan siti.

Siklusnya utuh seperti ini:

Alur menggir dari atas ke bawah, dengan satu pintu putar balik: bila review meminta perbaikan, kontributor menambah commit di branch yang sama dan siklus kembali ke review — persis pola Code Review . Tabel rangkuman langkah dan perintahnya menunggu di akhir chapter; kini panggungnya dibangun.

Panggung: Satu Shared Repository, Dua Meja #

Budi memainkan maintainer: repository kerja, bare pusat, lalu dorongan pertama:

bash
mkdir budi && cd budi
git init -b main
git config user.name "Budi Santoso"
git config user.email "[email protected]"
printf 'beranda\n' > situs.md
git add situs.md
git commit -m "Buat kerangka toko"
git init --bare ../toko-bersama.git
git remote add origin ../toko-bersama.git
git push -u origin main

Output yang Dihasilkan (perintah terakhir):

text
To ../toko-bersama.git
 * [new branch]      main -> main
branch 'main' set up to track 'origin/main'.

Siti menyalin repository yang sama ke mejanya sendiri:

bash
cd ..
git clone toko-bersama.git siti

Output yang Dihasilkan:

text
Cloning into 'siti'...
done.

Dua meja, satu titik temu — model shared dari Workflow Kolaborasi . Berikutnya pekerjaan sungguhan.

Putaran Kontributor: Branch, Commit, Push #

Siti membuka branch fitur — pekerjaan apa pun, sekecil apa pun, tidak menyentuh main:

bash
cd siti
git switch -c fitur/kontak

Output yang Dihasilkan (perintah terakhir):

text
Switched to a new branch 'fitur/kontak'
bash
printf 'kontak\n' > kontak.md
git add kontak.md
git commit -m "Tambah halaman kontak"

Output yang Dihasilkan (perintah terakhir):

text
[fitur/kontak 7533126] Tambah halaman kontak
 1 file changed, 1 insertion(+)
 create mode 100644 kontak.md
bash
git push -u origin fitur/kontak

Output yang Dihasilkan:

text
To ../toko-bersama.git
 * [new branch]      fitur/kontak -> fitur/kontak
branch 'fitur/kontak' set up to track 'origin/fitur/kontak'.

Branch kini hidup di remote dengan nama yang sama, dan opsi -u mengikat branch lokal Siti ke salinannya — kebiasaan dari Tracking Branch yang membuat git push dan git pull berikutnya tanpa argumen. Di platform, Siti membuka pull request fitur/kontak ke main, mengisi deskripsi apa-kenapa-cara-uji, dan menunjuk Budi sebagai reviewer. Git selesai bekerja di titik ini; sisanya dialog.

Putaran Reviewer: Fetch, Telaah, Merge #

Di meja Budi tidak ada branch baru yang perlu dibuat — review dan merge sama-sama dilakukan dari main. Budi menarik dahulu:

bash
cd ../budi
git fetch origin

Output yang Dihasilkan:

text
From ../toko-bersama
 * [new branch]      fitur/kontak -> origin/fitur/kontak
bash
git log --oneline main..origin/fitur/kontak

Output yang Dihasilkan:

text
7533126 Tambah halaman kontak
bash
git diff main...origin/fitur/kontak

Output yang Dihasilkan:

text
diff --git a/kontak.md b/kontak.md
new file mode 100644
index 0000000..e26f107
--- /dev/null
+++ b/kontak.md
@@ -0,0 +1 @@
+kontak

Rentang main..origin/fitur/kontak memperlihatkan satu commit; diff tiga-titik memperlihatkan satu berkas baru — PR kecil, review cepat, Budi menyetujui. Gabungan dilakukan dengan --no-ff:

bash
git merge --no-ff origin/fitur/kontak

Output yang Dihasilkan:

text
Merge made by the 'ort' strategy.
 kontak.md | 1 +
 1 file changed, 1 insertion(+)
 create mode 100644 kontak.md

Git membuka editor dengan pesan siap pakai Merge remote-tracking branch 'origin/fitur/kontak' — simpan tanpa perubahan. Mengapa --no-ff padahal main Budi belum bergerak, sehingga merge biasa akan maju cepat mulus? Karena maju cepat membuat commit Siti tampak seperti commit langsung di main — batas fitur lenyap. --no-ff menolak jalan pintas itu dan melahirkan commit merge berinduk dua, penanda “di sini sebuah fitur utuh bergabung” — perbandingan lengkapnya dibedah di Fast-Forward Merge . Bentuknya terbaca di graf:

bash
git push origin main
git log --oneline --graph --all --decorate

Output yang Dihasilkan (perintah terakhir):

text
*   a5fd93b (HEAD -> main, origin/main) Merge remote-tracking branch 'origin/fitur/kontak'
|\  
| * 7533126 (origin/fitur/kontak) Tambah halaman kontak
|/  
* 5b3ba1f Buat kerangka toko

Hash di mesin pembaca akan berbeda, bentuknya tidak: satu gelembung merge di puncak, dua induknya bertemu di 5b3ba1f. Kualitas main — selalu bisa dirilis, riwayatnya terbaca sebagai rangkaian fitur, bukan tumpukan commit lepas — terjaga. Setelah push, housekeeping pertama: branch yang sudah bergabung tidak lagi punya alasan hidup di remote:

bash
git push origin --delete fitur/kontak

Output yang Dihasilkan:

text
To ../toko-bersama.git
 - [deleted]         fitur/kontak

Satu baris - [deleted] menutup umur origin/fitur/kontak — di platform, tombol yang sama tersedia begitu pull request selesai, perilakunya dibahas di Menghapus Remote Branch .

Putaran Penutup: Kontributor Menarik dan Merapikan #

Kembali ke meja Siti — yang menarik perhatian justru laporan yang tampak salah. Siti pindah ke main:

bash
cd ../siti
git switch main

Output yang Dihasilkan (perintah terakhir):

text
Switched to branch 'main'
Your branch is up to date with 'origin/main'.

up to date? Padahal Budi baru saja menggabungkan fitur Siti! Laporan itu jujur sesuai pengetahuan lokal: penunjuk origin/main milik Siti masih berhenti di 5b3ba1f karena salinan terakhirnya terjadi sebelum merge — persis ilusi yang dibahas di Remote-Tracking Branch . Penarikan membuktikannya:

bash
git pull --ff-only

Output yang Dihasilkan:

text
From ../toko-bersama
   5b3ba1f..a5fd93b  main       -> origin/main
Updating 5b3ba1f..a5fd93b
Fast-forward
 kontak.md | 1 +
 1 file changed, 1 insertion(+)
 create mode 100644 kontak.md

fetch menggerakkan origin/main ke a5fd93b, lalu main lokal Siti maju cepat mengikutinya — pekerjaan Siti kini resmi hadir di mejanya sendiri lewat jalur resmi. Opsi --ff-only menambah jaring pengaman: bila main lokal ternyata menyimpang, perintah berhenti alih-alih melahirkan merge dadakan — irama tarik-dorong sehatnya dirangkai di Sinkronisasi Remote . Penutupannya dua perintah kecil:

bash
git branch -d fitur/kontak

Output yang Dihasilkan:

text
Deleted branch fitur/kontak (was 7533126).
bash
git fetch --prune

Output yang Dihasilkan:

text
From ../toko-bersama
 - [deleted]         (none)     -> origin/fitur/kontak

git branch -d (huruf kecil) menolak menghapus branch yang belum tergabung — jaminan bahwa 7533126 memang sudah berada di main, pola aman dari Menghapus Branch . Sementara fetch --prune menyapu penunjuk origin/fitur/kontak yang basisnya sudah dihapus Budi — baris (none) menandai referensi yang disingkirkan. Siklus tertutup rapat: branch lahir, matang, bergabung, lalu hilang tanpa sisa di kedua meja.

Tabel Langkah dan Perintah #

Satu putaran penuh, delapan langkah, dua pelaku:

LangkahPelakuPerintah
1. Buka branch fiturSitigit switch -c fitur/kontak
2. Kerjakan dan kirimSitigit add, git commit, git push -u origin fitur/kontak
3. Ajukan untuk reviewSitibuka pull request di platform
4. Telaah kandidatBudigit fetch origin, git log main..origin/fitur/kontak, git diff main...origin/fitur/kontak
5. GabungkanBudigit merge --no-ff origin/fitur/kontak, git push origin main
6. Rapikan remoteBudigit push origin --delete fitur/kontak
7. Tarik hasil mergeSitigit switch main, git pull --ff-only
8. Rapikan lokalSitigit branch -d fitur/kontak, git fetch --prune

Pola ini bekerja untuk hampir semua tim — tetapi ia diam tentang satu hal: kapan hasil merge sampai ke pengguna. Workflow berikutnya, GitHub Flow, menjadikan pertanyaan itu jantung desainnya: main bukan cuma stabil, melainkan siap dideploy setiap saat.