Klaim paling penting sejak chapter pertama section ini belum pernah kita buktikan kepala-kepala: commit baru hanya menggerakkan penunjuk branch yang aktif, sehingga riwayat setiap branch menjadi miliknya sendiri. Klaim itu menentukan segalanya — cara tim bekerja paralel, cara fitur berkembang tanpa mengganggu main, sampai cara nanti dua riwayat disatukan kembali lewat merge. Chapter ini menjalankan skenario lengkapnya: commit di branch fitur, pulang ke main, lalu membandingkan dua git log dari satu repository yang sama — dan hasilnya memang dua riwayat yang berbeda.
Membelah Riwayat dengan Empat Commit #
Repository latihan berangkat dari main bercabang ke fitur-latihan; pekerjaan fitur adalah satu berkas baru yang menyunting dua kali:
mkdir latihan-cabang && cd latihan-cabang
git init -b main
git config user.name "Budi Santoso"
git config user.email "[email protected]"
printf '# Modul\n1. intro\n' > modul.md
git add modul.md
git commit -m "Susun intro modul"
printf '# Modul\n1. intro\n2. dasar\n' > modul.md
git add modul.md
git commit -m "Tambah bagian dasar"
git switch -c fitur-latihan
printf '# Latihan\n1. kerjakan\n' > latihan.md
git add latihan.md
git commit -m "Tambah lembar latihan"
printf '# Latihan\n1. kerjakan\n2. kumpulkan\n' > latihan.md
git add latihan.md
git commit -m "Tambah instruksi pengumpulan"
git switch mainOutput yang Dihasilkan (perintah git switch main):
Switched to branch 'main'Kepulangan ini penting: commit berikutnya — seandainya ada — akan dicatat untuk main, bukan fitur-latihan. Sebelum pekerjaan fitur dimulai, kedua penunjuk masih berdiri di titik yang sama:
Dua commit kemudian, keadaannya berubah — main berhenti di “Tambah bagian dasar” sementara fitur-latihan maju dua langkah:
Satu rantai commit yang sama, dua penunjuk pada dua ketinggian yang berbeda. Hash pada diagram milik mesin uji; di mesin pembaca nilainya berbeda tetapi bentuknya sama.
Riwayat main Tidak Memuat Pekerjaan fitur #
Bandingkan kedua riwayat dari posisi duduk yang sama:
git log --oneline mainOutput yang Dihasilkan:
06b9206 Tambah bagian dasar
fa7fa9c Susun intro modulgit log --oneline fitur-latihanOutput yang Dihasilkan:
606877b Tambah instruksi pengumpulan
0c7b823 Tambah lembar latihan
06b9206 Tambah bagian dasar
fa7fa9c Susun intro modulDua commit fitur — “Tambah lembar latihan” dan “Tambah instruksi pengumpulan” — sama sekali tidak muncul di riwayat main. Bagi main, pekerjaan itu belum terjadi. Working tree pun mengikuti: dari main, berkas latihan.md tidak ada:
lsOutput yang Dihasilkan:
modul.mdSedangkan dari fitur-latihan berkas itu ada dengan isi lengkapnya — kita tengok sebentar:
git switch fitur-latihanOutput yang Dihasilkan:
Switched to branch 'fitur-latihan'lsOutput yang Dihasilkan:
latihan.md
modul.mdcat latihan.mdOutput yang Dihasilkan:
# Latihan
1. kerjakan
2. kumpulkanInilah pemisahan yang sesungguhnya: bukan folder terpisah, melainkan satu database objek yang dibaca dari dua ketinggian berbeda. git branch -v merangkum posisi kedua penunjuk dalam satu layar:
git branch -vOutput yang Dihasilkan:
fitur-latihan 606877b Tambah instruksi pengumpulan
* main 06b9206 Tambah bagian dasarBaris fitur-latihan menunjuk 606877b, baris main menunjuk 06b9206 — tepat dua commit di belakang. Pemeriksaan lewat rev-parse memastikan keduanya memang objek yang berbeda:
git rev-parse main fitur-latihanOutput yang Dihasilkan:
06b92068dbd3d02af1a755ae454918a17a067241
606877b45cbc4c193b920843193e7b7ccc521ccaPenunjuk Bergerak Satu per Satu #
Mekanisme di balik semua ini kini bisa dibaca utuh. Setiap commit mencatat satu parent, jadi rantai tetap tunggal — fa7fa9c → 06b9206 → 0c7b823 → 606877b. Ketika commit “Tambah lembar latihan” dibuat, yang bergerak hanyalah berkas penunjuk .git/refs/heads/fitur-latihan karena HEAD saat itu membawa fitur-latihan; berkas .git/refs/heads/main tidak disentuh sama sekali. Satu commit kemudian, proses yang sama berulang: penunjuk fitur-latihan melompat lagi ke 606877b, dan main tetap memegang hash lama. Riwayat tidak “disalin ke branch baru” — branch hanya menentukan titik berhenti membaca rantai dari atas. Cara pandang ini juga menjelaskan kenapa bekerja paralel itu murah: Siti boleh berkomitmen di branch fiturnya dan Budi di main pada saat yang sama, karena keduanya hanya menggeser penunjuk masing-masing di satu database bersama.
Dua riwayat terpisah kini berdiri di satu repository, dan pertanyaan alami berikutnya sudah menggebet: bagaimana caranya mengantarkan pekerjaan fitur-latihan ke main? Jawaban pertama adalah bentuk merge paling sederhana — begitu sederhana sampai Git bahkan tidak membuat commit baru — dan itulah pokok chapter Fast-Forward Merge
.