Eksperimen berbulan-bulan meninggalkan jejak: laporan sementara yang dibuat kemarin, direktori tmp/ dari skrip uji, berkas .env dari percobaan konfigurasi, dan hasil build yang menumpuk. Semuanya tidak terlacak, jadi git status berbisik terus tentang berkas yang sebenarnya tidak ingin di-commit — dan kadang berkas itu menyimpan rahasia. git reset tidak bisa menolong karena reset bekerja pada berkas terlacak; sapu untuk wilayah untracked adalah git clean, dan sapu ini tidak punya tombol undo. Bab ini membangun working directory yang kotor secara terkendali, membiasakan dry-run sebelum menyapu, membedakan empat varian flag, lalu merangkai reset dan clean menjadi satu gerakan pemulihan total.
Arena Latihan yang Kotor #
Repository latihan-bersih sengaja dibuat berantakan dengan tiga kategori derau: berkas terlacak yang dimodifikasi, berkas untracked biasa, dan berkas terabaiksa oleh .gitignore
:
mkdir latihan-bersih && cd latihan-bersih
git init -b main
git config user.name "Budi Santoso"
git config user.email "[email protected]"
printf 'beranda toko v1\n' > beranda.md
git add beranda.md
git commit -m "Tambah beranda"
printf 'node_modules/\n.env\nbuild.js\n' > .gitignore
git add .gitignore
git commit -m "Tambah .gitignore"
printf 'beranda toko v2\n' > beranda.md
printf 'laporan sementara\n' > laporan-sementara.txt
mkdir tmp
printf 'data sementara\n' > tmp/data.txt
printf 'KUNCI_API=contoh\n' > .env
printf 'hasil build\n' > build.js
git status --shortOutput yang Dihasilkan:
M beranda.md
?? laporan-sementara.txt
?? tmp/Status hanya menampilkan tiga baris — .env dan build.js absen karena .gitignore menyembunyikannya, meskipun keduanya nyata ada di disk. Kebocoran paling berbahaya justru di barang yang tak terlihat ini: berkas rahasia yang diabaikan sering terlupakan pemiliknya.
Kebiasaan Emas: Dry Run dengan -n #
Perintah git clean tanpa flag menolak berjalan — Git sengaja menuntut kepastian. Kebiasaan yang benar dimulai dari -n (dry run): daftar apa yang akan disapu, tanpa menyapu:
git clean -nOutput yang Dihasilkan:
Would remove laporan-sementara.txtSatu berkas kandidat — direktori tmp/ tidak ikut karena sapu bawaan tidak masuk ke direktori untracked, dan kedua berkas terabaiksa tidak dihitung. Varian flag mengubah cakupannya satu per satu:
git clean -nd
git clean -nx
git clean -nXOutput yang Dihasilkan (-nd):
Would remove laporan-sementara.txt
Would remove tmp/Output yang Dihasilkan (-nx):
Would remove .env
Would remove build.js
Would remove laporan-sementara.txtOutput yang Dihasilkan (-nX):
Would remove .env
Would remove build.jsFlag -d menambahkan direktori untracked ke target. Flag -x mencabut perlindungan .gitignore sehingga berkas terabaiksa ikut disapu — perhatikan .env masuk daftar. Flag -X adalah kebalikan selektifnya: hanya berkas terabaiksa yang disapu, berkas untracked biasa dibiarkan. Perbedaan satu huruf besar-kecil ini menentukan nasib .env, maka jangan pernah mengetiknya di luar dry run.
Menjalankan Pembersihan dengan -f #
Yakin dengan daftar, -f (force) menjalankan sapuan. Karena flag cakupan tetap berlaku, pembersihan paling aman dilakukan bertahap sesuai kategori:
git clean -f
ls
git clean -fd
ls
git clean -fx
git status --shortOutput yang Dihasilkan (-f):
Removing laporan-sementara.txtOutput yang Dihasilkan (ls setelah -f):
beranda.md
build.js
tmpOutput yang Dihasilkan (-fd):
Removing tmp/Output yang Dihasilkan (ls setelah -fd):
beranda.md
build.jsOutput yang Dihasilkan (-fx):
Removing .env
Removing build.jsOutput yang Dihasilkan (status):
M beranda.mdTahap -f menghapus laporan-sementara.txt saja — ls membuktikan tmp dan build.js masih utuh. Tahap -fd melengkapi dengan menyapu direktori tmp/. Tahap -fx terakhir menghabisi kedua berkas terabaiksa. Status penutup memperlihatkan sisa satu-satunya: beranda.md masih tercatat dimodifikasi — git clean memang tidak pernah menyentuh berkas terlacak, wilayahnya murni untracked.
Mode Interaktif dengan -i #
Untuk pembersihan yang butuh pertimbangan per berkas, flag -i membuka sesi tanya-jawab:
Would remove the following item:
laporan-sementara.txt
*** Commands ***
1: clean 2: filter by pattern 3: select by numbers
4: ask each 5: quit 6: help
What now> Bye.Sesi di atas dijalankan dengan input q sehingga ditutup dengan Bye. tanpa menghapus apa pun. Menu lengkapnya: 1: clean menghapus semua item terdaftar, 2: filter by pattern mempersempit daftar dengan pola, 3: select by numbers memilih nomor item, 4: ask each mengonfirmasi satu per satu, 5: quit keluar, dan 6: help menjelaskan tiap pilihan. Mode ini berdiri di antara dry run dan sapuan penuh — berguna saat daftar berkas panjang dan hanya sebagian yang boleh hilang.
Rangkuman Opsi #
| Perintah | Target sapuan | Kapan dipakai |
|---|---|---|
git clean -n | Dry run bawaan | Selalu, sebelum varian lain |
git clean -f | Berkas untracked non-ignored | Derau eksperimen biasa |
git clean -fd | Berkas + direktori untracked | Direktori build/sementara |
git clean -fx | Termasuk berkas terabaiksa | Bersih total — awas .env |
git clean -nX | Hanya berkas terabaiksa (dry run) | Menyetor hasil build saja |
git clean -X | Hapus hanya berkas terabaiksa | Membersihkan artefak build |
git clean -i | Interaktif | Daftar panjang, sebagian disimpan |
Varian bisa digabung sesuai tabel — misalnya -fdx menyapu segalanya termasuk direktori terabaiksa. Rangkaian dokumentasi resmi ada di git clean
.
Reset Total: reset –hard Bersama clean -fd #
Dua alat ini menutup satu sama lain: reset –hard
memulihkan seluruh berkas terlacak ke kondisi commit, clean -fd menyapu sisanya yang untracked. Repository kedua meniru keadaan “kotor total” — satu berkas terlacak dimodifikasi, satu berkas mentah, satu direktori sampah:
cd ..
mkdir latihan-total && cd latihan-total
git init -b main
git config user.name "Budi Santoso"
git config user.email "[email protected]"
printf 'beranda stabil\n' > beranda.md
git add beranda.md
git commit -m "Beranda stabil"
printf 'beranda diutak-atik\n' > beranda.md
printf 'catatan mentah\n' > catatan-mentah.txt
mkdir sampah
printf 'berkas sampah\n' > sampah/berkas.txt
git status --shortOutput yang Dihasilkan:
M beranda.md
?? catatan-mentah.txt
?? sampah/Dua perintah berurutan mengembalikan semuanya ke titik bersih:
git reset --hard
git clean -fd
git statusOutput yang Dihasilkan (reset):
HEAD is now at b292ec5 Beranda stabilOutput yang Dihasilkan (clean):
Removing catatan-mentah.txt
Removing sampah/Output yang Dihasilkan (status):
On branch main
nothing to commit, working tree cleanHash commit pada keluaran reset berbeda-beda mengikuti isi dan waktu pembuatan repository. reset --hard membatalkan utak-atik beranda.md dengan menimpanya dari commit b292ec5; clean -fd menyapu dua sisa untracked; status akhir “working tree clean” adalah definisi persis dari titik nol.
Dari .gitignore yang mencegah derau masuk, Git LFS yang menjaga berkas besar tetap terkelola, hingga worktree dan sapu bersih di bab ini — section Mengelola File dan Repository kini lengkap: Git bukan lagi hanya mencatat perubahan, tetapi juga kita kendalikan bentuknya di disk. Pengetahuan ini menjadi bahan bakar section berikutnya, tempat semua teknik dirangkai menjadi alur kerja utuh pada proyek nyata: Praktik Workflow .