Kembali ke blog

Git Remove Untracked Files: Panduan Aman git clean

9 September 2026

TL;DR: untuk menghapus file untracked di git, jalankan git clean -fd — tetapi selalu pratinjau dengan git clean -nd terlebih dahulu, karena clean menghapus secara permanen dan file tidak pernah masuk ke trash. Gunakan -f untuk file, -fd untuk file dan direktori, dan -fdx jika output build yang di-gitignore juga harus ikut hilang. Keluhan paling umum — “git clean tidak menghapus file untracked saya” — hampir selalu berarti file-file itu berada di dalam sebuah direktori untracked (tambahkan -d) atau mereka adalah file ignored (tambahkan -x). Sampah untracked adalah produk sampingan yang wajar dari eksperimen, build, dan skrip sekitar clone; panduan ini menunjukkan cara mempratinjau setiap penghapusan, menghapus file dari satu direktori saja, dan kombinasi mana yang tidak boleh pernah Anda jalankan di repo yang Anda sayangi.

Apa arti “untracked files” di git status?

Untracked berarti git melihat file itu di disk tetapi tidak pernah diperintah untuk melacaknya — file itu tidak ada di index dan tidak punya riwayat commit. git status mengelompokkan semuanya ke dalam tiga keranjang:

$ git status --short
 M src/app.ts        # dimodifikasi: terlacak, berubah
?? notes.txt         # untracked: file baru yang tak dikenal git
?? build/            # direktori untracked: benar-benar baru bagi git

Pembedaan ini penting karena tiap keranjang butuh alat penghapus yang berbeda. File terlacak-tapi-berubah dikembalikan dengan git restore atau diselesaikan lewat commit — git clean tidak akan menyentuhnya. Hanya baris ?? yang merupakan wilayah git clean. File ignored (apa pun yang cocok dengan .gitignore) adalah keranjang keempat yang tersembunyi: mereka bahkan tidak muncul sebagai ??, dan git clean melewatinya kecuali Anda secara eksplisit ikut serta dengan -x.

Jika masalah Anda yang sebenarnya adalah file terlacak yang seharusnya tidak pernah di-commit, pembersihan adalah alat yang salah — itu pekerjaan git rm --cached, atau reset commit terakhir seperti yang dibahas di git undo last commit: pertahankan perubahannya.

Bagaimana cara menghapus file untracked di git?

Perintah intinya adalah git clean -f. Tanpa -f, git menolak menghapus apa pun dan hanya mencetak peringatan — pengaman yang memang disengaja. Rutinitas lengkapnya seperti ini:

# 1. Lihat persis apa yang akan dihapus (dry run — tidak menghapus apa pun)
git clean -nd

# Akan menghapus:
# notes.txt
# build/
# scratch/

# 2. Pastikan tidak ada yang berharga di daftar, lalu hapus sungguhan
git clean -fd

Satu per satu flag-nya:

  • -f / --force — wajib. Benar-benar menghapus file untracked.
  • -d — masuk ke dalam direktori untracked. -f saja hanya menghapus file untracked di tingkat atas dan melaporkan direktori yang menolak disentuhnya.
  • -n / --dry-run — menampilkan apa yang akan dihapus. Selalu jalankan ini lebih dulu.
  • -x — ikut menghapus file yang ignored (node_modules, output build, .env).
  • -X — menghapus hanya file ignored, membiarkan yang untracked-tapi-tidak-ignored.
  • -i — mode interaktif; berguna saat daftar dry-run panjang.

Satu kebiasaan yang layak ditiru: perlakukan git clean -nd seperti git diff — Anda melihat dulu sebelum commit, lihat dulu sebelum clean.

Kenapa git clean tidak menghapus file untracked saya?

Tiga penyebab nyata, diurutkan dari yang paling sering menggigit:

1. File-filenya berada di dalam direktori untracked. Hanya dengan -f, git menghapus file untracked yang lepas tetapi berhenti di direktori — bahkan melaporkan Would remove build/ tanpa menghapusnya saat eksekusi nyata. Tambahkan -d:

git clean -fd

2. File-filenya di-gitignore. node_modules/, dist/, .venv/ — path yang diabaikan tak terlihat oleh clean biasa. Dry run tidak akan mencantumkannya, dan clean pun tidak akan menghapusnya. Ikut serta secara eksplisit:

git clean -fdx   # file dan direktori untracked + ignored

3. Ada repositori git bersarang atau submodule yang menghalangi. Git tidak pernah menghapus isi repo lain dari luar. Lepaskan submodule dengan benar atau berikan --force dua kali (git clean -ffd), dan pilih opsi pertama.

