Perintah git diff menampilkan perubahan berbentuk baris yang ditambahkan dan dihapus, dan kekuatannya terletak pada kemampuannya membandingkan dua keadaan mana pun. Topik ini membahas tiga perbandingan yang paling sering dipakai, yaitu working directory terhadap staging area, staging area terhadap commit terakhir, dan dua commit mana pun terhadap satu sama lain. Membaca keluaran diff dengan lancar adalah keterampilan inti sebelum commit dan sebelum review.
Perubahan yang belum di-stage#
Secara bawaan, git diff membandingkan working directory dengan staging area, sehingga menampilkan perubahan yang belum di-git add. Siapkan repository dengan satu commit dasar, lalu ubah berkasnya.
# tanggal commit ditetapkan agar keluaran contoh dapat direproduksi secara persis
export GIT_AUTHOR_DATE="2026-11-01T09:00:00+07:00"
export GIT_COMMITTER_DATE="2026-11-01T09:00:00+07:00"rm -rf /tmp/lab-diff
mkdir /tmp/lab-diff
cd /tmp/lab-diff
git init -b main
git config user.name "Budi"
git config user.email "[email protected]"
printf "Daftar belanja:\nBeras\nMinyak\nGula\n" > belanja.txt
git add belanja.txt
git commit -m "Daftar belanja awal"
printf "Daftar belanja:\nBeras\nMinyak goreng\nGula\nKopi\n" > belanja.txt
git diffInitialized empty Git repository in /tmp/lab-diff/.git/
[main (root-commit) 5fe3bf4] Daftar belanja awal
1 file changed, 4 insertions(+)
create mode 100644 belanja.txt
diff --git a/belanja.txt b/belanja.txt
index d49105f..b233aef 100644
--- a/belanja.txt
+++ b/belanja.txt
@@ -1,4 +1,5 @@
Daftar belanja:
Beras
-Minyak
+Minyak goreng
Gula
+KopiAnatomi keluaran ini tetap sama pada semua perbandingan. Baris --- a/belanja.txt dan +++ b/belanja.txt menunjuk versi lama dan versi baru. Baris yang diawali tanda minus dihapus, baris yang diawali tanda plus ditambahkan, dan baris tanpa tanda adalah konteks yang tidak berubah. Baris @@ -1,4 +1,4 @@ adalah kepala hunk yang menyatakan posisi perubahan pada kedua versi, yaitu mulai baris satu sepanjang empat baris.
Perubahan yang sudah di-stage#
Setelah git add, perubahan pindah ke staging area dan berhenti muncul pada git diff biasa. Untuk melihat isi staging area dibandingkan commit terakhir, gunakan git diff --staged.
git add belanja.txt
git diff
git diff --stageddiff --git a/belanja.txt b/belanja.txt
index d49105f..b233aef 100644
--- a/belanja.txt
+++ b/belanja.txt
@@ -1,4 +1,5 @@
Daftar belanja:
Beras
-Minyak
+Minyak goreng
Gula
+KopiBlok git diff pertama menghasilkan keluaran kosong karena tidak ada lagi selisih antara working directory dan staging area, sedangkan --staged menampilkan perubahan yang menunggu commit. Kedua perbandingan ini menjawab dua pertanyaan yang berbeda: apa yang belum disiapkan, dan apa yang akan masuk commit berikutnya. Sebelum git commit, git diff --staged adalah peninjauan terakhir yang paling murah.
Membandingkan dua commit#
Perbandingan ketiga mengambil dua keadaan dari riwayat. Setelah perubahan di atas di-commit, git diff antara dua commit terakhir menampilkan dampak commit tersebut terhadap keseluruhan riwayat.
git commit -m "Perbaiki item minyak dan tambah kopi"
git diff HEAD~1 HEAD[main 166dd52] Perbaiki item minyak dan tambah kopi
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/belanja.txt b/belanja.txt
index d49105f..b233aef 100644
--- a/belanja.txt
+++ b/belanja.txt
@@ -1,4 +1,5 @@
Daftar belanja:
Beras
-Minyak
+Minyak goreng
Gula
+KopiNama HEAD adalah commit saat ini, dan HEAD~1 adalah commit di belakangnya, sehingga git diff HEAD~1 HEAD berarti tampilkan dampak commit terakhir. Dua commit mana pun dapat dipasangkan dengan cara yang sama, termasuk commit merge. Bentuk khusus git diff HEAD~1 tanpa argumen kedua menyamakan keadaan akhirnya dengan working directory.
Ringkasan per berkas#
Pada perubahan yang menyentuh banyak berkas, keluaran diff penuh menjadi panjang, dan opsi --stat memberikan ringkasan per berkas terlebih dahulu.
git diff --stat HEAD~1 HEAD belanja.txt | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)Setiap baris menyebut berkasnya, jumlah baris yang berubah, dan grafik persegi yang proporsional terhadap besar perubahannya. Opsi ini biasa dipanggil sebelum membaca diff penuh, karena arah perhatian langsung tertuju pada berkas yang berubah paling banyak.
Pembatasan per berkas#
Pada perubahan yang menyentuh banyak berkas, diff dapat dibatasi pada berkas tertentu dengan menyebut jalurnya di akhir perintah. Tambahkan berkas kedua yang juga berubah, lalu bandingkan perilaku dengan dan tanpa pembatasan.
printf "Daftar tugas:\nBelanja\n" > tugas.txt
printf "Daftar belanja:\nBeras\nMinyak goreng\nGula\nKopi\nTeh\n" > belanja.txt
git diff --stat
git diff -- belanja.txt belanja.txt | 1 +
1 file changed, 1 insertion(+)
diff --git a/belanja.txt b/belanja.txt
index b233aef..ffbe33d 100644
--- a/belanja.txt
+++ b/belanja.txt
@@ -3,3 +3,4 @@ Beras
Minyak goreng
Gula
Kopi
+TehBentuk git diff -- belanja.txt menampilkan hanya berkas yang disebut, dan pemisah -- memastikan nama yang mengikutinya dibaca sebagai jalur berkas, bukan sebagai nama commit. Pembatasan ini berlaku untuk seluruh bentuk perbandingan, termasuk git diff HEAD~1 HEAD -- berkas, sehingga dampak satu commit terhadap satu berkas dapat diambil secara langsung.
Membaca kepala hunk lebih dekat#
Kepala hunk @@ -2,4 +2,5 @@ memuat angka-angka yang semuanya dapat dibaca. Angka setelah tanda minus menyatakan posisi awal dan panjang blok pada versi lama, sedangkan angka setelah tanda plus menyatakan posisi dan panjang pada versi baru. Panjang yang berbeda di kedua sisi berarti jumlah barisnya berubah, dan kepala hunk yang berbentuk @@ -3 +3 @@ tanpa koma berarti satu baris tunggal di kedua sisi.
Baris konteks yang mendahului dan mengikuti perubahan, sebanyak tiga baris secara bawaan, dipilih Git agar setiap hunk dapat dibaca tanpa membuka berkas penuh. Kepala hunk juga berisi petunjuk nama fungsi apabila berkasnya berupa kode, sehingga posisi perubahan di dalam struktur program ikut terbaca. Membaca hunk satu per satu dari atas ke bawah adalah cara tercepat menafsirkan dampak perubahan secara lengkap.
Ringkasan#
git diffmembandingkan working directory dengan staging area,--stagedmembandingkan staging area dengan commit terakhir, dan dua nama commit membandingkan keadaan riwayat mana pun.- Keluaran diff memuat kepala hunk, baris konteks, baris minus, dan baris plus yang strukturnya sama di semua perbandingan.
HEAD~1menyebut commit di belakang commit saat ini, sehingga dampak commit terakhir selalu dapat ditampilkan.- Opsi
--statmeringkas besar perubahan per berkas sebelum diff penuh dibaca.
Referensi#
- git-diff — Git Documentation
— rujukan seluruh bentuk perbandingan
git diff. - Recording Changes to the Repository — Pro Git — bagian Viewing Your Staged and Unstaged Changes pada Pro Git.