Chapter git status berakhir dengan keranjang commit yang terisi sebagian: satu suntingan sudah di-stage, satu suntingan lagi masih menunggu, dan sebuah draf belum dikenal Git. Mengisi keranjang itu adalah tugas git add — perintah yang sering disalahpahami karena terlihat seperti sekadar “menyimpan berkas”. Padahal git add menyalin isi berkas ke staging area, dan bentuk pemakaiannya bermacam-macam: satu berkas, banyak berkas, seluruh direktori, penghapusan, hingga sebagian suntingan. Chapter ini mencoba semua bentuk itu pada repository latihan yang sama, dengan keluaran git status nyata di setiap langkah.

Memulai dari Keadaan Bersih #

Latihan kita berakhir dengan README.md ter-stage, glosarium.md tersunting, dan draf-catatan.txt untracked. Supaya setiap bentuk git add terlihat jelas, kita pulihkan dulu keadaan bersih memakai dua petunjuk yang sudah dikenal dari chapter git status : git restore --staged mengosongkan staging area, git restore membuang suntingan working tree:

bash
git restore --staged README.md
git restore README.md glosarium.md
git status -s

Output yang Dihasilkan:

text
?? draf-catatan.txt

Satu baris tersisa: draf-catatan.txt masih untracked karena git restore hanya bekerja pada berkas terlacak. Berkas itu kita simpan sebagai bahan latihan berikutnya.

Menambahkan Satu Berkas #

Bentuk paling dasar adalah menyebut satu nama berkas:

bash
git add draf-catatan.txt
git status

Output yang Dihasilkan:

text
On branch main
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        new file:   draf-catatan.txt
bash
git status -s

Output yang Dihasilkan:

text
A  draf-catatan.txt

Label new file dan kode A di kolom X (tabel dua kolom dari chapter git status ) menandakan berkas baru yang sudah masuk keranjang commit. Berkasnya sendiri tetap berada di working tree — tidak dipindahkan atau dikunci.

Berkasnya masih draf rapat pekan depan, jadi kita keluarkan kembali dari keranjang — persis seperti petunjuk (use "git restore --staged <file>..." to unstage):

bash
git restore --staged draf-catatan.txt
git status -s

Output yang Dihasilkan:

text
?? draf-catatan.txt

Staging area kosong lagi, berkas tetap utuh di working tree, dan Git kembali melaporkannya sebagai untracked.

Mencatat Penghapusan Berkas #

Menghapus berkas juga sebuah perubahan, dan penghapusan pun harus melewati staging area sebelum tercatat di riwayat:

bash
rm glosarium.md
git status

Output yang Dihasilkan:

text
On branch main
Changes not staged for commit:
  (use "git add/rm <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        deleted:    glosarium.md

Untracked files:
  (use "git add <file>..." to include in what will be committed)
        draf-catatan.txt

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

Perhatikan petunjuknya: git add/rm. Git sendiri menyarankan git add untuk penghapusan — perilaku modern git add mencatat penghapusan, bukan hanya berkas baru dan suntingan:

bash
git add glosarium.md
git status -s

Output yang Dihasilkan:

text
D  glosarium.md
?? draf-catatan.txt

Kode D di kolom X berarti penghapusan sudah masuk keranjang; commit berikutnya akan menghapus glosarium.md dari snapshot proyek. Perintah git rm menyatukan rm dan git add menjadi satu langkah — dibahas pada chapter git rm .

Kita butuh glosarium.md untuk latihan selanjutnya, jadi urungkan prosesnya dua langkah:

bash
git restore --staged glosarium.md
git restore glosarium.md
git status -s

Output yang Dihasilkan:

text
?? draf-catatan.txt

Langkah pertama mengembalikan isi staging area ke versi HEAD (penghapusan keluar dari keranjang, berkas masih hilang di working tree); langkah kedua memulihkan berkas dari staging area.

Menambahkan Beberapa Berkas Sekaligus #

Ketika beberapa berkas siap dicatat bersama, pathspec-nya cukup ditulis berurutan dalam satu perintah. Kita sunting dua berkas terlacak sekaligus:

bash
printf '# Situs Dokumentasi\n\nKumpulan catatan teknis tim internal.\nBagian panduan pengguna ditambahkan di halaman utama.\n' > README.md
printf '## Glosarium\n\n- commit: catatan satu keadaan proyek\n- staging area: keranjang perubahan terpilih\n- repository: wadah riwayat beserta berkasnya\n- working tree: salinan berkas yang sedang disunting\n' > glosarium.md
git add README.md glosarium.md
git status -s

Output yang Dihasilkan:

text
M  README.md
M  glosarium.md
?? draf-catatan.txt

Satu perintah, dua berkas masuk keranjang. Daftar pada keluaran ditampilkan dalam urutan abjad — bukan urutan pengetikan.

Menambahkan Seluruh Isi Direktori #

Proyek dokumentasi kita butuh folder khusus panduan. Direktori baru juga ditangani git add:

bash
mkdir docs
printf '# Panduan Instalasi\n\nIkuti langkah pada halaman utama.\n' > docs/panduan-instalasi.md
printf '# Pertanyaan Umum\n\nQ: Di mana melihat riwayat perubahan?\nA: Lewat git log.\n' > docs/faq.md
git status -s

Output yang Dihasilkan:

text
M  README.md
M  glosarium.md
?? docs/
?? draf-catatan.txt

Direktori baru tampil ringkas sebagai ?? docs/ — Git memampatkan isi folder yang belum dilacak sama sekali supaya keluaran tetap pendek. Setelah direktorinya di-add, isinya terbuka satu per satu:

bash
git add docs
git status -s

Output yang Dihasilkan:

text
M  README.md
A  docs/faq.md
A  docs/panduan-instalasi.md
M  glosarium.md
?? draf-catatan.txt

git add docs memindai seluruh isi docs/ secara rekursif — setiap berkas di dalamnya masuk keranjang sebagai A. Pemampatan ?? docs/ hanya berlaku untuk berkas yang belum dikenal Git.

Lingkup git add . dan git add -A #

Titik (.) dan -A sering dianggap sama, padahal keduanya punya cakupan berbeda yang baru terlihat ketika perintah dijalankan dari subdirektori. Kita siapkan dua berkas baru — satu di akar repository, satu di dalam docs/:

bash
printf '# Catatan Rilis\n\n- 2026-10-13: rilis perdana dokumentasi\n' > CATATAN-RILIS.md
printf 'Rencana materi pekan depan.\n' > docs/agenda.txt
cd docs
git add .
git status -s

Output yang Dihasilkan:

text
M  ../README.md
A  agenda.txt
A  faq.md
A  panduan-instalasi.md
M  ../glosarium.md
?? ../CATATAN-RILIS.md
?? ../draf-catatan.txt

Dari dalam docs/, git add . hanya memproses direktori saat ini: agenda.txt masuk keranjang, sedangkan CATATAN-RILIS.md di akar tetap ??. Satu hal lain yang terlihat di sini: git status menampilkan jalur relatif terhadap direktori saat ini, sehingga berkas di luar docs/ diberi awalan ../. Sekarang dari posisi yang sama:

bash
git add -A
git status -s

Output yang Dihasilkan:

text
A  ../CATATAN-RILIS.md
M  ../README.md
A  agenda.txt
A  faq.md
A  panduan-instalasi.md
A  ../draf-catatan.txt
M  ../glosarium.md

git add -A tanpa pathspec menjangkau seluruh repository dari posisi mana pun — CATATAN-RILIS.md dan bahkan draf-catatan.txt ikut masuk keranjang. Ringkasan cakupan ketiganya:

PerintahCakupan
git add <berkas>Berkas yang disebut saja
git add <berkas> <berkas> ...Semua berkas yang disebut
git add <direktori>Seluruh isi direktori, rekursif
git add .Seluruh perubahan di bawah direktori saat ini
git add -ASeluruh perubahan di repository

Sejak Git 2.0, git add . juga mencatat penghapusan di bawah cakupannya, jadi di akar repository hasil git add . dan git add -A sama persis; perbedaannya hanya muncul ketika berjalan dari subdirektori.

Pathspec: git add .txt dan git add ‘.txt’ #

Pola *.txt berperilaku berbeda bergantung pada tanda kutip — dan perbedaannya kerap mengejutkan. Kita keluarkan dulu docs/agenda.txt dari keranjang supaya polanya terlihat jelas, lalu tambah satu berkas latihan baru:

bash
cd ..
git restore --staged docs/agenda.txt
printf 'Riwayat latihan singkat.\n' > catatan-latihan.txt
git status -s

Output yang Dihasilkan:

text
A  CATATAN-RILIS.md
M  README.md
A  docs/faq.md
A  docs/panduan-instalasi.md
A  draf-catatan.txt
M  glosarium.md
?? catatan-latihan.txt
?? docs/agenda.txt

Ada tiga berkas .txt: dua di akar (draf-catatan.txt yang sudah ter-stage dan catatan-latihan.txt yang belum) dan satu di dalam docs/. Tanpa tanda kutip, pola diperluas oleh shell:

bash
git add *.txt
git status -s

Output yang Dihasilkan:

text
A  CATATAN-RILIS.md
M  README.md
A  catatan-latihan.txt
A  docs/faq.md
A  docs/panduan-instalasi.md
A  draf-catatan.txt
M  glosarium.md
?? docs/agenda.txt

Shell memperluas *.txt sebelum Git membaca perintah, menjadi daftar berkas pada direktori saat ini — catatan-latihan.txt dan draf-catatan.txt. Perluasan shell tidak menjangkau subdirektori, sehingga docs/agenda.txt tetap ??. Dengan tanda kutip, pola sampai utuh ke Git:

bash
git add '*.txt'
git status -s

Output yang Dihasilkan:

text
A  CATATAN-RILIS.md
M  README.md
A  catatan-latihan.txt
A  docs/agenda.txt
A  docs/faq.md
A  docs/panduan-instalasi.md
A  draf-catatan.txt
M  glosarium.md

Git menerima *.txt sebagai pathspec miliknya sendiri dan mencocokkannya secara rekursif terhadap seluruh repository — docs/agenda.txt akhirnya ikut masuk keranjang.

Opsi -u: Hanya Berkas Terlacak #

Kadang kita hanya ingin men-stage suntingan dan penghapusan pada berkas yang sudah dilacak, tanpa memasukkan berkas baru apa pun. Itu pekerjaan opsi -u (update). Kosongkan dulu keranjang:

bash
git restore --staged .
git status -s

Output yang Dihasilkan:

text
 M README.md
 M glosarium.md
?? CATATAN-RILIS.md
?? catatan-latihan.txt
?? docs/
?? draf-catatan.txt

Unstage tidak membuang suntingan apa pun — seluruh perubahan kembali ke working tree. Kemudian:

bash
git add -u
git status -s

Output yang Dihasilkan:

text
M  README.md
M  glosarium.md
?? CATATAN-RILIS.md
?? catatan-latihan.txt
?? docs/
?? draf-catatan.txt

Hanya README.md dan glosarium.md — dua berkas terlacak yang berubah — yang naik ke keranjang; seluruh berkas baru dibiarkan ??. Opsi -u praktis saat folder kerja dipenuhi berkas sementara yang tidak ingin dicatat.

Opsi -p: Memilih Sebagian Suntingan #

Satu berkas bisa memuat dua perubahan yang mau dipisahkan — satu siap dicatat, satu belum. Opsi -p (patch) menawarkan setiap bagian perubahan (hunk) satu per satu. Kita tambahkan bagian Referensi pada README.md:

bash
printf '\n## Referensi\n- Pro Git: git-scm.com/book\n' >> README.md
git status -s

Output yang Dihasilkan:

text
MM README.md
M  glosarium.md
?? CATATAN-RILIS.md
?? catatan-latihan.txt
?? docs/
?? draf-catatan.txt

Kode MM pada README.md — kolom X dan Y sama-sama M — berarti satu suntingan sudah di-stage disusul suntingan baru yang belum. Sekarang jalankan mode interaktifnya; keluaran berikut adalah tangkapan nyata sesi git add -p, dan kita menanggapi prompt dengan q:

bash
git add -p README.md

Output yang Dihasilkan:

text
diff --git a/README.md b/README.md
index de1a786..c1a5e96 100644
--- a/README.md
+++ b/README.md
@@ -2,3 +2,6 @@
 
 Kumpulan catatan teknis tim internal.
 Bagian panduan pengguna ditambahkan di halaman utama.
+
+## Referensi
+- Pro Git: git-scm.com/book
(1/1) Stage this hunk [y,n,q,a,d,e,p,?]? 

Git menampilkan diff bagian yang belum di-stage, lalu bertanya: y memasukkan bagian ini, n melewatinya, q berhenti, dan ? menjelaskan semua jawaban. Karena kita menjawab q, tidak ada bagian baru yang masuk keranjang — suntingan tetap aman di working tree. Strategi memakai mode ini untuk memilah suntingan dibahas tuntas pada chapter Staging Sebagian Perubahan .

Keranjang Penuh: Siap Dicatat #

Chapter ini ditutup dengan keranjang yang terisi penuh — semua perubahan latihan dimasukkan sekaligus:

bash
git add -A
git status -s

Output yang Dihasilkan:

text
A  CATATAN-RILIS.md
M  README.md
A  catatan-latihan.txt
A  docs/agenda.txt
A  docs/faq.md
A  docs/panduan-instalasi.md
A  draf-catatan.txt
M  glosarium.md

Delapan perubahan kini menunggu di staging area. Inilah urutan kerja yang selalu berlaku: git add dulu, git commit kemudian — commit hanya membekukan isi keranjang, sehingga apa pun yang belum di-add akan tertinggal di working tree. Daftar lengkap opsi git add terdokumentasi pada dokumentasi git add .

Keranjang sudah penuh, tetapi riwayat masih berhenti pada dua commit pertama. Saatnya membekukan keranjang menjadi snapshot — lanjut ke git commit .