Tiga bentuk git diff — polos, --staged, dan HEAD — sudah diperkenalkan pada chapter Memahami Working Tree lewat satu berkas. Kondisi nyata jarang seapik itu: pekerjaan harian biasanya meninggalkan beberapa berkas berbeda keadaan sekaligus, dan keputusan commit diambil di tengah kekacauan itu. Chapter ini menyusun medan kerja yang lebih jujur — satu berkas setengah staged, satu berkas penuh di keranjang, satu berkas belum terlacak — lalu membuktikan bahwa ketiga perintah diff menghasilkan tiga kisah yang benar-benar berbeda. Ujian akhirnya sederhana namun menentukan: commit yang dibuat hanya memuat satu dari tiga kisah itu, dan dua sisanya tetap menunggu di working tree.

Medan Kerja: Tiga Berkas, Tiga Keadaan #

Repository latihan dibangun bertahap sampai ketiga berkas mencapai keadaan yang berbeda:

bash
mkdir latihan-mm && cd latihan-mm
git init -b main
git config user.name "Budi Santoso"
git config user.email "[email protected]"
printf '# Situs Dokumentasi\n\nKumpulan catatan teknis tim.\n' > README.md
printf '## Glosarium\n\n- commit: catatan satu keadaan proyek\n' > glosarium.md
git add README.md glosarium.md
git commit -m "Commit awal situs dokumentasi"
printf '# Situs Dokumentasi\n\nKumpulan catatan teknis tim.\nBagian panduan pengguna ditambahkan di halaman utama.\n' > README.md
git add README.md
printf '# Situs Dokumentasi\n\nKumpulan catatan teknis tim.\nBagian panduan pengguna ditambahkan di halaman utama.\nGlosarium singkat kini tertaut dari halaman utama.\n' > README.md
printf '## Glosarium\n\n- commit: catatan satu keadaan proyek\n- repository: wadah riwayat beserta berkasnya\n' > glosarium.md
git add glosarium.md
printf 'Rapat pekanan: evaluasi struktur panduan.\n' > catatan-rapat.txt
git status -s

Output yang Dihasilkan:

text
MM README.md
M  glosarium.md
?? catatan-rapat.txt

Format ringkas dari chapter git status merangkum medan kerja dalam tiga baris: README.md membawa dua lapis perubahan (suntingan pertama sudah di-git add, suntingan kedua belum), glosarium.md sepenuhnya berada di keranjang, dan catatan-rapat.txt belum terlacak oleh Git. Versi panjang memperlihatkan pembagian daftarnya:

bash
git status

Output yang Dihasilkan:

text
On branch main
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
	modified:   README.md
	modified:   glosarium.md

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
	modified:   README.md

Untracked files:
  (use "git add <file>..." to include in what will be committed)
	catatan-rapat.txt

README.md muncul di dua daftar sekaligus — pola MM yang sama dengan chapter Modified, Staged, dan Committed , kini berdampingan dengan dua berkas lain yang keadaannya tunggal.

Tiga Perintah, Tiga Jawaban Berbeda #

Perintah pertama membaca pekerjaan yang belum masuk keranjang:

bash
git diff

Output yang Dihasilkan:

text
diff --git a/README.md b/README.md
index 663b3c9..b42bd08 100644
--- a/README.md
+++ b/README.md
@@ -2,3 +2,4 @@
 
 Kumpulan catatan teknis tim.
 Bagian panduan pengguna ditambahkan di halaman utama.
+Glosarium singkat kini tertaut dari halaman utama.

Satu-satunya isi keluaran adalah suntingan kedua README.md — working tree dibandingkan dengan index, dan index sudah memuat suntingan pertama. Perubahan glosarium.md tidak muncul karena versi working tree-nya identik dengan index-nya. Perintah kedua membaca isi keranjang:

bash
git diff --staged

Output yang Dihasilkan:

text
diff --git a/README.md b/README.md
index 5d6c796..663b3c9 100644
--- a/README.md
+++ b/README.md
@@ -1,3 +1,4 @@
 # Situs Dokumentasi
 
 Kumpulan catatan teknis tim.
+Bagian panduan pengguna ditambahkan di halaman utama.
diff --git a/glosarium.md b/glosarium.md
index 8d5c41f..c768c01 100644
--- a/glosarium.md
+++ b/glosarium.md
@@ -1,3 +1,4 @@
 ## Glosarium
 
 - commit: catatan satu keadaan proyek
