Sepanjang section ini, git diff selalu membandingkan area kerja: working tree dengan index, index dengan HEAD. Padahal setiap commit adalah snapshot yang tersimpan permanen, dan setiap pasangan snapshot bisa dibandingkan langsung — tidak peduli kapan dibuatnya. Perintahnya tetap git diff; yang berubah hanyalah argumennya: dua commit, dua branch, atau sebuah tag. Satu nuansa penting menunggu di tengah chapter: git diff <c1> <c2> membandingkan isi kedua commit sebagai dua foto terpisah, bukan menghitung “semua perubahan yang terjadi antara keduanya” — dua hal yang terdengar sama namun berbeda, dan contoh nyata akan membuktikannya.

Menyiapkan Tiga Titik Riwayat #

Repository latihan berisi tiga commit yang masing-masing menyimpan keadaan berbeda:

bash
mkdir latihan-antar && cd latihan-antar
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
git add README.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
printf '## Glosarium\n\n- commit: catatan satu keadaan proyek\n' > glosarium.md
git add README.md glosarium.md
git commit -m "Perbarui pengantar dan tambah glosarium"
printf '# Situs Dokumentasi\n\nKumpulan catatan teknis tim.\n' > README.md
printf '## Glosarium\n\n- commit: catatan satu keadaan proyek\n- repository: wadah riwayat beserta berkasnya\n' > glosarium.md
git add README.md glosarium.md
git commit -m "Tambah istilah repository dan kembalikan pengantar"
git log --oneline

Output yang Dihasilkan:

text
01876fb Tambah istilah repository dan kembalikan pengantar
1d340cc Perbarui pengantar dan tambah glosarium
5d4639a Commit awal situs dokumentasi

Hash di mesin pembaca akan berbeda karena nilainya dihitung dari isi commit. Perhatikan pesan commit ketiga: pengantar README.md sengaja dikembalikan ke isi semula setelah sempat diperbarui oleh commit kedua — detail ini menjadi bahan pembuktian pada bagian berikutnya.

Membandingkan Dua Titik #

Dua hash commit sebagai argumen membuat git diff membandingkan snapshot milik keduanya:

bash
git diff 5d4639a 1d340cc

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
new file mode 100644
index 0000000..8d5c41f
--- /dev/null
+++ b/glosarium.md
@@ -0,0 +1,3 @@
+## Glosarium
+
+- commit: catatan satu keadaan proyek

Anatomi keluaran sama persis dengan yang dibedah pada chapter Melihat Perbedaan Perubahan — sisi a/ adalah foto commit pertama, sisi b/ foto commit kedua. Blok kedua memperkenalkan tiga varian kepala diff untuk berkas baru: baris new file mode 100644, hash sisi lama tertulis 0000000, dan sisi lama bernama /dev/null. Hunk pembukanya berbunyi @@ -0,0 +1,3 @@ — sisi lama menampilkan nol baris karena memang belum ada isinya.

Bentuk dua titik git diff 5d4639a..1d340cc menghasilkan keluaran yang identik dengan bentuk spasi. Arah argumen tetap menentukan sisi: membalik urutan commit menukar posisi a/ dan b/, sehingga keluarannya tampak seperti pembatalan:

bash
git diff 1d340cc 5d4639a --stat

Output yang Dihasilkan:

text
 README.md    | 1 -
 glosarium.md | 3 ---
 2 files changed, 4 deletions(-)

Membandingkan Foto, Bukan Perjalanan #

Sekarang momen kejujuran yang dijanjikan pembuka chapter. Kedua commit terakhir sama-sama menyentuh README.md — buktinya bisa dilihat dari riwayat yang difilter per berkas:

bash
git log --oneline -- README.md

Output yang Dihasilkan:

text
01876fb Tambah istilah repository dan kembalikan pengantar
1d340cc Perbarui pengantar dan tambah glosarium
5d4639a Commit awal situs dokumentasi

Commit 1d340cc menambah satu baris pengantar; commit 01876fb menghapusnya kembali. Mari bandingkan foto pertama dengan foto terakhir:

bash
git diff 5d4639a 01876fb
git diff 5d4639a 01876fb --stat

Output yang Dihasilkan:

text
diff --git a/glosarium.md b/glosarium.md
new file mode 100644
index 0000000..c768c01
--- /dev/null
+++ b/glosarium.md
@@ -0,0 +1,4 @@
+## Glosarium
+
+- commit: catatan satu keadaan proyek
+- repository: wadah riwayat beserta berkasnya
 glosarium.md | 4 ++++
 1 file changed, 4 insertions(+)

README.md tidak muncul sama sekali — baik di diff maupun di --stat. Padahal dua commit di antara keduanya rajin menyentuhnya: 1d340cc menambah baris (README.md | 1 + pada git show 1d340cc --stat), 01876fb menghapus baris yang sama (README.md | 1 - pada stat-nya).

Diff Antar Branch #

