Keluaran git diff sudah lewat di depan mata kita berkali-kali sejak chapter Memahami Working Tree
— dan sejauh ini cukup dibaca dengan dua aturan cepat: baris + berarti baru, baris - berarti lama. Membaca diff dengan sesungguhnya membutuhkan lebih dari itu, karena formatnya memuat nomor baris, hash versi, dan baris konteks yang semuanya membawa informasi. Format ini bukan karangan Git semata: struktur diff --git, hunk, dan tanda awalan diwarisi dari keluarga alat diff di Unix, sehingga sekali dikuasai, keterampilan yang sama berlaku saat membaca keluaran alat lain. Chapter ini membedah satu diff sungguhan baris demi baris, lalu merangkum opsi-opsi yang meringkas keluaran saat daftar perubahan terlalu panjang.
Menyiapkan Satu Perubahan #
Repository latihan memuat pengantar.md dengan empat belas baris terstruktur:
mkdir latihan-anatomi && cd latihan-anatomi
git init -b main
git config user.name "Budi Santoso"
git config user.email "[email protected]"
printf '# Pengantar\n\nParagraf pembuka dokumen.\nBaris kedua paragraf pembuka.\n\n## Daftar Isi\n\n1. Pengantar\n2. Prakata\n3. Glosarium\n\n## Prakata\n\nTulis prakata singkat di sini.\n' > pengantar.md
git add pengantar.md
git commit -m "Tambah pengantar dokumen"
printf '# Pengantar\n\nParagraf pembuka dokumen versi kedua.\nBaris kedua paragraf pembuka.\n\n## Daftar Isi\n\n1. Pengantar\n2. Prakata\n3. Glosarium\n\n## Prakata\n\nTulis prakata singkat di sini.\n' > pengantar.md
git diffOutput yang Dihasilkan:
[main (root-commit) 6ff8dcd] Tambah pengantar dokumen
1 file changed, 14 insertions(+)
create mode 100644 pengantar.md
diff --git a/pengantar.md b/pengantar.md
index 5e2d2d0..a77fbf8 100644
--- a/pengantar.md
+++ b/pengantar.md
@@ -1,6 +1,6 @@
# Pengantar
-Paragraf pembuka dokumen.
+Paragraf pembuka dokumen versi kedua.
Baris kedua paragraf pembuka.
## Daftar IsiBaris pertama keluaran berasal dari git commit — hash 6ff8dcd akan berbeda di mesin pembaca. Selebihnya adalah keluaran git diff: satu blok utuh untuk satu berkas. Kita bedah dari atas ke bawah.
Empat Baris Kepala Diff #
Empat baris pertama setelah baris commit adalah kepala diff:
diff --git a/pengantar.md b/pengantar.md— pengumuman bahwa satu berkas dibandingkan dengan dirinya sendiri dalam dua versi. Prefiksa/menandai sisi lama danb/menandai sisi baru; kedua label ini akan dipakai ulang di seluruh keluaran.index 5e2d2d0..a77fbf8 100644— identitas kedua versi isi berkas dalam bentuk hash blob yang dipendekkan, diikuti kode mode berkas. Mode100644berarti berkas biasa; berkas yang dapat dieksekusi memakai100755. Dua tanda titik memisahkan hash versi lama (5e2d2d0) dan versi baru (a77fbf8) — pasangan inilah yang berganti-ganti setiap kali kita membandingkan area yang berbeda.--- a/pengantar.md— nama berkas pada sisi lama.+++ b/pengantar.md— nama berkas pada sisi baru.
Baris ketiga dan keempat terlihat mubazir karena nama berkasnya sama, tetapi keduanya menjadi penting pada diff lintas commit atau saat nama berkas berubah — misalnya sisi lama berupa /dev/null untuk berkas yang baru dibuat, seperti yang akan kita temui pada chapter berikutnya.
Membaca Hunk Header #
Baris @@ -1,6 +1,6 @@ disebut hunk header — pembuka satu potongan perubahan. Aturan bacanya terbagi dua sisi:
- Bagian
-1,6— sisi berkas lama: hunk ini menampilkan baris mulai nomor 1, sebanyak 6 baris. - Bagian
+1,6— sisi berkas baru: hunk ini menampilkan baris mulai nomor 1, sebanyak 6 baris.
Hitung baris isi hunk di atas untuk membuktikannya: # Pengantar (1), (2), -Paragraf pembuka dokumen. (3), +Paragraf pembuka dokumen versi kedua. (3 di sisi baru), Baris kedua paragraf pembuka. (4), (5), ## Daftar Isi (6). Enam baris pada sisi lama, enam baris pada sisi baru — angka pada header cocok dengan isinya.
Nomor awal tidak selalu 1. Suntingan di bagian tengah berkas yang jauh dari baris pertama menghasilkan hunk yang mulai dari nomor lebih besar:
printf '# Pengantar\n\nParagraf pembuka dokumen versi kedua.\nBaris kedua paragraf pembuka.\n\n## Daftar Isi\n\n1. Pengantar\n2. Prakata\n3. Glosarium\n\n## Prakata\n\nGubahan yang jujur lebih berharga daripada gubahan bertele-tele.\n' > pengantar.md
git diffOutput yang Dihasilkan:
diff --git a/pengantar.md b/pengantar.md
index 5e2d2d0..552b1be 100644
--- a/pengantar.md
+++ b/pengantar.md
@@ -1,6 +1,6 @@
# Pengantar
-Paragraf pembuka dokumen.
+Paragraf pembuka dokumen versi kedua.
Baris kedua paragraf pembuka.
## Daftar Isi
@@ -11,4 +11,4 @@ Baris kedua paragraf pembuka.
## Prakata
-Tulis prakata singkat di sini.
+Gubahan yang jujur lebih berharga daripada gubahan bertele-tele.Perubahan kini terbagi dua hunk karena kedua suntingan berjauhan. Hunk kedua berbunyi @@ -11,4 +11,4 @@ — sisi lama maupun baru menampilkan 4 baris mulai nomor 11. Nomor baris pada berkas lama dapat diverifikasi langsung:
git show HEAD:pengantar.md | cat -nOutput yang Dihasilkan:
1 # Pengantar
2
3 Paragraf pembuka dokumen.
4 Baris kedua paragraf pembuka.
5
6 ## Daftar Isi
7
8 1. Pengantar
9 2. Prakata
10 3. Glosarium
11
12 ## Prakata
13
14 Tulis prakata singkat di sini.Baris 11 sampai 14 pada versi lama memang persis empat baris terakhir — angka -11,4 akurat. Teks sesudah tanda @@ kedua, Baris kedua paragraf pembuka., bukan bagian perubahan: Git menempelkan satu baris penanda lokasi yang dicari ke atas dari posisi hunk — baris yang diawali huruf — murni sebagai petunjuk pembaca. Jumlah baris di dalam hunk juga tidak memihak konteks: seluruh hunk kedua berisi 4 baris sisi lama dan 4 baris sisi baru karena hanya ada satu baris yang diganti.
Baris Isi: Konteks, Tambahan, Pengurangan #
Setiap baris di dalam hunk membawa satu karakter awalan sebelum isinya:
| Awalan | Makna | Muncul di sisi |
|---|---|---|
| spasi | konteks — baris sama pada kedua versi, ditampilkan agar posisi terbaca | keduanya |
- | baris hanya ada pada versi lama | a/ |
+ | baris hanya ada pada versi baru | b/ |
Baris konteks menjelaskan mengapa hunk dipotong pada posisinya: Git menampilkan tiga baris tak berubah di sekeliling setiap perubahan sebagai peta posisi. Awalan - dan + pada baris yang berpasangan menandai penggantian — Paragraf pembuka dokumen. diganti Paragraf pembuka dokumen versi kedua. — sedangkan + tanpa pasangan - berarti penambahan murni. Konfigurasi jumlah baris konteks ini bisa diubah lewat opsi -U<n>, dibahas pada chapter Whitespace dan Opsi Diff
.
Opsi Ringkas Saat Daftar Panjang #
Membaca seluruh isi diff tidak selalu diperlukan — sering kali cukup tahu berkas mana saja yang berubah dan seberapa besar. Tiga opsi meringkas keluaran tanpa membuka isi hunk:
git diff --stat
git diff --name-only
git diff --name-statusOutput yang Dihasilkan:
pengantar.md | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
pengantar.md
M pengantar.mdKeluaran berurutan di atas berasal dari ketiga perintah. --stat merangkum jumlah perubahan per berkas — simbol ++-- menggambarkan perbandingan tambahan dan pengurangan; --name-only cukup daftar nama; --name-status menambahkan kode status di depan setiap nama, M untuk modified, A untuk added, D untuk deleted, dan R untuk renamed. Ketiganya berlaku pada semua bentuk git diff — bentuk beserta opsi lainnya dirinci pada dokumentasi git diff
— termasuk bentuk-bentuk pembandingan titik riwayat yang menjadi topik berikutnya. Lanjut ke Diff Antar Commit
.