Pemilihan per berkas menuntaskan pemisahan topik selama dua topik itu hidup di dua berkas berbeda. Namun kadang dua topik justru berbagi satu berkas yang sama: sebuah perbaikan kalimat di bagian awal dokumen dan bagian baru yang belum selesai di ujungnya. git add panduan.md akan mengangkat keduanya sekaligus, dan commit kita kembali ke masalah lama — satu commit dua maksud. Git menyediakan jalan keluar yang presisi: mode interaktif git add -p (singkat dari --patch), yang menampilkan perubahan potongan demi potongan dan bertanya satu per satu mana yang ingin dinaikkan ke staging area. Chapter ini menjalankan mode tersebut pada berkas dengan dua potongan perubahan, lalu membuktikan bahwa commit yang terbentuk hanya memuat potongan yang kita pilih.
Hunk: Satuan Potongan Perubahan #
git diff membagi perubahan sebuah berkas menjadi hunk — kelompok baris yang berubah secara berdekatan, dipisahkan oleh baris konteks yang tidak berubah. Jarak antar perubahan menentukan pemisahan ini: dua suntingan yang berjauhan lebih dari beberapa baris konteks akan terpisah menjadi dua hunk, dan masing-masing dapat dipilih sendiri-sendiri. Kita siapkan latihannya — sebuah panduan.md yang sudah ter-commit, lalu dua suntingan berbeda topik pada bagian yang berjauhan:
mkdir latihan-hunk && cd latihan-hunk
git init -b main
git config user.name "Budi Santoso"
git config user.email "[email protected]"
printf '# Panduan Kontributor\n\n## Alur Kerja\n\n1. Fork repository.\n2. Buat branch baru.\n3. Kirim pull request.\n\n## Standar Pesan Commit\n\nGunakan kata kerja aktif pada awal pesan.\nBatasi subjek sampai 50 karakter.\nGunakan bahasa Indonesia yang lugas.\n\n## Peninjauan\n\nMinta peninjauan sebelum menggabungkan.\n' > panduan.md
git add panduan.md
git commit -m "Tambah panduan kontributor"Dua suntingan berikut: memperjelas langkah ketiga pada bagian Alur Kerja, dan menambah bagian baru Uji Lokal di ujung berkas:
printf '# Panduan Kontributor\n\n## Alur Kerja\n\n1. Fork repository.\n2. Buat branch baru.\n3. Kirim pull request setelah seluruh uji lulus.\n\n## Standar Pesan Commit\n\nGunakan kata kerja aktif pada awal pesan.\nBatasi subjek sampai 50 karakter.\nGunakan bahasa Indonesia yang lugas.\n\n## Peninjauan\n\nMinta peninjauan sebelum menggabungkan.\n\n## Uji Lokal\n\nJalankan seluruh uji sebelum mengirim.\n' > panduan.md
git diffOutput yang Dihasilkan:
diff --git a/panduan.md b/panduan.md
index 9bfe444..94ec641 100644
--- a/panduan.md
+++ b/panduan.md
@@ -4,7 +4,7 @@
1. Fork repository.
2. Buat branch baru.
-3. Kirim pull request.
+3. Kirim pull request setelah seluruh uji lulus.
## Standar Pesan Commit
@@ -15,3 +15,7 @@ Gunakan bahasa Indonesia yang lugas.
## Peninjauan
Minta peninjauan sebelum menggabungkan.
+
+## Uji Lokal
+
+Jalankan seluruh uji sebelum mengirim.Keluaran tersebut memuat dua hunk, ditandai dua baris @@: hunk pertama mengganti satu baris pada langkah Alur Kerja, hunk kedua menambah empat baris di ujung berkas. Teks yang mengikuti pasangan @@ pada hunk kedua (Gunakan bahasa Indonesia yang lugas.) adalah cuplikan baris terdekat sebelum hunk — alat bantu orientasi, bukan bagian dari perubahan. Jarak kedua suntingan cukup jauh sehingga Git memisahkannya; inilah syarat agar keduanya bisa dipilih terpisah.
Sesi Interaktif git add -p #
Mode interaktif dijalankan dengan memberi opsi -p pada git add. Git menampilkan satu hunk, lalu menanyakan keputusan kita sebelum melanjutkan ke hunk berikutnya. Jawaban untuk latihan ini: y (ya, naikkan hunk pertama) dan n (tidak, lewati hunk kedua):
printf 'y\nn\n' | git add -p panduan.mdOutput yang Dihasilkan:
diff --git a/panduan.md b/panduan.md
index 9bfe444..94ec641 100644
--- a/panduan.md
+++ b/panduan.md
@@ -4,7 +4,7 @@
1. Fork repository.
2. Buat branch baru.
-3. Kirim pull request.
+3. Kirim pull request setelah seluruh uji lulus.
## Standar Pesan Commit
(1/2) Stage this hunk [y,n,q,a,d,j,J,g,/,e,p,?]? @@ -15,3 +15,7 @@ Gunakan bahasa Indonesia yang lugas.
## Peninjauan
Minta peninjauan sebelum menggabungkan.
+
+## Uji Lokal
+
+Jalankan seluruh uji sebelum mengirim.
(2/2) Stage this hunk [y,n,q,a,d,K,g,/,e,p,?]? Alur sesinya terbaca berurutan. Pertama, hunk pertama tampil lengkap, lalu prompt (1/2) Stage this hunk [y,n,q,a,d,j,J,g,/,e,p,?]? menunggu jawaban — kita menjawab y, sehingga hunk itu masuk staging area. Kedua, hunk kedua tampil menyusul, dan prompt (2/2) menunggu lagi — kita menjawab n, sehingga hunk itu dibiarkan di working tree.
Jawaban yang Tersedia pada Prompt #
Prompt menawarkan lebih dari sekadar ya dan tidak. Jawaban-jawaban yang paling sering dipakai:
| Jawaban | Efek |
|---|---|
y | naikkan hunk ini ke staging area |
n | lewati hunk ini — tetap di working tree |
q | berhenti; hunk ini dan semua sisanya tidak dinaikkan |
a | naikkan hunk ini dan semua hunk setelahnya di berkas yang sama |
d | lewati hunk ini dan semua hunk setelahnya |
s | pecah hunk ini menjadi potongan lebih kecil, bila memungkinkan |
e | sunting isi hunk secara manual di editor |
p | tampilkan ulang hunk yang sedang diputuskan |
? | tampilkan daftar bantuan |
Menjawab ? membuat Git mencantumkan daftar itu sendiri:
y - stage this hunk
n - do not stage this hunk
q - quit; do not stage this hunk or any of the remaining ones
a - stage this hunk and all later hunks in the file
d - do not stage this hunk or any of the later hunks in the file
e - manually edit the current hunk
p - print the current hunk, 'P' to use the pager
? - print helpPada berkas dengan banyak hunk, prompt juga menawarkan opsi navigasi — terlihat pada sesi di atas sebagai j, J, g, /, dan K — untuk berpindah antar hunk tanpa memutuskan yang sedang tampil. Dua jawaban yang layak diingat lebih dalam: s memecah hunk yang memuat dua perubahan berdekatan menjadi dua pertanyaan terpisah, dan e membuka editor untuk memangkas isi hunk sampai ke baris — keduanya menutup celah “perubahan terlalu dekat untuk terpisah otomatis”. Daftar lengkapnya terdokumentasi pada bagian Interactive mode di dokumentasi git add
.
Membuktikan Hasil Pemilihan #
Keadaan setelah sesi di atas: satu hunk naik, satu hunk tertinggal. Kedua git diff membuktikannya masing-masing:
git diff --cachedOutput yang Dihasilkan:
diff --git a/panduan.md b/panduan.md
index 9bfe444..0c43d1e 100644
--- a/panduan.md
+++ b/panduan.md
@@ -4,7 +4,7 @@
1. Fork repository.
2. Buat branch baru.
-3. Kirim pull request.
+3. Kirim pull request setelah seluruh uji lulus.
## Standar Pesan Commit
Staging area hanya memuat hunk pertama. Sementara itu pembanding working tree vs index hanya melaporkan hunk kedua:
git diffOutput yang Dihasilkan:
diff --git a/panduan.md b/panduan.md
index 0c43d1e..94ec641 100644
--- a/panduan.md
+++ b/panduan.md
@@ -15,3 +15,7 @@ Gunakan bahasa Indonesia yang lugas.
## Peninjauan
Minta peninjauan sebelum menggabungkan.
+
+## Uji Lokal
+
+Jalankan seluruh uji sebelum mengirim.Pola ini persis pola staged + modified dari chapter Modified, Staged, dan Committed — hanya kali ini pemisahnya bukan berkas, melainkan potongan di dalam satu berkas. Commit dibuat untuk hunk pertama saja:
git commit -m "Perjelas syarat pengiriman pull request"Output yang Dihasilkan:
[main a716e82] Perjelas syarat pengiriman pull request
1 file changed, 1 insertion(+), 1 deletion(-)Bukti akhir dilihat dari git show --stat HEAD: commit memuat satu berkas dengan satu baris diganti — hunk kedua yang menambah empat baris tidak ikut:
git show --stat HEADOutput yang Dihasilkan:
commit a716e827b475100f6da76ba6e2d62e42549417b7
Author: Budi Santoso <[email protected]>
Date: Tue Oct 13 09:30:00 2026 +0700
Perjelas syarat pengiriman pull request
panduan.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)Angka 1 insertion(+), 1 deletion(-) adalah tanda tangan hunk pertama semata; hunk kedua yang menambah empat baris akan menghasilkan 4 insertions(+) seandainya ikut. Keadaan akhir working tree menegaskan hal yang sama:
git statusOutput yang Dihasilkan:
On branch main
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: panduan.md
no changes added to commit (use "git add" and/or "git commit -a")Hunk kedua masih menunggu di working tree, siap dinaikkan dengan git add (utuh) atau git add -p (lagi, bila masih perlu dipilah) pada commit berikutnya. Hash pada keluaran dihitung dari isi dan waktu commit, jadi nilainya berbeda di komputer pembaca.
Pemilihan sepresisi ini juga berarti ruang salah pilih makin sering terjadi: hunk yang salah masuk keranjang, atau keranjang yang terlanjur berisi suntingan yang belum waktunya. Git menyediakan pintu keluarnya — mengeluarkan isi staging area tanpa membuang suntingan apa pun. Lanjut ke Membatalkan Staging .