Daftar judul dari git log memberi tahu kapan sebuah perubahan tercatat dan siapa pencatatnya, tetapi judul saja tidak memperlihatkan baris mana yang benar-benar berubah. Perintah git diff menjawab pertanyaan itu: ia membandingkan dua keadaan berkas lalu mencetak perbedaannya baris demi baris. Tanpa argumen, pembandingnya adalah staging area — inilah bentuk yang paling sering dipakai sehari-hari. Chapter ini membedah format keluarannya satu per satu, mencoba dua suntingan nyata, lalu membandingkan dua commit lewat rentang hash.

Kembali ke Repository Latihan #

Repository bercabang dari chapter sebelumnya sudah menunaikan tugasnya, jadi kita kembali ke direktori latihan-dasar yang berisi enam commit:

bash
cd ../latihan-dasar
git status -s

Output yang Dihasilkan:

text
?? draf-catatan.txt

Keadaan bersih — hanya draf rapat yang tetap untracked. Sebagai bahan latihan, kita sunting glosarium.md dengan dua perubahan sekaligus: memperjelas definisi staging area dan menambah entri baru untuk tag:

bash
printf '## Glosarium\n\n- commit: catatan satu keadaan proyek\n- staging area: keranjang perubahan terpilih sebelum commit\n- repository: wadah riwayat beserta berkasnya\n- working tree: salinan berkas yang sedang disunting\n- tag: penanda titik rilis versi\n' > glosarium.md
git diff

Output yang Dihasilkan:

text
diff --git a/glosarium.md b/glosarium.md
index 5e5d750..170e029 100644
--- a/glosarium.md
+++ b/glosarium.md
@@ -1,6 +1,7 @@
 ## Glosarium
 
 - commit: catatan satu keadaan proyek
-- staging area: keranjang perubahan terpilih
+- staging area: keranjang perubahan terpilih sebelum commit
 - repository: wadah riwayat beserta berkasnya
 - working tree: salinan berkas yang sedang disunting
+- tag: penanda titik rilis versi

Tiga belas baris itu memuat seluruh informasi perbedaan antara staging area dan working tree. Angka pendek 5e5d750 dan 170e029 pada baris index adalah hash blob versi lama dan versi baru — hash berbeda di mesin pembaca karena hash dihitung dari isi berkas.

Membaca Keluaran Baris demi Baris #

Format di atas bernama unified diff — format yang sama dipakai patch di dunia Unix. Setiap jenis baris punya peran tetap:

Baris keluaranArti
diff --git a/glosarium.md b/glosarium.mdKepala diff: berkas yang sedang dibandingkan
index 5e5d750..170e029 100644Hash blob versi lama..versi baru, disusul mode berkas 100644 (berkas reguler)
--- a/glosarium.mdSisi lama perbandingan — awalan a/ berarti before
+++ b/glosarium.mdSisi baru perbandingan — awalan b/ berarti after
@@ -1,6 +1,7 @@Kepala hunk: posisi perubahan pada sisi lama dan sisi baru
Baris berawalan spasiBaris konteks — tidak berubah, ditampilkan sebagai pijakan lokasi
Baris berawalan -Baris versi lama yang dihapus atau diganti
Baris berawalan +Baris versi baru yang menggantikan atau menambah

Kepala hunk @@ -1,6 +1,7 @@ adalah bagian yang paling sering membuat bingung, padahal polanya sederhana. Sisi kiri -1,6 berarti: pada berkas lama, hunk ini mulai di baris 1 dan membentang 6 baris. Sisi kanan +1,7 berarti: pada berkas baru, hunk yang sama mulai di baris 1 dan membentang 7 baris. Hitungannya cocok — baris konteks ada 5, baris lama yang diganti 1, jadi sisi lama 6 baris; sisi baru menambah 2 baris pengganti dan entri baru, total 7 baris.

Perubahan satu baris yang diganti selalu tampak sebagai pasangan - dan + — Git tidak menyimpan “baris diedit”, melainkan menghapus versi lama dan menambah versi baru. Itulah sebabnya statistik commit pada chapter git commit menghitung satu suntingan sebagai satu deletion ditambah satu insertion.

Suntingan Kedua dan Batas git diff #

git diff tanpa argumen hanya membandingkan working tree dengan staging area — dan batas ini baru terasa ketika sebagian perubahan sudah di-stage. Kita tambahkan tautan belajar pada README.md lalu langsung stage:

bash
printf '%s\n' '- Gittutorial: git-scm.com/docs/gittutorial' >> README.md
git add README.md
git status -s

Output yang Dihasilkan:

text
M  README.md
 M glosarium.md
?? draf-catatan.txt

Dua suntingan kini berada di dua kolom berbeda: README.md berkode M (perubahan di staging area), glosarium.md berkode M (perubahan di working tree) — persis tabel dua kolom dari chapter git status . Perintah git diff dijalankan ulang pun keluarannya identik dengan blok pertama chapter ini: hanya glosarium.md, karena README.md sudah tidak berbeda dari staging area. Suntingan yang sudah di-stage berpindah ke pembanding lain:

bash
git diff --cached

Output yang Dihasilkan:

text
diff --git a/README.md b/README.md
index c1a5e96..0ec3163 100644
--- a/README.md
+++ b/README.md
@@ -5,3 +5,4 @@ Bagian panduan pengguna ditambahkan di halaman utama.
 
 ## Referensi
 - Pro Git: git-scm.com/book
+- Gittutorial: git-scm.com/docs/gittutorial

Tiga bentuk pembanding membentuk segitiga working tree — staging area — commit terakhir:

PerintahMembandingkan
git diffWorking tree dengan staging area
git diff --cachedStaging area dengan HEAD
git diff HEADWorking tree dengan HEAD — gabungan keduanya

Bentuk ketiga menampilkannya sekaligus:

bash
git diff HEAD

Output yang Dihasilkan:

text
diff --git a/README.md b/README.md
index c1a5e96..0ec3163 100644
--- a/README.md
+++ b/README.md
@@ -5,3 +5,4 @@ Bagian panduan pengguna ditambahkan di halaman utama.
 
 ## Referensi
 - Pro Git: git-scm.com/book
+- Gittutorial: git-scm.com/docs/gittutorial
diff --git a/glosarium.md b/glosarium.md
index 5e5d750..170e029 100644
--- a/glosarium.md
+++ b/glosarium.md
@@ -1,6 +1,7 @@
 ## Glosarium
 
 - commit: catatan satu keadaan proyek
-- staging area: keranjang perubahan terpilih
+- staging area: keranjang perubahan terpilih sebelum commit
 - repository: wadah riwayat beserta berkasnya
 - working tree: salinan berkas yang sedang disunting
+- tag: penanda titik rilis versi

Kedua berkas muncul berurutan dalam satu keluaran — diff README.md disusul diff glosarium.md. Fase-fase perubahan di antara ketiga area ini — termasuk kasus satu berkas dengan dua lapis suntingan — dibahas tuntas pada section Melacak Perubahan .

Ringkasan dengan –stat #

Untuk meninjau banyak berkas sekaligus, opsi --stat memampatkan setiap diff menjadi satu baris statistik:

bash
git diff --stat

Output yang Dihasilkan:

text
 glosarium.md | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

Angka 3 di samping ++- menghitung total baris yang tersentuh: dua penambahan dan satu penghapusan. Tanda plus-minus di grafik kolom menunjukkan komposisi perubahan setiap berkas, dan dua baris terakhir merangkum seluruh berkas. Opsi ini pas dipakai sebelum commit sebagai pemeriksaan cepat — “berkas apa saja dan seberapa besar perubahannya” — tanpa membaca isi patchnya.

Membandingkan Dua Commit #

git diff juga menerima dua titik riwayat. Commit yang dipakai di sini adalah commit keempat b1b2ec8 (Tambah tanya jawab kontribusi) dan commit ketiga ea43d56 (Tambah panduan dan catatan rilis):

bash
git diff ea43d56..b1b2ec8

Output yang Dihasilkan:

text
diff --git a/docs/faq.md b/docs/faq.md
index 7570c2a..cb3c9f0 100644
--- a/docs/faq.md
+++ b/docs/faq.md
@@ -2,3 +2,6 @@
 
 Q: Di mana melihat riwayat perubahan?
 A: Lewat git log.
+
+Q: Bagaimana mulai berkontribusi?
+A: Mulai dari docs/panduan-instalasi.md.

Rentang ea43d56..b1b2ec8 dibaca “perbedaan dari commit pertama menuju commit kedua” — hasilnya adalah isi patch commit kedua. Hash pada contoh akan berbeda di mesin pembaca, tapi polanya tetap: dua hash dipisah dua titik. Rentang yang lebih jauh tinggal dipadukan dengan --stat untuk meninjau sekilas:

bash
git diff 462b791..ea43d56 --stat

Output yang Dihasilkan:

text
 CATATAN-RILIS.md          | 3 +++
 README.md                 | 6 +++++-
 catatan-latihan.txt       | 1 +
 docs/agenda.txt           | 1 +
 docs/faq.md               | 4 ++++
 docs/panduan-instalasi.md | 3 +++
 glosarium.md              | 2 ++
 7 files changed, 19 insertions(+), 1 deletion(-)

Tujuh berkas, 19 baris ditambah, satu dihapus — persis statistik yang dilihat pada keluaran commit ea43d56 di chapter git commit . Kombinasi rentang dan --stat seperti ini berguna untuk meninjau kumpulan commit sebelum dikirim ke rekan kerja. Daftar lengkap opsi git diff — termasuk mengabaikan whitespace — terdokumentasi pada dokumentasi git diff dan dibahas lebih jauh pada section Melacak Perubahan .

Latihan diff selesai; kedua suntingan kita urungkan dengan pasangan restore yang sudah dikenal dari chapter git add :

bash
git restore --staged README.md
git restore README.md glosarium.md
git status -s

Output yang Dihasilkan:

text
?? draf-catatan.txt

Staging area kosong, working tree kembali bersih, dan draf-catatan.txt tetap menunggu nasibnya. Repository kini berdiri di keadaan semula — enam commit, tanpa satu suntingan tersisa.

git diff menghubungkan dua titik — dua area kerja, atau dua commit. Kadang yang ingin kita periksa justru satu commit tunggal: siapa pembuatnya, pesannya, dan patch lengkapnya dalam satu tampilan. Untuk itu Git menyediakan git show .