Jika dry run tidak mencantumkan apa pun tetapi git status masih menampilkan entri ??, kemungkinan Anda berada di working tree yang salah — jalankan git rev-parse --show-toplevel dan pastikan Anda berada di repo yang memang ingin dibersihkan.

Bagaimana menghapus file untracked hanya dari direktori tertentu?

Batasi lingkup clean dengan memberikan path — sisanya dibiarkan sendiri:

git clean -fd build/          # hanya di dalam build/
git clean -fd src/generated   # satu pohon direktori tertentu

Inilah jawaban untuk “saya ingin menghapus file dan folder untracked di build/ tetapi menyimpan catatan coretan saya di root repo”. Path-nya relatif terhadap direktori Anda saat ini, jadi menjalankan dari root repo mencakup seluruh repo; menjalankan dari subdirektori mencakup subtree itu saja.

Bagaimana menghapus file untracked tanpa benar-benar menghapusnya?

Saat dry run menampilkan file yang mungkin Anda butuhkan nanti, jangan berjudi — amankan dulu, bersihkan belakangan:

# Stash file untracked (termasuk yang ignored dengan -a) tanpa menghapus
git stash push --include-untracked
git clean -fd                      # pohon kerja bersih
git stash pop                      # kembalikan saat dibutuhkan

git stash -u memindahkan file untracked keluar dari pohon kerja tetapi tetap bisa dipulihkan — itulah semantik “hapus tanpa menghapus” yang sebenarnya dicari orang. Untuk pratinjau yang bisa disimpan, git clean -nd > clean-plan.txt memberi Anda daftar persisnya sebelum berkomitmen pada apa pun. Tidak ada undo setelah git clean -f: yang terhapus berarti hilang.

git clean vs git rm vs git restore: pakai yang mana, kapan?

PerintahMenyentuhDihapus dari diskPakai saat
git clean -fdFile/direktori untrackedYaMenghapus file yang tak pernah dilacak git
git clean -fdxUntracked + ignoredYaReset penuh termasuk node_modules, output build
git rm <file>File terlacakYa (ter-stage)Menghapus file dan mencatat penghapusannya di git
git rm --cached <file>File terlacakTidakBerhenti melacak file, biarkan tetap di disk
git restore <file>File terlacakTidakMembuang editan lokal, file tetap ada

Aturan satu barisnya: clean mengelola apa yang tidak diketahui git; rm dan restore mengelola apa yang diketahuinya. Tertukar di antara keduanya adalah cara orang kehilangan pekerjaan — menjalankan git clean -fdx sambil percaya perintah itu berperilaku seperti git restore.

Kebiasaan apa yang harus dihindari saat memakai git clean?

Dua kebiasaan yang harus dihindari sama sekali:

  1. Jangan pernah menjalankan git clean -fdx secara buta di monorepo atau workspace. Perintah itu menghapus setiap direktori yang di-ignore — artinya setiap node_modules, setiap virtualenv, setiap .env lokal di dalam pohon. Memulihkannya bisa berarti satu jam instalasi ulang, dan .env yang terhapus mungkin tidak bisa dipulihkan sama sekali.
  2. Jangan pernah membuat alias clean dengan force yang sudah tertanam. git config alias.wipe "clean -fd" terasa efisian sampai Anda salah ketik path. Simpan dry run satu ketukan jauhnya (git clean -nd) dan jadikan ritual dua perintah: pratinjau dulu, baru hapus.

Satu lagi yang berguna: membersihkan file untracked tepat sebelum pull [sync a fork with upstream] menjaga permukaan merge tetap kecil — pohon kerja yang rapi adalah asuransi konflik termurah yang ada: sinkronkan fork dengan upstream, langkah demi langkah.

Alur kerja git clean yang aman, ringkasnya

git status --short        # apa isi pohon kerja?
git clean -nd             # pratinjau: apa yang AKAN terhapus?
git clean -fd             # hapus file + direktori untracked
git clean -fdX            # (opsional) bersihkan hanya output build yang ignored
git status --short        # konfirmasi: working tree bersih

Pratinjau, hapus, verifikasi — tiga puluh detik, nol penyesalan, dan git status akhirnya kembali bersih.

— mrsaynothing

Get the next one by email

One email per post. No spam, no algorithms.

self-hosted · no third parties · one-click unsubscribe

what is this?

Rsync vs SCP: Perintah Salin Linux Mana yang Dipakai

Suka tulisannya? Saya membangun seperti ini untuk hidup. pekerjakan saya