Branch memungkinkan riwayat bercabang, dan dua cabang pun bisa dibandingkan. Penjelasan penuh tentang branch menempati section Branch dan Merging ; untuk sekarang cukup dua kalimat: branch adalah penanda bergerak yang menunjuk satu commit, dan git switch -c <nama> membuat branch baru sekaligus berpindah ke sana. Kita lanjutkan repository yang sama:

bash
git switch -c fitur-rilis
printf '## Glosarium\n\n- commit: catatan satu keadaan proyek\n- repository: wadah riwayat beserta berkasnya\n- staging area: keranjang perubahan terpilih\n' > glosarium.md
git add glosarium.md
git commit -m "Tambah istilah staging pada glosarium"
git switch main
printf '# Situs Dokumentasi\n\nKumpulan catatan teknis tim.\nKini dilengkapi panduan kontributor singkat.\n' > README.md
git add README.md
git commit -m "Perbarui pengantar halaman utama"
git log --oneline --all --decorate

Output yang Dihasilkan:

text
Switched to a new branch 'fitur-rilis'
[fitur-rilis 9e82070] Tambah istilah staging pada glosarium
 1 file changed, 1 insertion(+)
Switched to branch 'main'
[main 33feec4] Perbarui pengantar halaman utama
 1 file changed, 1 insertion(+)
33feec4 (HEAD -> main) Perbarui pengantar halaman utama
9e82070 (fitur-rilis) Tambah istilah staging pada glosarium
01876fb Tambah istilah repository dan kembalikan pengantar
1d340cc Perbarui pengantar dan tambah glosarium
5d4639a Commit awal situs dokumentasi

Riwayat kini bercabang di 01876fb:

Diagram tersebut memetakan lima commit pada dua jalur: main berujung di 33feec4, fitur-rilis berujung di 9e82070, dan keduanya berpisah di 01876fb. Membandingkan dua ujung jalur berarti membandingkan dua foto terjauh:

bash
git diff main fitur-rilis

Output yang Dihasilkan:

text
diff --git a/README.md b/README.md
index 820e03c..5d6c796 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,3 @@
 # Situs Dokumentasi
 
 Kumpulan catatan teknis tim.
-Kini dilengkapi panduan kontributor singkat.
diff --git a/glosarium.md b/glosarium.md
index c768c01..97af9de 100644
--- a/glosarium.md
+++ b/glosarium.md
@@ -2,3 +2,4 @@
 
 - commit: catatan satu keadaan proyek
 - repository: wadah riwayat beserta berkasnya
+- staging area: keranjang perubahan terpilih

Keluaran ini menampar dengan fakta yang perlu dibaca pelan: blok README.md berasal dari pekerjaan main, bukan fitur-rilis — branch fitur-rilis tidak pernah menyentuh README.md. Membandingkan dua ujung mencampurkan kerja kedua jalur dalam satu keluaran. Untuk bertanya “apa yang dikerjakan fitur-rilis sejak berpisah dari main”, tiga titik dipakai:

bash
git diff main...fitur-rilis

Output yang Dihasilkan:

text
diff --git a/glosarium.md b/glosarium.md
index c768c01..97af9de 100644
--- a/glosarium.md
+++ b/glosarium.md
@@ -2,3 +2,4 @@
 
 - commit: catatan satu keadaan proyek
 - repository: wadah riwayat beserta berkasnya
+- staging area: keranjang perubahan terpilih

Hanya glosarium.md yang tampil. Bentuk main...fitur-rilis membandingkan foto fitur-rilis dengan merge-base kedua branch — titik percabangan 01876fb, yang dapat ditemukan lewat git merge-base main fitur-rilis. Perbedaan bentuk dua-titik dan tiga-titik ini dirinci pada dokumentasi git diff . Keluaran diff menjadi: “isi yang fitur-rilis tambahkan sejak titik itu”, bersih dari kemajuan apa pun di main.

Diff Terhadap Tag #

Tag adalah penanda tetap pada satu titik riwayat, biasanya untuk penandaan rilis — pembahasan lengkapnya ada di section Tags dan Releases . Bagi git diff, tag berlaku persis seperti commit yang ditunjuknya:

bash
git tag v1.0 1d340cc
git diff v1.0 main

Output yang Dihasilkan:

text
diff --git a/README.md b/README.md
index 663b3c9..820e03c 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
 # Situs Dokumentasi
 
 Kumpulan catatan teknis tim.
-Bagian panduan pengguna ditambahkan di halaman utama.
+Kini dilengkapi panduan kontributor singkat.
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

Keluaran ini menjawab pertanyaan klasik pengembangan: “apa saja yang berubah sejak rilis 1.0?” — bentuk yang sama berlaku untuk git diff v1.0 v2.0 saat dua tag rilis sudah ada.

Kemampuan membandingkan titik-titik riwayat melengkapi satu sisi peta. Sisi lain yang sama pentingnya adalah memastikan isi calon commit: kombinasi git diff, git diff --staged, dan git diff HEAD pada keadaan kerja yang ramai. Lanjut ke Diff Staged dan Unstaged .