Sebagian besar patch yang beredar dalam tinjauan kode, laporan isu, dan email menggunakan format unified diff. git diff, diff -u, dan "raw diff" di GitHub semuanya memakai format ini. Awalnya simbolnya tampak banyak, tetapi aturannya sederhana.
Bentuk keseluruhan
@@ -1,5 +1,6 @@ def greet(name):- print("Hello " + name)+ message = f"Hello, {name}!"+ print(message) def main(): greet("world")
Dari atas ke bawah terdapat header tambahan git, header file (---, +++), dan hunk (bongkahan yang diawali @@). Satu file bisa memiliki beberapa hunk, dan satu patch bisa berisi beberapa file.
Header file: --- dan +++
--- a/greet.pyadalah file sebelum diubah,+++ b/greet.pyadalah file setelah diubah.- git menambahkan
a/danb/di depan path. Karena itu saat menerapkan dengan perintahpatch, komponen path pertama dibuang dengan-p1. - File baru ditandai
--- /dev/null, file yang dihapus ditandai+++ /dev/null. - GNU diff kadang menambahkan waktu modifikasi di belakang nama file.
Header hunk @@ -a,b +c,d @@
@@ -1,5 +1,6 @@ berarti hunk ini menampilkan "5 baris dari file sebelum diubah mulai baris 1, dan 6 baris dari file setelah diubah mulai baris 1".
- Angka pertama adalah nomor baris awal, dan angka setelah koma adalah jumlah baris yang ditempati hunk itu (termasuk baris konteks).
- Jika jumlah barisnya 1, angka itu beserta komanya dihilangkan.
@@ -7 +7 @@adalah hunk satu baris, yaitu baris 7. - Jika jumlah barisnya 0, berarti di sisi itu tidak ada baris.
@@ -3,0 +4,2 @@berarti dua baris baru disisipkan setelah baris 3 file asli. Jika dibandingkan dengan file kosong, muncul-0,0. - Setelah
@@kedua kadang ada teks seperti nama fungsi (@@ -40,7 +40,8 @@ def main():). Ini informasi rujukan yang menunjukkan hunk berada di dalam fungsi mana, dan diabaikan saat patch diterapkan.
Mari hitung sendiri: baris konteks (yang diawali spasi) pada contoh di atas ada 4, yaitu def greet(name):, baris kosong, def main():, dan greet("world"). Jumlah baris sebelum diubah adalah 4 baris konteks ditambah 1 baris - = 5, dan setelah diubah 4 baris konteks ditambah 2 baris + = 6, sehingga header-nya menjadi -1,5 +1,6.
Tiga jenis baris di badan hunk
| Karakter pertama | Arti |
|---|---|
| Spasi | Baris konteks yang sama di kedua sisi |
- | Baris yang hanya ada sebelum diubah (dihapus) |
+ | Baris yang hanya ada setelah diubah (ditambah) |
Konteks bawaan adalah 3 baris sebelum dan sesudah perubahan (bisa diubah, misalnya git diff -U5). Baris konteks dipakai untuk menemukan posisi yang tepat saat patch diterapkan. Meskipun nomor barisnya sedikit bergeser, jika konteksnya cocok, patch akan menerapkannya dengan menggeser posisi (offset).
Satu baris yang diedit muncul sebagai pasangan baris - lalu baris +. Format unified tidak punya simbol khusus untuk "diubah", jadi kiatnya adalah membaca kelompok - dan kelompok + yang berurutan sambil mencocokkannya dari atas ke bawah.
\ No newline at end of file
@@ -1,2 +1,2 @@ host=example.com-port=8080\ No newline at end of file+port=8080
Ini menandakan bahwa baris tepat di atasnya adalah baris terakhir file dan tidak ada karakter baris baru di ujungnya. Pada contoh di atas isinya sama, dan baris baru terakhir hanya ditambahkan pada file setelah diubah. Penjelasan lengkapnya ada di Karakter akhir baris dan perbedaan tak terlihat.
Header tambahan git
Baris-baris setelah diff --git a/path b/path adalah informasi tambahan khas git.
index 3b18e51..a6f4c2d 100644— awal hash isi file sebelum dan sesudah diubah, serta mode file (100644 file biasa, 100755 file yang dapat dieksekusi)new file mode 100644/deleted file mode 100644— file dibuat atau dihapusold mode 100644/new mode 100755— hanya izin eksekusi yang berubah (bisa muncul tanpa hunk isi)similarity index 90%,rename from old-path,rename to new-path— ganti nama (isinya 90% sama)Binary files a/logo.png and b/logo.png differ— untuk file biner, hanya baris ini yang muncul sebagai ganti isinya
Kiat berguna saat meninjau
- Lihat dulu selisih jumlah baris di header hunk untuk memperkirakan besar perubahan.
-10,7 +10,30berarti bertambah 23 baris. - Untuk menyaring hunk yang hanya berubah spasinya, gunakan
git diff -w. Ini sangat berguna saat meninjau commit yang mencampur perapian indentasi dengan perubahan nyata (Opsi abaikan spasi). - Untuk melihat apa yang berubah di dalam baris, gunakan
git diff --word-diff, atau masukkan ke alat yang mendukung sorotan dalam baris seperti situs ini. - Sebelum menerapkan patch, periksa dulu dengan
git apply --check file.patchapakah patch dapat diterapkan dengan bersih. Jika bukan repositori git, gunakanpatch -p1 --dry-run < file.patch.
Coba di alat ini
Tampilan gabungan di Pembanding Teks menampilkan kelompok - lalu kelompok + dengan urutan yang sama seperti format ini, dan menyorot sekali lagi kata yang berubah di dalam baris. Menekan tombol patch di bilah hasil akan menyalin teks unified diff standar, dan tombol simpan di sebelahnya mengunduh file diff.patch. Patch yang dibuat dengan semua opsi pengabaian dimatikan dapat diterapkan ke file asli dengan patch -p1 atau git apply.