ब्लॉग पर वापस

Git Untracked Files हटाना: git clean की Safe गाइड

9 सितंबर 2026

TL;DR: git में untracked files हटाने के लिए git clean -fd चलाएँ — लेकिन पहले हमेशा git clean -nd से preview देखें, क्योंकि clean हमेशा के लिए डिलीट करता है; ये फ़ाइलें कभी trash तक नहीं जातीं। सिर्फ़ फ़ाइलों के लिए -f, फ़ाइलें और डायरेक्टरी दोनों के लिए -fd, और अगर gitignored build output भी साथ जाए तो -fdx। सबसे आम शिकायत — “git clean मेरी untracked files हटा ही नहीं रहा” — लगभग हमेशा इसका मतलब होता है कि फ़ाइलें किसी untracked डायरेक्टरी के अंदर हैं (-d जोड़ें) या वे ignored फ़ाइलें हैं (-x जोड़ें)। Experiments, builds और clone के आस-पास चलने वाले scripts से untracked कचरा इकट्ठा होना स्वाभाविक है; यह गाइड दिखाती है कि हर डिलीट का preview कैसे देखें, सिर्फ़ एक डायरेक्टरी से फ़ाइलें कैसे हटाएँ, और कौन से combinations उस repo में कभी नहीं चलाने चाहिए जिसकी आपको परवाह है।

git status में “untracked files” का मतलब क्या होता है?

Untracked का मतलब है कि git फ़ाइल को डिस्क पर देखता है, लेकिन उसे track करने के लिए कभी कहा नहीं गया — वह index में नहीं है और उसका कोई commit history नहीं। git status सब कुछ तीन हिस्सों में बाँटकर दिखाता है:

$ git status --short
 M src/app.ts        # modified: tracked, बदला हुआ
?? notes.txt         # untracked: नई फ़ाइल, git को नहीं पता
?? build/            # untracked डायरेक्टरी: git के लिए पूरी तरह नई

यह फ़र्क़ इसलिए ज़रूरी है क्योंकि हर हिस्से के लिए हटाने का अलग tool है। Tracked-लेकिन-बदली हुई फ़ाइलें git restore से वापस आती हैं या commit हो जाती हैं — git clean उन्हें छूता भी नहीं। सिर्फ़ ?? वाली lines git clean का इलाक़ा हैं। Ignored फ़ाइलें (जो कुछ भी .gitignore में match होता है) एक छिपी हुई चौथी श्रेणी हैं: वे ?? के रूप में दिखती भी नहीं, और git clean उन्हें छोड़ देता है जब तक आप -x से साफ़ शब्दों में हाँ न कहें।

अगर आपकी असली दिक़्क़त कोई tracked फ़ाइल है जो commit होनी ही नहीं चाहिए थी, तो cleaning ग़लत tool है — वह git rm --cached का काम है, या आख़िरी commit का reset, जैसा कि git undo last commit: keep the changes में बताया गया है।

git में untracked files कैसे हटाएँ?

मूल कमांड है git clean -f-f के बिना git कुछ भी डिलीट करने से मना कर देता है और सिर्फ़ एक warning छापता है — जानबूझकर रखी गई सुरक्षा की रेल। पूरा routine ऐसा दिखता है:

# 1. देखें कि ठीक-ठीक क्या डिलीट होगा (dry run — कुछ डिलीट नहीं होता)
git clean -nd

# हटाया जाएगा:
# notes.txt
# build/
# scratch/

# 2. लिस्ट में कुछ क़ीमती नहीं है, यह कन्फ़र्म करके असल में डिलीट करें
git clean -fd

Flag दर flag:

  • -f / --force — ज़रूरी है। Untracked फ़ाइलें असल में डिलीट करता है।
  • -d — untracked डायरेक्टरी के अंदर तक जाता है। खाली -f सिर्फ़ ऊपरी स्तर पर पड़ी untracked फ़ाइलें हटाता है और जिन डायरेक्टरी को छुए बिना रहा, उनकी सूचना देता है।
  • -n / --dry-run — दिखाता है कि क्या हटता। यह हमेशा पहले चलाएँ।
  • -xignored फ़ाइलें भी डिलीट करता है (node_modules, build output, .env)।
  • -Xसिर्फ़ ignored फ़ाइलें डिलीट करता है; बाक़ी untracked फ़ाइलें बची रहती हैं।
  • -i — interactive mode; dry-run की लिस्ट लंबी हो तो काम आता है।

उठाने लायक़ आदत: git clean -nd को git diff जैसा समझें — commit से पहले देखते हैं, clean से पहले भी।

git clean मेरी untracked files क्यों नहीं हटा रहा?

तीन असली वजहें, उस क्रम में जितनी बार वे डसती हैं:

1. फ़ाइलें किसी untracked डायरेक्टरी के अंदर हैं। सिर्फ़ -f के साथ git बिखरी हुई untracked फ़ाइलें हटा देता है लेकिन डायरेक्टरी पर रुक जाता है — dry run में Would remove build/ छापता है पर असली run में उसे डिलीट नहीं करता। -d जोड़ें:

git clean -fd

2. फ़ाइलें gitignored हैं। node_modules/, dist/, .venv/ — ignored paths साधारण clean को दिखती ही नहीं। Dry run उन्हें list नहीं करेगा, और clean भी नहीं हटाएगा। साफ़ शब्दों में opt in करें:

