Semua tampilan di chapter-chapter sebelumnya — dari --oneline sampai format kustom — menggambar riwayat sebagai daftar lurus: satu commit di atas commit lain. Bentuk itu hanya jujur ketika satu orang mengerjakan satu hal berurutan. Begitu tim bekerja paralel, riwayat menjadi pohon: cabang fitur tumbuh dari titik yang sama, jalur-jalur berjalan berdampingan, lalu merge menyatukannya kembali. Opsi --graph menggambar bentuk pohon itu langsung di terminal — dan kemampuan membacanya adalah bekal wajib untuk meninjau pull request, memahami letak konflik, dan melacak dari mana sebuah perubahan datang. Chapter ini membangun repository bercabang sungguhan lalu membedah grafnya baris demi baris.

Repository dengan Dua Cabang dan Satu Merge #

Kita perlu tiga istilah dari section Branch dan Merging — cukup dua kalimat untuk sekarang: git switch -c <nama> membuat branch baru sekaligus berpindah ke sana, dan git merge <branch> menyatukan branch itu ke posisi kita saat ini. Repository latihan kita menggunakannya untuk menggambar main plus dua cabang fitur:

bash
mkdir latihan-graf && cd latihan-graf
git init -b main
git config user.name "Budi Santoso"
git config user.email "[email protected]"
printf '# Proyek Latihan Graf\n' > README.md
git add README.md
git commit -m "Tambah README proyek"
printf 'Rencana fitur:\n- pencarian\n- tema gelap\n' > rencana.txt
git add rencana.txt
git commit -m "Tambah rencana fitur"
git switch -c fitur-pencarian
printf 'Pencarian:\n- cocokkan sebagian judul\n' > pencarian.txt
git add pencarian.txt
git commit -m "Tambah kerangka pencarian"
git switch main
printf '# Proyek Latihan Graf\n\nRiwayat bercabang untuk latihan graf.\n' > README.md
git add README.md
git commit -m "Perbarui deskripsi proyek"
git switch -c fitur-tema
printf 'Tema gelap:\n- warna latar #111\n' > tema.txt
git add tema.txt
git commit -m "Tambah kerangka tema gelap"
git switch fitur-pencarian
printf 'Pencarian:\n- cocokkan sebagian judul\n- tangani judul kosong\n' > pencarian.txt
git add pencarian.txt
git commit -m "Perbaiki pencarian judul kosong"
git switch main
git merge fitur-pencarian

Output yang Dihasilkan:

text
Merge made by the 'ort' strategy.
 pencarian.txt | 3 +++
 1 file changed, 3 insertions(+)
 create mode 100644 pencarian.txt

Merge berhasil tanpa konflik karena kedua jalur menyentuh berkas yang berbeda. Riwayatnya kini bercabang: dua commit dasar di main, cabang fitur-pencarian dengan dua commit, main dengan satu suntingan sendiri, cabang fitur-tema dengan satu commit yang masih berdiri sendiri, dan satu commit merge yang menyatukan fitur-pencarian ke main — mekanisme lengkapnya dibahas di chapter git merge .

Membaca Graf –graph –oneline #

Bentuk riwayat dari sudut pandang main:

bash
git log --graph --oneline

Output yang Dihasilkan:

text
*   2ba0f74 Merge branch 'fitur-pencarian'
|\  
| * 5edd9b2 Perbaiki pencarian judul kosong
| * b78cf3c Tambah kerangka pencarian
* | 333b5c1 Perbarui deskripsi proyek
|/  
* 790d632 Tambah rencana fitur
* 5d4ee29 Tambah README proyek

Graf dibaca dari atas ke bawah — commit baru di atas, tua di bawah. Kosakatnya sedikit dan tetap sama di semua repository:

SimbolArti
*satu commit
``
| (mengikuti *)commit merge — satu commit dengan dua induk, garisnya terbelah
/\ (mengikuti ``)
kolomsatu jalur kerja paralel

Baris pertama memuat 2ba0f74, commit merge: simbolnya * diikuti |\ yang membelah garis menjadi dua kolom. Kolom kiri adalah jalur first parent — posisi main saat merge dijalankan; kolom kanan adalah jalur fitur-pencarian yang digabungkan. Dua commit fitur pencarian 5edd9b2 dan b78cf3c berada di kolom kanan dengan pola | *; suntingan main 333b5c1 berada di kolom kiri dengan pola * |. Baris |/ menandai kedua jalur turun bersama ke 790d632, induk bersama mereka — persis commit kedua tempat fitur-pencarian dulu ditumbuhkan.

Menampilkan Semua Ref dengan –decorate –all #

Graf di atas hanya menggambar riwayat yang bisa dicapai dari HEAD — cabang fitur-tema tidak kelihatan. Opsi --all memuat seluruh branch, dan --decorate menuliskan nama ref di samping commit ujungnya:

bash
git log --graph --oneline --decorate --all

Output yang Dihasilkan:

