Graf dari chapter Graph History menjawab pertanyaan di level commit: cabang mana, kapan menyatu, siapa induk siapa. Investigasi nyata sering berhenti di pertanyaan yang jauh lebih kecil: baris ini di berkas itu — siapa yang menulisnya, pada commit yang mana, kapan? Sebuah bug biasanya bersembunyi di segelintir baris, dan git blame menjawab pertanyaan itu persis per baris: untuk tiap baris berkas, perintah ini menunjukkan commit terakhir yang menyentuh baris tersebut beserta penulis dan waktunya. Chapter ini membedah format keluarannya, menyaring rentang baris, lalu membongkar satu penyalahpahaman yang paling sering menjebak pengguna baru: blame tidak selalu menunjuk pencipta asli sebuah baris.

Repository Latihan: Tiga Commit pada Satu Berkas #

Repository latihan memakai satu README.md yang disentuh tiga commit dari dua penulis — pola identitas ganda yang sudah akrab dari chapter Opsi git log :

bash
mkdir latihan-blame && cd latihan-blame
git init -b main
git config user.name "Budi Santoso"
git config user.email "[email protected]"
printf '# Aplikasi Catatan\n\nSimpan dan  tampilkan catatan rapat tim.\nCara pakai menyusul di bagian panduan.\n' > README.md
git add README.md
git commit -m "Tambah panduan aplikasi catatan"
printf '# Aplikasi Catatan\n\nSimpan dan  tampilkan catatan rapat tim.\nCara pakai menyusul di bagian panduan.\nBatas tampilan daftar: 1000 baris\nUrutan tampilan: terbaru di atas\n' > README.md
git add README.md
git -c user.name="Siti Rahma" -c user.email="[email protected]" \
  commit -m "Tambah pengaturan tampilan daftar"
printf '# Aplikasi Catatan\n\nSimpan dan tampilkan catatan rapat tim.\nCara pakai menyusul di bagian panduan.\nBatas tampilan daftar: 1000 baris\nUrutan tampilan: terbaru di atas\n' > README.md
git add README.md
git commit -m "Rapikan spasi ganda di panduan"

Riwayatnya ringkas:

bash
git log --oneline

Output yang Dihasilkan:

text
83e5a93 Rapikan spasi ganda di panduan
6ca02db Tambah pengaturan tampilan daftar
c436956 Tambah panduan aplikasi catatan

Berkas finalnya berisi enam baris: empat dari commit pertama (dengan satu baris yang dirapikan di commit ketiga) dan dua dari commit kedua.

Membaca Format Output blame #

Perintah dasarnya menyebut berkas yang ingin ditelusuri:

bash
git blame README.md

Output yang Dihasilkan:

text
^c436956 (Budi Santoso 2026-10-13 09:00:00 +0700 1) # Aplikasi Catatan
^c436956 (Budi Santoso 2026-10-13 09:00:00 +0700 2) 
83e5a937 (Budi Santoso 2026-10-13 09:20:00 +0700 3) Simpan dan tampilkan catatan rapat tim.
^c436956 (Budi Santoso 2026-10-13 09:00:00 +0700 4) Cara pakai menyusul di bagian panduan.
6ca02db4 (Siti Rahma   2026-10-13 09:10:00 +0700 5) Batas tampilan daftar: 1000 baris
6ca02db4 (Siti Rahma   2026-10-13 09:10:00 +0700 6) Urutan tampilan: terbaru di atas

Satu baris keluaran untuk satu baris berkas. Kolomnya dari kiri: hash commit (delapan karakter bawaan), lalu tanda kurung berisi nama penulis, tanggal dan waktu author, zona waktu, dan nomor baris — ditutup isi baris itu sendiri. Beberapa detail layak dicermati: penulis yang ditampilkan adalah author, bukan committer; nama diselaraskan lebar sehingga kolom tanggal rapi sejajar; dan tanggal pada contoh ini tetap karena Course menetapkan GIT_AUTHOR_DATE/GIT_COMMITTER_DATE — pada commit pembaca, waktu mengikuti commit sungguhan, dan hash akan berbeda dari buku ini.

Tanda sisipan ^ sebelum hash pada baris 1, 2, dan 4 menandai boundary commit — commit paling tua yang diperiksa blame sebelum penelusuran berhenti; di sini root commit c436956.

Perhatikan baris 3: hash-nya 83e5a937 — commit perapian — padahal kalimatnya sudah ada sejak commit pertama. Kita kembali ke kejanggalan ini setelah menguasai opsi -L dan -w.

Membatasi Rentang Baris dengan -L #

Berkas besar menghasilkan keluaran blame yang sama besarnya. Opsi -L <mulai>,<akhir> membatasi penelusuran pada rentang baris tertentu — pola standar saat mencurigai segelintir baris:

bash
git blame -L 5,6 README.md

Output yang Dihasilkan:

text
6ca02db4 (Siti Rahma 2026-10-13 09:10:00 +0700 5) Batas tampilan daftar: 1000 baris
6ca02db4 (Siti Rahma 2026-10-13 09:10:00 +0700 6) Urutan tampilan: terbaru di atas

