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:
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 mainOutput yang Dihasilkan (perintah terakhir):
To ../toko-bersama.git
* [new branch] main -> main
branch 'main' set up to track 'origin/main'.Siti menyalin repository yang sama ke mejanya sendiri:
cd ..
git clone toko-bersama.git sitiOutput yang Dihasilkan:
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:
cd siti
git switch -c fitur/kontakOutput yang Dihasilkan (perintah terakhir):
Switched to a new branch 'fitur/kontak'printf 'kontak\n' > kontak.md
git add kontak.md
git commit -m "Tambah halaman kontak"Output yang Dihasilkan (perintah terakhir):
[fitur/kontak 7533126] Tambah halaman kontak
1 file changed, 1 insertion(+)
create mode 100644 kontak.mdgit push -u origin fitur/kontakOutput yang Dihasilkan:
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:
cd ../budi
git fetch originOutput yang Dihasilkan:
From ../toko-bersama
* [new branch] fitur/kontak -> origin/fitur/kontakgit log --oneline main..origin/fitur/kontakOutput yang Dihasilkan:
7533126 Tambah halaman kontakgit diff main...origin/fitur/kontakOutput yang Dihasilkan:
diff --git a/kontak.md b/kontak.md
new file mode 100644
index 0000000..e26f107
--- /dev/null
+++ b/kontak.md
@@ -0,0 +1 @@
+kontakRentang 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:
git merge --no-ff origin/fitur/kontakOutput yang Dihasilkan:
Merge made by the 'ort' strategy.
kontak.md | 1 +
1 file changed, 1 insertion(+)
create mode 100644 kontak.mdGit 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:
git push origin main
git log --oneline --graph --all --decorateOutput yang Dihasilkan (perintah terakhir):
* a5fd93b (HEAD -> main, origin/main) Merge remote-tracking branch 'origin/fitur/kontak'
|\
| * 7533126 (origin/fitur/kontak) Tambah halaman kontak
|/
* 5b3ba1f Buat kerangka tokoHash 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:
git push origin --delete fitur/kontakOutput yang Dihasilkan:
To ../toko-bersama.git
- [deleted] fitur/kontakSatu 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:
cd ../siti
git switch mainOutput yang Dihasilkan (perintah terakhir):
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:
git pull --ff-onlyOutput yang Dihasilkan:
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.mdfetch 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:
git branch -d fitur/kontakOutput yang Dihasilkan:
Deleted branch fitur/kontak (was 7533126).git fetch --pruneOutput yang Dihasilkan:
From ../toko-bersama
- [deleted] (none) -> origin/fitur/kontakgit 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:
| Langkah | Pelaku | Perintah |
|---|---|---|
| 1. Buka branch fitur | Siti | git switch -c fitur/kontak |
| 2. Kerjakan dan kirim | Siti | git add, git commit, git push -u origin fitur/kontak |
| 3. Ajukan untuk review | Siti | buka pull request di platform |
| 4. Telaah kandidat | Budi | git fetch origin, git log main..origin/fitur/kontak, git diff main...origin/fitur/kontak |
| 5. Gabungkan | Budi | git merge --no-ff origin/fitur/kontak, git push origin main |
| 6. Rapikan remote | Budi | git push origin --delete fitur/kontak |
| 7. Tarik hasil merge | Siti | git switch main, git pull --ff-only |
| 8. Rapikan lokal | Siti | git 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.