git clean -fdx   # untracked + ignored फ़ाइलें और डायरेक्टरी

3. बीच में कोई nested git repository या submodule है। Git बाहर से कभी दूसरे repo का content नहीं मिटाता। Submodule को ठीक तरीक़े से हटाएँ या --force दो बार दें (git clean -ffd) — पहला वाला रास्ता बेहतर है।

अगर dry run कुछ नहीं दिखाता पर git status में अब भी ?? entries हैं, तो शायद आप ग़लत working tree में खड़े हैं — git rev-parse --show-toplevel चलाकर देख लें कि आप उसी repo में हैं जिसे साफ़ करना था।

सिर्फ़ किसी एक डायरेक्टरी से untracked files कैसे हटाएँ?

Clean को path देकर scope करें — बाक़ी सब वैसे का वैसा रहता है:

git clean -fd build/          # सिर्फ़ build/ के अंदर
git clean -fd src/generated   # एक ख़ास tree

यही जवाब है “मैं build/ की untracked फ़ाइलें-फ़ोल्डर हटाना चाहता/चाहती हूँ पर repo root के scratch notes रखना चाहता/चाहती हूँ” का। Path आपकी मौजूदा directory से relative होता है, इसलिए repo root से चलाने पर पूरा repo scope बनता है और किसी subdirectory से चलाने पर वही subtree।

बिना डिलीट किए untracked files हटाएँ कैसे?

जब dry run ऐसी फ़ाइलें दिखाए जो बाद में काम आ सकती हैं, तो जुआ न खेलें — पहले सँभालें, फिर साफ़ करें:

# Untracked फ़ाइलों को बिना डिलीट किए stash करें (-a से ignored वाली भी)
git stash push --include-untracked
git clean -fd                      # tree अब साफ़ है
git stash pop                      # ज़रूरत पड़ने पर वापस लाएँ

git stash -u untracked फ़ाइलों को tree से बाहर कर देता है पर उन्हें वापस लाने लायक़ रखता है — यही वह “हटाए बिना हटाना” semantics है जो लोग असल में ढूँढते हैं। ऐसा preview चाहिए जो रह भी जाए, तो git clean -nd > clean-plan.txt कुछ भी commit करने से पहले सटीक list दे देता है। git clean -f के बाद कोई undo नहीं: डिलीट का मतलब ग़ायब।

git clean vs git rm vs git restore: कब कौन सा?

कमांडकिसे छूता हैडिस्क से हटाता हैकब इस्तेमाल करें
git clean -fdUntracked फ़ाइलें/डायरेक्टरीहाँजिन फ़ाइलों को git ने कभी track नहीं किया, उन्हें डिलीट करें
git clean -fdxUntracked + ignoredहाँपूरा reset, node_modules और build output समेत
git rm <file>Tracked फ़ाइलेंहाँ (staged)फ़ाइल डिलीट करें और git में उस डिलीशन का रिकॉर्ड रखें
git rm --cached <file>Tracked फ़ाइलेंनहींट्रैकिंग बंद करें, फ़ाइल डिस्क पर रहने दें
git restore <file>Tracked फ़ाइलेंनहींलोकल बदलाव रद्द करें, फ़ाइल रहने दें

एक line का नियम: clean उस चीज़ का ध्यान रखता है जिसे git नहीं जानता; rm और restore उसके, जिसे git जानता है। इन्हें आपस में मिलाना ही वह तरीक़ा है जिससे लोग अपना काम गँवाते हैं — git clean -fdx चलाना और मानना कि यह git restore जैसा बर्ताव करेगा।

git clean कहाँ कभी नहीं चलाना चाहिए?

दो आदतें, बिल्कुल न करें:

  1. Monorepo या workspace में git clean -fdx आँख मूँदकर न चलाएँ। यह हर ignored डायरेक्टरी डिलीट कर देता है — हर node_modules, हर virtualenv, tree में बिखरा हर लोकल .env। इन्हें वापस पाने का मतलब घंटे भर फिर से install करना हो सकता है, और डिलीट हुआ .env शायद वापस आए ही नहीं।
  2. Clean को force बेक करके alias न बनाएँ। git config alias.wipe "clean -fd" कारगर लगता है, जब तक path में typo न हो जाए। Dry run को एक keystroke की दूरी पर रखें (git clean -nd) और उसे दो-कमांड की आदत बनाएँ: पहले preview, फिर डिलीट।

इसके अलावा एक काम की बात: [sync a fork with upstream] pull से ठीक पहले untracked फ़ाइलें साफ़ कर लेने से merge की surface छोटी रहती है — साफ़ tree सस्ते में मिलने वाला conflict insurance है: sync a fork with upstream, step by step

Safe git clean workflow, संक्षेप में

git status --short        # tree में क्या है?
git clean -nd             # preview: क्या-क्या जाने वाला है?
git clean -fd             # untracked फ़ाइलें + डायरेक्टरी डिलीट
git clean -fdX            # (optional) सिर्फ़ ignored build output साफ़ करें
git status --short        # कन्फ़र्म: working tree clean

Preview करें, डिलीट करें, verify करें — तीस सेकंड, शून्य पछतावा, और git status आख़िरकार फिर से clean पढ़ा जाता है।

— 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: कौन-सा Linux कॉपी कमांड इस्तेमाल करें

लेख पसंद आए? मैं पेशेवर रूप से ऐसे ही काम करता हूँ। मुझे हायर करें