Banyak kasus ketika dua file "isinya sama" tetapi diff menampilkan banyak perbedaan disebabkan oleh spasi: editor menghapus spasi di akhir baris, mengganti tab menjadi spasi, atau mengubah lebar indentasi. Alat diff menyediakan opsi untuk mengabaikan perbedaan seperti ini, tetapi setiap opsi mengabaikan cakupan yang berbeda, jadi Anda perlu tahu persis cara kerjanya.
Opsi GNU diff yang berkaitan dengan spasi
| Opsi | Nama panjang | Yang diabaikan |
|---|---|---|
-Z | --ignore-trailing-space | Spasi di akhir baris |
-E | --ignore-tab-expansion | Perbedaan akibat tab yang diurai menjadi spasi |
-b | --ignore-space-change | Perubahan jumlah spasi, spasi di akhir baris |
-w | --ignore-all-space | Semua spasi |
-B | --ignore-blank-lines | Perubahan yang hanya menambah atau menghapus baris kosong |
-i | --ignore-case | Huruf besar/kecil |
--strip-trailing-cr | Karakter CR di akhir baris masukan |
Padanan opsi di git diff
Dokumentasi git menjelaskannya sebagai berikut.
--ignore-cr-at-eol: mengabaikan carriage return (CR) di akhir baris saat membandingkan.--ignore-space-at-eol: mengabaikan perubahan spasi di akhir baris.-b,--ignore-space-change: mengabaikan perubahan jumlah spasi. Spasi di akhir baris diabaikan, dan rangkaian satu spasi atau lebih lainnya dianggap sama.-w,--ignore-all-space: mengabaikan spasi saat membandingkan baris. Perbedaan ketika satu sisi punya spasi dan sisi lain tidak pun diabaikan.--ignore-blank-lines: mengabaikan perubahan yang semua barisnya kosong.
Perbedaan penting -b dan -w
Kedua opsi ini sering tertukar. Intinya adalah apakah opsi itu membedakan ada atau tidaknya spasi.
| Kiri | Kanan | -b (abaikan jumlah spasi) | -w (abaikan semua spasi) |
|---|---|---|---|
a b | a b | Sama | Sama |
a b | ab | Beda | Sama |
x = 1 | x=1 | Beda | Sama |
if (a) + spasi di akhir baris | if (a) | Sama | Sama |
| Indentasi 1 tab | Indentasi 4 spasi | Sama | Sama |
-b meringkas setiap gumpalan spasi menjadi satu spasi, sedangkan -w menghapus semua spasi. Karena itu -w menganggap x = 1 dan x=1 sama, bahkan int a dan inta pun dianggap sama.
Bahaya jika indentasi bermakna
Pada file yang indentasinya bagian dari sintaks seperti Python, YAML, dan Makefile, opsi abaikan spasi bisa menyembunyikan perubahan yang nyata.
if ready:
start()
notify()
if ready:
start()
notify()
Pada yang kedua, notify() keluar dari blok if sehingga perilakunya berubah, tetapi jika dibandingkan dengan -w, semua spasi dihapus sehingga perbedaannya hilang. -b menangkap perbedaan ini karena spasi di awal baris berubah dari "ada" menjadi "tidak ada". Namun, jika indentasi berubah dari 4 menjadi 8 spasi dan kode masuk ke blok yang lebih dalam, yang berubah hanyalah jumlah spasi, sehingga -b pun tidak menampilkannya.
Cara yang pasti adalah membandingkan file yang indentasinya penting tanpa opsi spasi. Kebiasaan yang aman adalah memakai opsi spasi untuk memastikan bahwa "perubahannya hanya perapian", lalu melakukan pemeriksaan akhir tanpa opsi.
Cakupan abaikan baris kosong (-B)
-B dan --ignore-blank-lines di git menyembunyikan perubahan yang hanya terdiri dari baris kosong. Jika penambahan baris kosong tercampur dengan perubahan nyata dalam hunk yang sama, baris kosong itu bisa tetap ditampilkan. Opsi ini berguna untuk dokumen yang jumlah baris kosong antarparagrafnya diubah, atau ketika pemformat kode merapikan baris kosong antarfungsi.
Opsi situs ini dan padanannya
| Situs ini | Terdekat di GNU diff | Terdekat di git diff |
|---|---|---|
| Spasi: bandingkan apa adanya | (tanpa opsi) | (tanpa opsi) |
| Spasi: abaikan spasi di akhir baris | -Z | --ignore-space-at-eol |
| Spasi: abaikan jumlah spasi | -b | -b |
| Spasi: abaikan semua spasi | -w | -w |
| Abaikan huruf besar/kecil | -i | (tidak ada padanan) |
| Abaikan baris kosong | Mirip -B (baris kosong dikeluarkan dari perbandingan) | Mirip --ignore-blank-lines |
| Normalkan akhir baris | --strip-trailing-cr + abaikan baris baru terakhir | Mirip --ignore-cr-at-eol |
"Abaikan baris kosong" di situs ini mengeluarkan baris kosong sepenuhnya dari perbandingan dan hanya menampilkannya dengan warna pudar. Selain itu, opsi pengabaian juga berlaku untuk sorotan dalam baris: jika abaikan jumlah spasi diaktifkan, bagian yang hanya berbeda jumlah spasinya tidak disorot.
Coba di alat ini
Masukkan contoh dari tabel di atas ke Pembanding Teks dan ubah opsi spasi satu per satu; perbedaannya langsung terlihat. "Perbedaan tak terlihat" seperti CR di akhir baris atau baris baru di akhir file dibahas di Karakter akhir baris dan perbedaan tak terlihat, dan cara membaca hasil sebagai patch di Cara membaca unified diff.