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:
git restore --staged README.md
git restore README.md glosarium.md
git status -sOutput yang Dihasilkan:
?? draf-catatan.txtSatu 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:
git add draf-catatan.txt
git statusOutput yang Dihasilkan:
On branch main
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
new file: draf-catatan.txtgit status -sOutput yang Dihasilkan:
A draf-catatan.txtLabel 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):
git restore --staged draf-catatan.txt
git status -sOutput yang Dihasilkan:
?? draf-catatan.txtStaging 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:
rm glosarium.md
git statusOutput yang Dihasilkan:
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:
git add glosarium.md
git status -sOutput yang Dihasilkan:
D glosarium.md
?? draf-catatan.txtKode 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:
git restore --staged glosarium.md
git restore glosarium.md
git status -sOutput yang Dihasilkan:
?? draf-catatan.txtLangkah 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:
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 -sOutput yang Dihasilkan:
M README.md
M glosarium.md
?? draf-catatan.txtSatu 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:
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 -sOutput yang Dihasilkan:
M README.md
M glosarium.md
?? docs/
?? draf-catatan.txtDirektori 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:
git add docs
git status -sOutput yang Dihasilkan:
M README.md
A docs/faq.md
A docs/panduan-instalasi.md
M glosarium.md
?? draf-catatan.txtgit 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/:
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 -sOutput yang Dihasilkan:
M ../README.md
A agenda.txt
A faq.md
A panduan-instalasi.md
M ../glosarium.md
?? ../CATATAN-RILIS.md
?? ../draf-catatan.txtDari 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:
git add -A
git status -sOutput yang Dihasilkan:
A ../CATATAN-RILIS.md
M ../README.md
A agenda.txt
A faq.md
A panduan-instalasi.md
A ../draf-catatan.txt
M ../glosarium.mdgit 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:
| Perintah | Cakupan |
|---|---|
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 -A | Seluruh 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:
cd ..
git restore --staged docs/agenda.txt
printf 'Riwayat latihan singkat.\n' > catatan-latihan.txt
git status -sOutput yang Dihasilkan:
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.txtAda 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:
git add *.txt
git status -sOutput yang Dihasilkan:
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.txtShell 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:
git add '*.txt'
git status -sOutput yang Dihasilkan:
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.mdGit 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:
git restore --staged .
git status -sOutput yang Dihasilkan:
M README.md
M glosarium.md
?? CATATAN-RILIS.md
?? catatan-latihan.txt
?? docs/
?? draf-catatan.txtUnstage tidak membuang suntingan apa pun — seluruh perubahan kembali ke working tree. Kemudian:
git add -u
git status -sOutput yang Dihasilkan:
M README.md
M glosarium.md
?? CATATAN-RILIS.md
?? catatan-latihan.txt
?? docs/
?? draf-catatan.txtHanya 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:
printf '\n## Referensi\n- Pro Git: git-scm.com/book\n' >> README.md
git status -sOutput yang Dihasilkan:
MM README.md
M glosarium.md
?? CATATAN-RILIS.md
?? catatan-latihan.txt
?? docs/
?? draf-catatan.txtKode 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:
git add -p README.mdOutput yang Dihasilkan:
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:
git add -A
git status -sOutput yang Dihasilkan:
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.mdDelapan 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 .