Section Commit dan Riwayat mengajari kita membaca riwayat — tetapi riwayatnya masih satu garis lurus milik satu orang. Begitu dua topik dikerjakan sekaligus, atau dua anggota tim menyunting repository yang sama, kita butuh cara menampung dua jalur pekerjaan tanpa saling menimpa. Jawaban Git untuk kebutuhan itu adalah branch. Sayangnya, kata “cabang” ini sering membawa intuisi yang keliru: bayangan sebuah folder berisi salinan seluruh proyek. Chapter ini membedah apa yang sebenarnya terjadi di balik layar, dan membuktikannya langsung dari berkas-berkas kecil di dalam .git.

Branch Adalah Penunjuk ke Sebuah Commit #

Setiap commit yang kita buat menyimpan snapshot isi proyek beserta hash parent-nya, sehingga commit-commit terhubung menjadi rantai — materi chapter Anatomi Commit . Rantai objek itu tersimpan di database objek .git/objects dan tidak pernah diduplikasi per branch. Sebuah branch hanyalah penunjuk: nama kecil yang menunjuk tepat satu commit di rantai itu. Mari kita buktikan dengan repository latihan:

bash
mkdir latihan-konsep && cd latihan-konsep
git init -b main
git config user.name "Budi Santoso"
git config user.email "[email protected]"
printf 'Keranjang belanja:\n- kopi\n' > keranjang.md
git add keranjang.md
git commit -m "Buat keranjang belanja"
printf 'Keranjang belanja:\n- kopi\n- gula\n' > keranjang.md
git add keranjang.md
git commit -m "Tambah gula ke keranjang"

Branch main pada repository ini tersimpan sebagai berkas di jalur .git/refs/heads/main. Isinya bisa kita baca langsung dengan cat:

bash
cat .git/refs/heads/main

Output yang Dihasilkan:

text
98a46d419ea2327df7a2e6fb0c1a9756415a589f

Empat puluh karakter heksadesimal — bukan berkas proyek, bukan daftar berkas, melainkan hash satu commit, tepatnya commit terakhir yang kita buat. git rev-parse dari chapter Commit Hash dan References mengonfirmasi bahwa nama main memang diselesaikan Git menjadi hash itu:

bash
git rev-parse main

Output yang Dihasilkan:

text
98a46d419ea2327df7a2e6fb0c1a9756415a589f
bash
git rev-parse HEAD

Output yang Dihasilkan:

text
98a46d419ea2327df7a2e6fb0c1a9756415a589f

Tiga nilai identik: berkas .git/refs/heads/main, penyelesaian nama main, dan HEAD — karena HEAD saat ini menunjuk ke branch main, dan main menunjuk ke commit tersebut. Inilah seluruh “keberadaan” branch: satu berkas berisi satu hash.

Membuat Branch Hanya Menulis Satu Berkas Kecil #

Sekarang kita buat branch kedua dan periksa harga yang kita bayar:

bash
git branch eksperimen
cat .git/refs/heads/eksperimen

Output yang Dihasilkan:

text
98a46d419ea2327df7a2e6fb0c1a9756415a589f

Hash yang sama persis dengan isi .git/refs/heads/main — dua branch menunjuk commit yang sama. Berapa besar berkas penunjuk itu?

bash
wc -c .git/refs/heads/eksperimen

Output yang Dihasilkan:

text
41 .git/refs/heads/eksperimen

41 byte: 40 karakter hash ditambah satu karakter baris baru. Inilah biaya total sebuah branch — bukan menyalin ratusan megabite berkas proyek, melainkan menulis satu berkas seukuran satu baris. Karena seluruh snapshot dan berkas sudah ada di database objek dan dipakai bersama, branch tidak menduplikasi apa pun. Gambar berikut memetakan keadaan repository kita sekarang:

Rantai commit tetap satu — a9d278b menjadi parent 98a46d4 — dan dua branch hanya menempelkan penunjuknya pada commit terakhir itu. Perintah git branch eksperimen juga tidak memindahkan kita ke branch baru: git log --oneline masih menampilkan riwayat dari titik pandang branch aktif, dan pekerjaan berikutnya tetap dicatat ke main sampai kita benar-benar berpindah.

bash
git log --oneline

Output yang Dihasilkan:

text
98a46d4 Tambah gula ke keranjang
a9d278b Buat keranjang belanja

Penunjuk yang Bergerak vs Folder Salinan #

Tabel berikut membandingkan dua mental model yang sering dipegang pemula:

PertanyaanModel “folder salinan”Model penunjuk (yang nyata)
Apa itu branch?Duplikat seluruh berkas proyekNama yang menunjuk satu commit
Berapa biaya membuat branch?Menyalin semua berkas dan direktoriMenulis satu berkas 41 byte
Saat commit baru dibuat, apa yang bergerak?Berkas di “folder” branch aktifHanya penunjuk branch aktif maju
Apakah branch lain melihat commit itu?Tidak, karena foldernya terpisahTidak, karena penunjuknya tidak digerakkan
Apakah objek berkas terduplikasi antar branch?Ya, salinan penuhTidak; objek dipakai bersama

Model penunjuk bukan sekadar detail internal — ia menjelaskan perilaku yang mustahil dijelaskan model salinan. Berpindah branch terasa cepat karena Git hanya menukar isi working tree sesuai commit yang ditunjuk, bukan menggandakan folder. Merge menjadi murah karena intinya menggerakkan atau menambah penunjuk, bukan menyatukan dua folder. Dan commit baru hanya menggeser satu penunjuk — cabang lain tidak tersentuh sama sekali, hal yang kita buktikan nyata di chapter Branch dan Commit . Bab Pro Git Branches in a Nutshell menyebut desain ini sebagai alasan Git membuat branch hampir tanpa biaya.

Dengan mental model yang benar, perintah-perintah di section ini berubah dari mantra hafalan menjadi konsekuensi logis. Langkah pertama yang praktis: bagaimana caranya membuat penunjuk baru? Itu pembahasan chapter berikutnya, Membuat Branch .