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:
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 --onelineOutput yang Dihasilkan:
01876fb Tambah istilah repository dan kembalikan pengantar
1d340cc Perbarui pengantar dan tambah glosarium
5d4639a Commit awal situs dokumentasiHash 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:
git diff 5d4639a 1d340ccOutput yang Dihasilkan:
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 proyekAnatomi 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:
git diff 1d340cc 5d4639a --statOutput yang Dihasilkan:
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:
git log --oneline -- README.mdOutput yang Dihasilkan:
01876fb Tambah istilah repository dan kembalikan pengantar
1d340cc Perbarui pengantar dan tambah glosarium
5d4639a Commit awal situs dokumentasiCommit 1d340cc menambah satu baris pengantar; commit 01876fb menghapusnya kembali. Mari bandingkan foto pertama dengan foto terakhir:
git diff 5d4639a 01876fb
git diff 5d4639a 01876fb --statOutput yang Dihasilkan:
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:
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 --decorateOutput yang Dihasilkan:
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 dokumentasiRiwayat 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:
git diff main fitur-rilisOutput yang Dihasilkan:
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 terpilihKeluaran 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:
git diff main...fitur-rilisOutput yang Dihasilkan:
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 terpilihHanya 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:
git tag v1.0 1d340cc
git diff v1.0 mainOutput yang Dihasilkan:
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 berkasnyaKeluaran 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
.