+- repository: wadah riwayat beserta berkasnya

Inilah isi calon commit berikutnya, persis: suntingan pertama README.md dan entri baru glosarium.md — keduanya diambil dari index dan dibandingkan dengan HEAD. Suntingan kedua README.md tidak hadir karena belum pernah di-git add. Opsi kembar --cached menghasilkan keluaran yang sama persis — dokumentasi git diff mencatat keduanya sebagai sinonim. Perintah ketiga menggabungkan semuanya:

bash
git diff HEAD

Output yang Dihasilkan:

text
diff --git a/README.md b/README.md
index 5d6c796..b42bd08 100644
--- a/README.md
+++ b/README.md
@@ -1,3 +1,5 @@
 # Situs Dokumentasi
 
 Kumpulan catatan teknis tim.
+Bagian panduan pengguna ditambahkan di halaman utama.
+Glosarium singkat kini tertaut dari halaman utama.
diff --git a/glosarium.md b/glosarium.md
index 8d5c41f..c768c01 100644
--- a/glosarium.md
+++ b/glosarium.md
@@ -1,3 +1,4 @@
 ## Glosarium
 
 - commit: catatan satu keadaan proyek
+- repository: wadah riwayat beserta berkasnya

Working tree dibandingkan langsung dengan HEAD tanpa lewat index, sehingga kedua suntingan README.md — yang staged maupun yang belum — tampil bersamaan. Tiga perintah pada keadaan yang sama menghasilkan tiga keluaran berbeda; semuanya benar, yang membedakan hanya pasangan area yang ditanya.

Yang Masuk Commit Hanyalah yang Staged #

Bukti terakhir bahwa git diff --staged memang isi commit: kita jalankan commit-nya.

bash
git commit -m "Perbarui pengantar dan tambah istilah repository"
git status -s
git show HEAD --stat

Output yang Dihasilkan:

text
[main 21d0d01] Perbarui pengantar dan tambah istilah repository
 2 files changed, 2 insertions(+)
 M README.md
?? catatan-rapat.txt
commit 21d0d0153c70f7ee2c5dcfe6f74a7a1394eb314c
Author: Budi Santoso <[email protected]>
Date:   Tue Oct 13 11:00:00 2026 +0700

    Perbarui pengantar dan tambah istilah repository

 README.md    | 1 +
 glosarium.md | 1 +
 2 files changed, 2 insertions(+)

Stat commit cocok persis dengan isi git diff --staged sebelumnya: satu baris dari README.md, satu baris dari glosarium.md. Hash 21d0d01 — baik bentuk pendeknya maupun bentuk lengkap pada baris commit — dihitung dari isi commit, jadi nilainya berbeda di mesin pembaca. Sementara itu git status -s pasca-commit masih menampilkan dua sisa: README.md tetap M (suntingan keduanya tertinggal) dan catatan-rapat.txt tetap ??. git diff pun masih menampilkan baris Glosarium singkat kini tertaut dari halaman utama. — pekerjaan yang menunggu commit berikutnya.

Urutan Pemeriksaan Sebelum Commit #

Ketiga perintah itu membentuk urutan pemeriksaan alami sebelum mengetik git commit:

  1. git status -s — peta keadaan: berkas mana yang berubah, mana yang di keranjang, mana yang belum terlacak.
  2. git diff — pekerjaan yang belum masuk keranjang: apakah ada suntingan yang terlupakan atau justru tidak ingin disertakan?
  3. git diff --staged — isi calon commit: inilah yang akan tercatat permanen, periksa baris demi baris.
  4. git commit — mengeksekusi keputusan yang sudah matang.

Rangkuman padatnya satu tabel:

PerintahMembandingkanPertanyaan yang dijawab
git diffworking tree vs indexapa yang berubah sejak git add terakhir?
git diff --stagedindex vs HEADapa persisnya isi commit berikutnya?
git diff HEADworking tree vs HEADseberapa jauh totalnya menyimpang dari commit terakhir?

Urutan ini bekerja mulus saat keluaran diff bersih dan mudah dibaca. Kenyataannya, diff sering berisik: perubahan indentasi membanjiri keluaran, baris konteks terasa terlalu banyak atau terlalu sedikit, dan kesalahan whitespace menyusup tanpa terlihat. Perintah git diff menyediakan opsi untuk setiap keluhan itu. Lanjut ke Whitespace dan Opsi Diff .