text
*   2ba0f74 (HEAD -> main) Merge branch 'fitur-pencarian'
|\  
| * 5edd9b2 (fitur-pencarian) Perbaiki pencarian judul kosong
| * b78cf3c Tambah kerangka pencarian
| | * 12c37b0 (fitur-tema) Tambah kerangka tema gelap
| |/  
|/|   
* | 333b5c1 Perbarui deskripsi proyek
|/  
* 790d632 Tambah rencana fitur
* 5d4ee29 Tambah README proyek

Tiga nama ref kini terbaca: (HEAD -> main) pada commit merge, (fitur-pencarian) menempel pada 5edd9b2, dan (fitur-tema) pada 12c37b0. Cabang tema hadir sebagai kolom ketiga — pola | | * — yang turun dari 333b5c1: cabang itu ditumbuhkan setelah suntingan deskripsi, lalu dibiarkan belum digabungkan. Baris |/| adalah graf yang merekam pertemuan tiga garis sekaligus: jalur tema menyatu ke jalur main, di saat jalur main sendiri masih sejajar dengan jalur pencarian.

Urutan Tampilan: Topologis atau Tanggal #

Urutan baris pada graf bukan kebetulan, dan bisa dikendalikan. Tanpa --graph, git log menyusun commit menurun menurut tanggal — buktinya terlihat bila kita cantumkan jam commitnya:

bash
git log --pretty="%h %cd %s" --date=format:"%H:%M"

Output yang Dihasilkan:

text
2ba0f74 11:10 Merge branch 'fitur-pencarian'
5edd9b2 11:00 Perbaiki pencarian judul kosong
333b5c1 10:00 Perbarui deskripsi proyek
b78cf3c 09:30 Tambah kerangka pencarian
790d632 09:10 Tambah rencana fitur
5d4ee29 09:00 Tambah README proyek

Susunan itu murni kronologis: 5edd9b2 pukul 11.00, disusul 333b5c1 pukul 10.00, lalu b78cf3c pukul 09.30 — commit cabang pencarian dan commit main saling mengipas tanpa peduli jalurnya. Bentuk daftar lurus tanpa graf memang tampil begitu:

bash
git log --oneline

Output yang Dihasilkan:

text
2ba0f74 Merge branch 'fitur-pencarian'
5edd9b2 Perbaiki pencarian judul kosong
333b5c1 Perbarui deskripsi proyek
b78cf3c Tambah kerangka pencarian
790d632 Tambah rencana fitur
5d4ee29 Tambah README proyek

Dengan --graph, Git otomatis beralih ke susunan yang menghormati topologi: anak selalu tampil sebelum induk, dan commit sejalur dikelompokkan berdampingan — itulah sebabnya b78cf3c naik menggandeng 5edd9b2 pada graf pertama kita. Susunan ini bisa diperintah eksplisit dengan --topo-order, dan dikembalikan ke kronologis dengan --date-order:

bash
git log --graph --oneline --topo-order

Output yang Dihasilkan:

text
*   2ba0f74 Merge branch 'fitur-pencarian'
|\  
| * 5edd9b2 Perbaiki pencarian judul kosong
| * b78cf3c Tambah kerangka pencarian
* | 333b5c1 Perbarui deskripsi proyek
|/  
* 790d632 Tambah rencana fitur
* 5d4ee29 Tambah README proyek
bash
git log --graph --oneline --date-order

Output yang Dihasilkan:

text
*   2ba0f74 Merge branch 'fitur-pencarian'
|\  
| * 5edd9b2 Perbaiki pencarian judul kosong
* | 333b5c1 Perbarui deskripsi proyek
| * b78cf3c Tambah kerangka pencarian
|/  
* 790d632 Tambah rencana fitur
* 5d4ee29 Tambah README proyek

Keluaran --topo-order identik dengan graf bawaan kita — urutan bawaan git log --graph memang sudah topologis. Yang berbeda adalah keluaran --date-order: 333b5c1 pukul 10.00 naik mendahului b78cf3c pukul 09.30 sesuai kronologinya, sehingga kelompok dua commit cabang pencarian terpotong oleh commit main. Aturan praktisnya: untuk membaca alur kerja pakai susunan topologis (bawaan --graph); untuk membaca kronologi — misalnya menyusun laporan kejadian — tambahkan --date-order.

Cermin Graf dalam Diagram #

Bentuk yang sama bisa digambar ulang sebagai diagram — berguna untuk dokumentasi dan diskusi tim:

Diagram ini mencerminkan graf terminal baris demi baris: commit merge 2ba0f74 memiliki dua anak panah keluar — dua induknya, 5edd9b2 di jalur pencarian dan 333b5c1 di jalur main; kedua jalur bertemu kembali di 790d632; dan 12c37b0 menggantung di atas 333b5c1 sebagai jalur ketiga yang belum disatukan. Membaca diagram atau membaca graf terminal melatih keterampilan yang sama: menelusuri induk dari sebuah commit untuk menjawab “perubahan ini masuk lewat jalur mana?”.

Graf menjawab bentuk riwayat — cabang mana, kapan menyatu, siapa induk siapa. Pertanyaan pada level yang lebih halus masih terbuka: baris ini di berkas itu diubah siapa, pada commit yang mana — jawabannya di chapter git blame .