Menstaging berkas

Menstaging berkas dengan git add, termasuk menstaging sebagian isi berkas secara interaktif dengan -p.

Daftar isi

Perintah git add memindahkan perubahan dari working directory ke staging area, dan pada praktiknya menjadi alat penyusunan isi commit. Topik ini membahas bentuk-bentuk pemanggilannya, cara menstaging sebagian isi berkas secara interaktif dengan opsi -p, dan cara menstaging penghapusan berkas. Penguasaan staging membuat setiap commit berisi satu gagasan yang utuh.

Bentuk pemanggilan git add#

Bentuk paling sering dipakai adalah menstaging berkas satu per satu atau beberapa berkas sekaligus. Siapkan folder latihan dengan dua berkas, stage keduanya secara eksplisit, lalu jadikan commit dasar untuk latihan berikutnya.

bash
# 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"
bash
rm -rf /tmp/lab-add
mkdir /tmp/lab-add
cd /tmp/lab-add
git init -b main
git config user.name "Budi"
git config user.email "[email protected]"
printf "Pengeluaran pagi.\nPengeluaran siang.\nPengeluaran malam.\n" > kas.txt
printf "Diskusi tim.\n" > rapat.md
git add kas.txt rapat.md
git status -s
git commit -m "Catatan harian"
text Keluaran
Initialized empty Git repository in /tmp/lab-add/.git/
A  kas.txt
A  rapat.md
[main (root-commit) c47afaa] Catatan harian
 2 files changed, 4 insertions(+)
 create mode 100644 kas.txt
 create mode 100644 rapat.md

Menyebut nama berkas secara eksplisit adalah bentuk yang paling terkendali karena cakupannya tidak pernah melampaui maksud penulisan. Untuk pekerjaan yang memang menyentuh banyak berkas, opsi -A menstaging seluruh perubahan pada tree proyek, termasuk berkas baru, berkas yang berubah, dan berkas yang dihapus. Tanpa argumen, git add . menstaging seluruh perubahan pada direktori saat ini dan subfoldernya. Makin luas cakupan yang dipilih, makin penting git status dipanggil terlebih dahulu untuk memastikan tidak ada perubahan yang ikut terbawa tanpa sengaja.

Menstaging sebagian isi berkas#

Staging tidak harus berupa berkas utuh. Opsi -p (patch) membagi perubahan menjadi hunks, yaitu blok perubahan yang berdekatan, lalu bertanya satu per satu apakah setiap hunk ikut di-stage. Ubah baris pertama dan baris ketiga berkas kas.txt, sehingga muncul dua hunk yang terpisah.

bash
printf "Pengeluaran pagi: 15000.\nPengeluaran siang.\nPengeluaran malam: 20000.\n" > kas.txt
printf 'n\ny\n' | git add -p
git status -s
text Keluaran
diff --git a/kas.txt b/kas.txt
index 39fa2fc..748718c 100644
--- a/kas.txt
+++ b/kas.txt
@@ -1,3 +1,3 @@
-Pengeluaran pagi.
+Pengeluaran pagi: 15000.
 Pengeluaran siang.
-Pengeluaran malam.
+Pengeluaran malam: 20000.
(1/1) Stage this hunk [y,n,q,a,d,s,e,p,?]?
 M kas.txt

Jawaban n melewatkan hunk pertama, sedangkan jawaban y menstaging hunk kedua, sehingga status berubah menjadi MM: huruf pertama pada kolom staging menyatakan ada perubahan yang menunggu commit, sedangkan huruf kedua pada kolom working directory menyatakan masih ada perubahan yang belum di-stage. Commit pada keadaan ini hanya menyimpan hunk yang di-stage.

bash
git commit -m "Catat nilai pengeluaran malam"
git status -s
text Keluaran
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:   kas.txt

no changes added to commit (use "git add" and/or "git commit -a")
 M kas.txt

Satu berkas kini menjadi dua commit yang masing-masing berisi satu perubahan. Selain y dan n, jawaban q menghentikan sesi, dan s memecah hunk yang menyatukan dua perubahan menjadi bagian yang lebih kecil bila ada baris kosong di antaranya.

Menstaging penghapusan berkas#

Menghapus berkas dengan rm adalah perubahan pada working directory, dan penghapusan itu harus di-stage agar masuk commit.

bash
rm rapat.md
git status -s
git add -A
git status -s
text Keluaran
 M kas.txt
 D rapat.md
M  kas.txt
D  rapat.md

Status D dengan spasi di depan menyatakan penghapusan yang baru terjadi di working directory, sedangkan D setelah git add -A menyatakan penghapusan yang sudah menunggu di staging area. Commit berikutnya akan mencatat hilangnya rapat.md sebagai bagian riwayat. Alternatif satu langkahnya adalah git rm rapat.md, yang menghapus berkas sekaligus men-stage penghapusannya.

Memilih bentuk pemanggilan yang sesuai#

Ketiga bentuk pemanggilan melayani kebutuhan yang berbeda, dan memilihnya secara sadar adalah bagian dari disiplin commit. Tabel berikut merangkum konsekuensi masing-masing.

BentukCakupanCocok untuk
git add berkashanya berkas yang disebutpekerjaan terfokus dan kebiasaan paling aman
git add .direktori saat ini dan subfoldernyamenambah sekelompok berkas baru pada satu folder
git add -Aseluruh tree proyekpekerjaan besar yang memang menyeberangi banyak folder

Bentuk yang luas bukanlah bentuk yang terlarang, tetapi bentuk yang luas memindahkan tanggung jawab penyaringan dari penulis ke pembaca commit. Kombinasi yang lazim pada pekerjaan nyata adalah git status -s sebagai pemeriksaan awal, staging eksplisit untuk isi commit, dan git diff --staged sebagai peninjauan terakhir sebelum git commit. Rangkaian tiga langkah ini memakan waktu beberapa detik, sedangkan commit yang tidak sengaja memuat berkas sementara atau kredensial memerlukan penulisan ulang riwayat untuk dibersihkan.

Perlu diingat pula bahwa staging adalah keadaan, bukan penyimpanan. Isi staging area hilang bersama commit-nya, dan perubahan yang hanya ada di working directory tetap rentan hilang sampai commit dibuat. Staging yang baik menata batas antargagasan, sedangkan keamanan data tetap datang dari frekuensi commit.

Ringkasan#

  • git add berkas men-stage secara eksplisit, -A men-stage seluruh perubahan termasuk penghapusan, dan git add . men-stage perubahan pada direktori saat ini.
  • Opsi -p men-stage per hunk sehingga satu berkas dapat dipecah ke beberapa commit.
  • Status dua kolom seperti MM membedakan perubahan yang sudah dan belum di-stage pada berkas yang sama.
  • Penghapusan berkas juga merupakan perubahan yang harus di-stage, baik melalui git add -A maupun git rm.

Referensi#