Rentang ini sekaligus menjadi langkah pertama alur kerja klasik “kapan bug ini masuk?”. Kisahnya: halaman daftar aplikasi catatan melambat, dan satu tersangka muncul — baris Batas tampilan daftar: 1000 baris. Kita periksa baris itu saja:

bash
git blame -L 5,5 README.md

Output yang Dihasilkan:

text
6ca02db4 (Siti Rahma 2026-10-13 09:10:00 +0700 5) Batas tampilan daftar: 1000 baris

Baris itu lahir di commit 6ca02db4. Langkah kedua alur kerja: bawa hash itu ke git show untuk membaca niat aslinya:

bash
git show 6ca02db

Output yang Dihasilkan:

text
commit 6ca02db44e9c5e8de25100bf77b8e823b20412f6
Author: Siti Rahma <[email protected]>
Date:   Tue Oct 13 09:10:00 2026 +0700

    Tambah pengaturan tampilan daftar

diff --git a/README.md b/README.md
index 0618836..c303e4a 100644
--- a/README.md
+++ b/README.md
@@ -2,3 +2,5 @@
 
 Simpan dan  tampilkan catatan rapat tim.
 Cara pakai menyusul di bagian panduan.
+Batas tampilan daftar: 1000 baris
+Urutan tampilan: terbaru di atas

Pesan commit menyebut “pengaturan tampilan” tanpa angka; diff-nya memperlihatkan nilai 1000 masuk bersama satu baris lainnya. Dua informasi itu — niat dan isi — biasanya cukup untuk memutuskan langkah berikutnya: hubungi penulisnya, atau perbaiki barisnya. Alur blame -L → git show inilah yang membuat pesan commit yang jelas dari chapter Menulis Commit Message terasa nilainya: blame hanya menunjukkan pintu; pesan commit yang menjelaskan apa yang ada di balik pintu.

Atribusi Menunjuk Penyentuh Terakhir, Bukan Pencipta Awal #

Sekarang kejanggalan baris 3. Blame mengatribusikan baris Simpan dan tampilkan catatan rapat tim. kepada commit 83e5a937 — commit yang judulnya “Rapikan spasi ganda di panduan”. Kita bedah isi commit itu:

bash
git show 83e5a93

Output yang Dihasilkan:

text
commit 83e5a93724e38ce18d526754299869b17c7b2e1e
Author: Budi Santoso <[email protected]>
Date:   Tue Oct 13 09:20:00 2026 +0700

    Rapikan spasi ganda di panduan

diff --git a/README.md b/README.md
index c303e4a..437ad5e 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,6 @@
 # Aplikasi Catatan
 
-Simpan dan  tampilkan catatan rapat tim.
+Simpan dan tampilkan catatan rapat tim.
 Cara pakai menyusul di bagian panduan.
 Batas tampilan daftar: 1000 baris
 Urutan tampilan: terbaru di atas

Seluruh perubahan commit itu adalah satu spasi: dan tampilkan menjadi dan tampilkan. Makna kalimatnya tidak berubah sama sekali — namun karena barisnya tersentuh, blame memindahkan atribusinya ke commit penyentuh. Inilah sifat dasar blame yang harus diingat: blame menunjukkan commit terakhir yang menyentuh baris, bukan commit yang menciptakan isinya. Komit pemformatan ulang — perapian indentasi, penggantian tab, pemangkasan spasi — akan “membajak” atribusi seluruh baris yang dilewatinya, dan penulis aslinya menguap dari keluaran.

Opsi -w menyembuhkan kasus ini dengan memberi tahu blame agar mengabaikan perubahan whitespace saat menelusuri asal baris:

bash
git blame -w -L 3,3 README.md

Output yang Dihasilkan:

text
^c436956 (Budi Santoso 2026-10-13 09:00:00 +0700 3) Simpan dan tampilkan catatan rapat tim.

Atribusi baris 3 kembali ke c436956 — commit yang benar-benar menulis kalimat itu. Ketika riwayat proyek memuat banyak komit pemformatan (umum pada proyek yang pernah menstandarkan gaya kode), git blame -w adalah bentuk pertama yang layak dicoba; opsi serumpun pada git diff dibahas di chapter Whitespace dan Diff Options .

Menampilkan Alamat Surel dengan -e #

Pada tim yang memuat dua orang bernama sama, nama saja tidak cukup untuk menghubungi penulis baris. Opsi -e mengganti nama dengan alamat surel:

bash
git blame -e -L 5,6 README.md

Output yang Dihasilkan:

text
6ca02db4 (<[email protected]> 2026-10-13 09:10:00 +0700 5) Batas tampilan daftar: 1000 baris
6ca02db4 (<[email protected]> 2026-10-13 09:10:00 +0700 6) Urutan tampilan: terbaru di atas

Surel penulis kini tampil dalam tanda kurung siku — cukup untuk memulai percakapan “baris batas tampilan ini kenapa 1000?” tanpa menebak-nebak identitas. Seluruh opsi blame lainnya terdokumentasi di dokumentasi git blame .

Blame menjawab pertanyaan hingga resolusi terkecil — satu baris satu orang. Pertanyaan yang satu arah ke atas justru sering lebih mendesak pada rapat sprint: siapa menyumbang apa dan berapa banyak dalam periode ini? Ringkasan agregat semacam itu punya perintah khusus, dan itulah pokok bahasan chapter berikutnya: git shortlog .