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:
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:
cat .git/refs/heads/mainOutput yang Dihasilkan:
98a46d419ea2327df7a2e6fb0c1a9756415a589fEmpat 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:
git rev-parse mainOutput yang Dihasilkan:
98a46d419ea2327df7a2e6fb0c1a9756415a589fgit rev-parse HEADOutput yang Dihasilkan:
98a46d419ea2327df7a2e6fb0c1a9756415a589fTiga 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:
git branch eksperimen
cat .git/refs/heads/eksperimenOutput yang Dihasilkan:
98a46d419ea2327df7a2e6fb0c1a9756415a589fHash yang sama persis dengan isi .git/refs/heads/main — dua branch menunjuk commit yang sama. Berapa besar berkas penunjuk itu?
wc -c .git/refs/heads/eksperimenOutput yang Dihasilkan:
41 .git/refs/heads/eksperimen41 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.
git log --onelineOutput yang Dihasilkan:
98a46d4 Tambah gula ke keranjang
a9d278b Buat keranjang belanjaPenunjuk yang Bergerak vs Folder Salinan #
Tabel berikut membandingkan dua mental model yang sering dipegang pemula:
| Pertanyaan | Model “folder salinan” | Model penunjuk (yang nyata) |
|---|---|---|
| Apa itu branch? | Duplikat seluruh berkas proyek | Nama yang menunjuk satu commit |
| Berapa biaya membuat branch? | Menyalin semua berkas dan direktori | Menulis satu berkas 41 byte |
| Saat commit baru dibuat, apa yang bergerak? | Berkas di “folder” branch aktif | Hanya penunjuk branch aktif maju |
| Apakah branch lain melihat commit itu? | Tidak, karena foldernya terpisah | Tidak, karena penunjuknya tidak digerakkan |
| Apakah objek berkas terduplikasi antar branch? | Ya, salinan penuh | Tidak; 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 .