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:

bash
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 main

Output yang Dihasilkan (perintah git switch main):

text
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:

bash
git log --oneline main

Output yang Dihasilkan:

text
06b9206 Tambah bagian dasar
fa7fa9c Susun intro modul
bash
git log --oneline fitur-latihan

Output yang Dihasilkan:

text
606877b Tambah instruksi pengumpulan
0c7b823 Tambah lembar latihan
06b9206 Tambah bagian dasar
fa7fa9c Susun intro modul

Dua 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:

bash
ls

Output yang Dihasilkan:

text
modul.md

Sedangkan dari fitur-latihan berkas itu ada dengan isi lengkapnya — kita tengok sebentar:

bash
git switch fitur-latihan

Output yang Dihasilkan:

text
Switched to branch 'fitur-latihan'
bash
ls

Output yang Dihasilkan:

text
latihan.md
modul.md
bash
cat latihan.md

Output yang Dihasilkan:

text
# Latihan
1. kerjakan
2. kumpulkan

Inilah 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:

bash
git branch -v

Output yang Dihasilkan:

text
  fitur-latihan 606877b Tambah instruksi pengumpulan
* main          06b9206 Tambah bagian dasar

Baris fitur-latihan menunjuk 606877b, baris main menunjuk 06b9206 — tepat dua commit di belakang. Pemeriksaan lewat rev-parse memastikan keduanya memang objek yang berbeda:

bash
git rev-parse main fitur-latihan

Output yang Dihasilkan:

text
06b92068dbd3d02af1a755ae454918a17a067241
606877b45cbc4c193b920843193e7b7ccc521cca

Penunjuk 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 .