Siklus hidup pada chapter sebelumnya memperlihatkan berkas berpindah-pindah keadaan, tetapi ada satu garis besar yang membelah semua keadaan itu: berkas yang sudah dikenal Git dan berkas yang belum. Perbedaan tampak sepele sampai dua momen kritis tiba — saat commit dibuat, dan saat kita ingin memulihkan berkas yang rusak atau terhapus. Pada dua momen itulah kategori tracked dan untracked menentukan nasib berkas: yang satu terlindungi penuh oleh riwayat, yang lain sama sekali tidak. Chapter ini membedah kedua kategori, membuktikan konsekuensinya dengan perintah nyata, lalu menyinggung cara mengenyahkan berkas yang memang tidak ingin dilacak sama sekali.

Dua Kategori, Dua Nasib #

Berkas tracked adalah berkas yang terdaftar di index — artinya pernah masuk ke setidaknya satu commit, dan Git terus menyimpan setiap versi tercatatnya. Berkas untracked adalah berkas yang berada di folder proyek tetapi belum pernah di-git add: Git melihat keberadaannya di disk, namun tidak mengawasi isinya. Konsekuensi praktis keduanya:

AspekTrackedUntracked
Terdaftar di indexyatidak
Muncul di git statussaat berubah: modified / stagedselalu, di daftar Untracked files
Perubahannya bisa di-commityatidak, sebelum di-git add
Bisa dipulihkan ke versi lamaya, dari riwayat atau indextidak — tidak ada versi lama yang tersimpan

Sesuai siklus pada chapter Status File , berkas untracked berubah menjadi tracked pada saat pertama kali di-git add lalu di-commit. Sekali menjadi tracked, berkas tetap tracked meskipun dihapus dari disk — Git melaporkannya sebagai deleted hingga keadaan itu dicatat ke commit atau berkasnya dikembalikan.

Melihat Daftar Pelacakan dengan git ls-files #

Siapa saja yang sedang diawasi dapat ditanyakan langsung ke index. Kita siapkan repository latihan kecil berisi README.md dan glosarium.md yang sudah di-commit, lalu menambahkan satu berkas baru catatan-rapat.txt:

bash
git ls-files

Output yang Dihasilkan:

text
README.md
glosarium.md

Perintah git ls-files membaca isi index dan mencetak seluruh berkas tracked — di sinilah catatan-rapat.txt tidak muncul meskipun ada di folder. Kebalikannya, opsi --others mencetak berkas yang tidak ada di index:

bash
git ls-files --others

Output yang Dihasilkan:

text
catatan-rapat.txt

Kedua keluaran tersebut tidak tumpang tindih: setiap berkas muncul di salah satu sisi, karena kategori tracked dan untracked memang saling meniadakan. Daftar lengkap opsi git ls-files terdokumentasi pada dokumentasi git ls-files . Keadaan yang sama dilaporkan git status dalam bentuk ringkas:

bash
git status

Output yang Dihasilkan:

text
On branch main
Untracked files:
  (use "git add <file>..." to include in what will be committed)
	catatan-rapat.txt

nothing added to commit but untracked files present (use "git add" to track)

Konsekuensi 1: Tidak Ikut Commit #

Commit memotret isi index, dan berkas untracked tidak pernah masuk index tanpa git add. Kita buktikan dengan meng-commit suntingan README.md sambil membiarkan catatan-rapat.txt tetap untracked:

bash
printf '# Situs Dokumentasi\n\nKumpulan catatan teknis tim.\nKini dilengkapi panduan kontributor singkat.\n' > README.md
git add README.md
git commit -m "Perbarui pengantar halaman utama"

Output yang Dihasilkan:

text
[main 2da131e] Perbarui pengantar halaman utama
 1 file changed, 1 insertion(+)

Ringkasan commit hanya menyebut satu berkas. Sesudahnya, daftar pelacakan tetap tidak berubah:

bash
git ls-files

Output yang Dihasilkan:

text
README.md
glosarium.md

catatan-rapat.txt tidak ikut commit dan tetap untracked — git status masih menampilkannya di daftar Untracked files yang sama seperti sebelumnya. Commit bukan salinan seluruh folder; commit adalah potret hasil kurasi isi index.

Konsekuensi 2: Tidak Bisa Dipulihkan ke Versi Lama #

Konsekuensi kedua muncul saat kita mencoba memulihkan berkas untracked ke “versi lama” — misalnya setelah isinya tidak sengaja tertimpa. Perintah pemulihan bekerja dari index dan riwayat, sehingga Git menolak berkas yang tidak dikenalnya:

bash
git restore catatan-rapat.txt

Output yang Dihasilkan:

text
error: pathspec 'catatan-rapat.txt' did not match any file(s) known to git

Perintah gagal dengan kode status 1 dan pesan pathspec ... did not match any file(s) known to git: tidak ada entri catatan-rapat.txt di index maupun riwayat, jadi tidak ada sumber pemulihan yang bisa dipakai. Sebaliknya, berkas tracked yang rusak bisa dikembalikan ke versi terakhir dari staging area atau commit — mekanisme lengkapnya dibahas pada chapter Memulihkan File .

Menyingkirkan Derau dengan .gitignore #

Belum tracked bukan satu-satunya keadaan “tidak dilacak”. Ada berkas yang memang tidak ingin dilacak sama sekali — keluaran uji, berkas log, hasil build — dan menampilkannya terus-menerus di git status hanya menambah derau. Buat berkas .gitignore yang memuat pola berkas yang ingin diabaikan:

bash
printf 'Menulis keluaran proses uji.\n' > debug.log
printf '*.log\n' > .gitignore
git status

Output yang Dihasilkan:

text
On branch main
Untracked files:
  (use "git add <file>..." to include in what will be committed)
	.gitignore
	catatan-rapat.txt

nothing added to commit but untracked files present (use "git add" to track)

debug.log lenyap dari daftar untracked — pola *.log menyuruh Git mengabaikan seluruh berkas berakhiran .log. Dua hal layak diperhatikan. Pertama, .gitignore sendiri muncul sebagai untracked dan lazimnya justru dilacak supaya aturan ikutannya ikut dibagikan ke seluruh tim. Kedua, berkas yang diabaikan tidak dihapus dari disk — .gitignore hanya menyembunyikannya dari pandangan Git, isi berkas tetap di folder.

Opsi --others pada git ls-files tadi tetap mencetak debug.log karena opsi tersebut menampilkan semua yang tidak ada di index, termasuk yang diabaikan. Untuk melihat untracked sungguhan tanpa derau, tambahkan --exclude-standard:

bash
git ls-files --others --exclude-standard

Output yang Dihasilkan:

text
.gitignore
catatan-rapat.txt

Terakhir, berkas yang diabaikan bisa dimunculkan kembali secara eksplisit lewat git status --ignored, yang menandainya dengan kode !! — pola yang sudah kita kenal dari tabel kode pada chapter git status . Pola-pola .gitignore yang lebih kaya, pengecualian, dan penanganan berkas yang terlanjur tracked dibahas tuntas pada chapter .gitignore .

Kategori tracked kini jelas batasnya, dan berkas tracked punya hidup yang berlapis: isi di working tree, versi di index, versi di commit terakhir. Tiga lapisan itu — modified, staged, committed — adalah bahasan berikutnya. Lanjut ke Modified, Staged, dan Committed .