git statusを実行するたびに「Untracked files」セクションに気になるファイルが大量に並んでいませんか?ビルド成果物・ログ・一時ファイル・エディタのバックアップ——本来コミットすべきでないファイルが混ざると、重要な変更を見落としやすくなります。
$ git status On branch main Untracked files: (use "git add <file>..." to include in what will be committed) debug.log tmp/ .vscode/ node_modules/ nothing added to commit but untracked files present (use "git add" to track)
この記事では、Gitの「untracked files」を状況別にすっきり解消する方法を体系的に解説します。4つのアプローチ(追加/無視/削除/退避)、.gitignoreのパターン文法、git cleanの安全な使い方、大量untrackedを一気に片付けるテクニックまで、実務で役立つ形でまとめました。
この記事で学べること
- untracked filesの定義と発生原因
- 4つの解消アプローチ(add/ignore/delete/stash)の使い分け
.gitignoreのパターン文法(glob・否定!・**再帰)git cleanのオプションと安全な運用(dry-run必須)- 大量untrackedを一気に解消するテクニック
- ビルド成果物・IDEファイル・OS固有ファイルへの対処
- グローバルgitignoreで環境固有ファイルを一括除外する方法
untracked filesとは何か
untracked files(未追跡ファイル)とはGitが一度もadd・commitしたことのないファイルです。作業ディレクトリには存在するが.gitの管理下にはない状態を指します。Gitは安全のため、追跡していないファイルをpullやcheckoutで上書きしないよう保護しています。
ポイント:「Untracked files」はエラーではなくGitからの通知です。「このファイル、どうしますか?」と質問されているだけなので、意図的に対応を選べば解消できます。ただし、放置すると誤コミット(本来不要なファイルを追加してしまう)リスクが高まるため、こまめに整理する習慣が大切です。
git statusの表示を調整する
「Untracked files」表示は-u(--untracked-files)オプションで詳細度を変えられます。プロジェクトの状況に応じて使い分けましょう。
# 既定:ディレクトリ配下をまとめて表示 git status # → "node_modules/" のようにディレクトリで1行 # -u all:配下のすべてのファイルを展開表示 git status -u git status --untracked-files=all # -u no:untracked非表示(集中したいとき) git status -uno # コンパクト表示(2文字ステータス) git status -sb # 出力例: ?? debug.log ← ??がuntracked # 既定のuntracked表示モードをno に変更 git config --global status.showUntrackedFiles no
showUntrackedFilesの設定値
all:すべてのuntrackedファイルを個別表示normal(既定):ディレクトリは1行にまとめno:untracked非表示- リポジトリごとに設定するなら
--globalを外す
解消方法は4つのアプローチから選ぶ
untracked filesの解消はそのファイルをどう扱いたいかで決まります。以下の4パターンから目的に合うものを選んでください。
ポイント:選び方の原則は「このファイルは今後どうしたいか」。長期的に管理→add、永続的に除外→.gitignore、一度きり→削除、後で使う→stash。誤った選択でも基本はやり直し可能(削除した未追跡ファイル以外)なので、気軽に選んで試せます。
解決①:git addで追跡対象に加える
新しく作ったソースコード・設定ファイル・ドキュメントなど、チームで共有したいものはgit addで追跡対象に変えます。これでuntrackedからtracked(staged)に状態が変わります。
# 単一ファイル git add src/new_feature.py # 複数ファイル git add src/auth.py src/utils.py # ディレクトリ配下すべて git add src/ # カレントディレクトリ以下すべて(.gitignore対象以外) git add . # インタラクティブに選ぶ git add -i # 状態確認 git status # コミット git commit -m "feat: 新機能ファイルを追加"
注意:git add .は便利ですが、.gitignoreに書かれていない不要ファイルまで混入するリスクがあります。事前にgit statusで対象を確認するか、git add -iで選びながら追加する習慣を付けましょう。staged内容の確認はaddしたファイルの変更を確認する方法を参照。
解決②:.gitignoreで無視する
ビルド成果物・ログ・IDE設定・OS固有ファイル(.DS_Store等)は、.gitignoreに書いて永続的に除外します。正しいパターン文法を知っておくと、効率的に複数ファイルをまとめて無視できます。
# ログファイル *.log # ビルド成果物 dist/ build/ *.min.js *.min.css # 依存パッケージ node_modules/ vendor/ __pycache__/ # 環境変数 .env .env.local # IDE .vscode/ .idea/ # OS .DS_Store Thumbs.db
.gitignoreのパターン文法
# すべてのログ除外、でもimportant.logだけは追跡 *.log !important.log # ルートのdistだけ無視、サブのsrc/distは追跡 /dist/ # すべての.cacheを再帰的に無視 **/.cache/ **/node_modules/ # 特定ファイル名のみ除外 config.local.json
グローバル.gitignore
# グローバル.gitignoreの場所を設定 git config --global core.excludesfile ~/.gitignore_global # ファイルに記述(環境固有) cat >> ~/.gitignore_global << "EOF" # macOS .DS_Store # Windows Thumbs.db Desktop.ini # Linux *~ # エディタ *.swp .idea/ .vscode/ EOF
ポイント:個人の開発環境固有ファイル(IDE設定・OS生成ファイル)はグローバル.gitignoreで一度設定すれば全リポジトリに適用されます。プロジェクト固有のignore(ビルド成果物・依存パッケージ)はリポジトリの.gitignoreに書き分けると、チーム全員が共有すべきignore設定と個人設定を分離できます。
既に追跡中のファイルは.gitignoreでは無視されません。その場合はgit rm --cachedで一度追跡解除が必要です。詳細は.gitignoreに追加しても既存ファイルが無視されないときの解決方法や管理からファイルを外す方法を参照してください。
解決③:不要ファイルを削除する
一度きりのテンプファイル・実験コード・誤って作ってしまったファイルはrmかgit cleanで削除します。特にgit cleanは一気に片付けられる強力なコマンドですが、復元できないため使い方を押さえておきましょう。
# dry-run:何が削除されるかだけ表示(必須) git clean -n git clean --dry-run # 対話モード:1つずつ確認しながら削除 git clean -i git clean --interactive # 確認なしで強制削除(ファイルのみ) git clean -f git clean --force # ディレクトリも含める git clean -fd # .gitignore対象ファイルも含めて削除(最強) git clean -fdx # 特定パスだけ git clean -fd src/tmp/
オプション組み合わせ早見表
警告:git clean -fdxはnode_modules/・venv/・.envなど.gitignoreで除外していた大事なものまで削除します。機密ファイルや再構築コストの高いファイルが含まれていないか、必ずgit clean -nxで事前確認してください。
通常の rm との違い
rm と git clean の使い分け
- rm:OSコマンド。ファイル指定必須、ゴミ箱行きにもならない
- git clean:Gitコマンド。untracked/ignoredをまとめて削除可、dry-run機能あり
- 大量整理は
git clean -n→確認→-fの流れが効率的 - IDEのローカル履歴で復元できるケースもある(VS CodeのTimeline等)
解決④:stashで一時退避する
「今は邪魔だが後で使うかも」という場合はgit stashで退避できます。既定ではuntrackedは対象外なので、--include-untracked(-u)を付けます。
# untrackedも含めてstash
git stash push --include-untracked -m "untracked退避"
git stash push -u -m "untracked退避"
# ignoredまで含めたい場合(レアケース)
git stash push --all -m "全部退避"
# 特定ファイルだけ
git stash push -u -m "debug退避" -- debug.log tmp/
# 確認
git stash list
# 戻す
git stash pop
# stashの中身を見る
git stash show -p stash@{0}
stashの復元トラブル対処はstashした内容を失ってしまったときの復元方法も参考になります。
大量のuntrackedを一気に片付けるテクニック
久しぶりに開いたプロジェクトで何十個ものuntrackedが出た、といった状況の対処法です。
# untracked一覧だけ抽出(スクリプト用途に便利) git ls-files --others --exclude-standard # ignoredも含めて確認 git status --ignored # 特定パターンだけdry-run確認してから削除 git clean -n -- "*.log" git clean -f -- "*.log" # ディレクトリ配下だけ git clean -nd src/tmp/ git clean -fd src/tmp/ # 大量のuntrackedをまずは把握 git ls-files --others --exclude-standard | wc -l # → 47 など
カテゴリ別の分類アプローチ
分類→処理の流れ
- 1. ソースコード系:
git add+commit - 2. 成果物・キャッシュ:.gitignore追記+
git rm --cached(誤って追跡されていた場合) - 3. 一時ファイル:
git clean -nで確認→-fで削除 - 4. 判断保留のもの:
git stash -uで退避しておく
untrackedが消えない原因を特定する
「.gitignoreに書いたのに毎回untrackedに表示される」「git clean -fdしたのに戻ってくる」といったケースがあります。原因は複数あります。
よくある原因
- .gitignoreのパターンが合っていない:
git check-ignore -v <file>で確認 - 既にtrackedになっている:.gitignoreでは除外できない。
git rm --cached必要 - ビルドプロセスが勝手に生成:IDE/watcher/CIが毎回ファイルを作成
- 別ブランチのファイルが残っている:切替前のブランチ固有ファイル
- sparse-checkoutやworktree設定:特殊な設定で表示される
# なぜこのファイルが無視されない/されているかを確認 git check-ignore -v debug.log # 出力例: .gitignore:5:*.log debug.log ← .gitignoreの5行目のルールでマッチ # 何も出なければ無視対象ではない # .gitignoreのどの行が効いているか詳細表示 git check-ignore -v --no-index tmp/foo.txt # ファイルが誰に/いつ作られたか調査 stat debug.log lsof debug.log # 開いているプロセス # 全設定を含めた ignore 判定 git check-ignore --verbose --all debug.log
ポイント:git check-ignore -vは「このファイルがignoreされるか/されない理由」を教えてくれる診断コマンドです。「.gitignoreに書いたのに効かない」と悩んだら、まずこのコマンドで確認しましょう。
実践シナリオ
シナリオ① 新規プロジェクトのuntracked大量整理
# 現状確認 git status git ls-files --others --exclude-standard | head -50 # .gitignore を整備 cat > .gitignore << "EOF" node_modules/ dist/ build/ .env *.log .DS_Store .vscode/ .idea/ EOF # 残ったuntrackedを追加 git add -A git commit -m "feat: initial commit"
シナリオ② node_modulesが追跡されてしまっている
# .gitignoreに追加 echo "node_modules/" >> .gitignore # 既に追跡されている分を index から外す git rm -r --cached node_modules/ # commit git add .gitignore git commit -m "chore: node_modulesを追跡対象から除外"
シナリオ③ ビルド成果物を全部消して工場リセット
# 事前確認(必ず) git clean -nx git clean -nxd # ビルド成果物とパッケージ丸ごと削除 git clean -fdx # 再構築 npm install npm run build
シナリオ④ stashに退避してブランチ切替
# 未追跡含めてstash git stash push -u -m "wip: feature試作中" # 別ブランチへ移動 git switch main # 作業終わったら戻る git switch feature/xxx git stash pop
やってはいけない落とし穴
git clean -nで確認せずに -fdx を実行する
git clean -fdxは.gitignore対象も含めて削除します。node_modules/・.venv/・.env(機密情報含む)も消えて、再構築に数時間、ローカル認証情報を失って社内サービスに入れなくなる、といった事故が起きます。必ずgit clean -nxdで事前確認してから実行してください。
既に追跡されているファイルを.gitignoreで無視できると思う
.gitignoreはまだtrackedになっていないファイルにしか効きません。一度git addされたファイルはgit rm --cached <file>で追跡解除してから.gitignoreで除外する手順が必要です。詳しくは.gitignoreに追加しても既存ファイルが無視されないときの解決方法を参照。
git add .で機密ファイルまで混入
.env・config.local.json・APIキーを含む設定ファイルが.gitignoreに書かれていないままgit add .すると、機密情報が履歴に残ります。対処は「即rotate+filter-repoで履歴削除」と重たい作業になるので、addする前に必ず.gitignoreの整備を。詳細は履歴に含まれる機密情報を完全に削除する方法を参照。
IDEのLocal Historyを当てにして大事なファイルを消す
VS CodeのTimeline機能・JetBrainsのLocal Historyは便利ですが、設定や期限によっては復元できないことがあります。大事なファイルはgit clean前に手動バックアップしておくのが安全です。
チーム共有の.gitignoreに個人設定を書く
リポジトリ直下の.gitignoreはチーム共有です。個人のエディタ固有設定・OS固有ファイル(.DS_Store等)はグローバルgitignore(~/.gitignore_global)に書いた方が、チームメンバー間の衝突が減ります。
よくある質問
git check-ignore -v <file>で原因を確認してください。既に追跡中のファイル、パターン間違い、否定!で除外取消していた、などの原因が考えられます。詳細は.gitignoreに追加しても既存ファイルが無視されないときの解決方法を参照。clean.requireForce = true(Git既定)で、-fまたは-i/-nのいずれかを指定しないと拒否される設計です。安全のためのガードなので無効化せず、必ず-nで確認してから-fに進みましょう。git clean -ndで対象を確認してからgit clean -fdで削除。.gitignore対象も全部消したいなら-fdxですが、node_modules等も消える危険があるので慎重に。git stash push --include-untracked(短縮形-u)を付けてください。ignoredまで含めたいなら--all(-a)です。build/のようにディレクトリ名+/で書くと配下全部が無視されます。既に追跡中のファイルがあればgit rm -r --cached build/で追跡解除も忘れずに。git clean -nで事前確認を徹底しましょう。関連記事
- 【Git】.gitignoreに追加しても既存ファイルが無視されないときの解決方法 — 追跡済みファイルのignore対処
- 【Git】管理からファイルを外す方法 — rm –cachedによる追跡解除
- 【Git】addの取り消し方法 — staged変更の戻し方
- 【Git】消したファイルを戻す方法 — 削除後の復元手順
- 【Git】stashした内容を失ってしまったときの復元方法 — stash消失時の救済
- 【Git】履歴に含まれる機密情報を完全に削除する方法 — 機密誤コミットからの回復
- 【Git】addしたファイルの変更を確認する方法 — staged内容の確認
- 【Git】よく使うgitコマンドまとめ — 日常コマンドの早見表
まとめ
- untracked filesはエラーでなく「この新規ファイルどうする?」というGitからの通知
- 解消は4方向:追跡(add)/無視(.gitignore)/削除(rm・clean)/退避(stash -u)
.gitignore文法はglob+否定!+再帰**で表現力豊富- 既追跡ファイルは.gitignoreでは無視できない→
git rm --cachedで追跡解除 git cleanは強力、必ず-nで事前確認、-fdxは特に慎重に- 個人環境ファイルはグローバルgitignore、プロジェクト固有はリポジトリの
.gitignore - 動作しないときは
git check-ignore -vで診断
untracked filesの整理は地味ですが、日々のcommit精度とSecret漏洩予防に直結する基礎作業です。.gitignoreの整備・git cleanの安全運用・グローバルignoreの活用——この3点を押さえておけば、git statusを打つたびに「今何をコミットすべきか」が一目で分かるクリーンな状態を保てます。新しいプロジェクトを始めるたびに.gitignoreを整備する習慣と、git clean -nを打ってから削除する習慣を付けていきましょう。
