【Git】untracked filesの解消方法|add・.gitignore・git clean・stashの使い分け完全ガイド

【Git】untracked filesの解消方法 Git

git statusを実行するたびに「Untracked files」セクションに気になるファイルが大量に並んでいませんか?ビルド成果物・ログ・一時ファイル・エディタのバックアップ——本来コミットすべきでないファイルが混ざると、重要な変更を見落としやすくなります。

典型的な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で上書きしないよう保護しています。

ファイルの状態 意味 git statusでの表示
tracked 過去にaddされ、Gitが監視している modified:/deleted:/新規変更なら非表示
untracked まだaddされていない新規ファイル Untracked files セクションに表示
ignored .gitignore等で除外指定 通常非表示(-u allで見える)

ポイント:「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パターンから目的に合うものを選んでください。

アプローチ 使いどころ 主要コマンド
① 追跡する リポジトリで管理したい新規ファイル git add+commit
② 無視する ビルド成果物・ログ・IDE設定など永続的に除外したい .gitignore/グローバルignore
③ 削除する もう不要なファイル rmgit clean
④ 一時退避 後で使うが今は邪魔 git stash --include-untracked

ポイント:選び方の原則は「このファイルは今後どうしたいか」。長期的に管理→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に書いて永続的に除外します。正しいパターン文法を知っておくと、効率的に複数ファイルをまとめて無視できます。

基本的な.gitignore
# ログファイル
*.log

# ビルド成果物
dist/
build/
*.min.js
*.min.css

# 依存パッケージ
node_modules/
vendor/
__pycache__/

# 環境変数
.env
.env.local

# IDE
.vscode/
.idea/

# OS
.DS_Store
Thumbs.db

.gitignoreのパターン文法

記法 意味
name 任意の階層でマッチ .env(どこでも)
/name ルートディレクトリのみ /dist/(ルートのdistだけ)
name/ ディレクトリのみ build/
*.ext 拡張子指定 *.log
**/name 再帰的任意階層 **/.cache/
!name 除外を取り消し(否定) !important.log
# comment コメント行 # ログ除外
パターンの組み合わせ例
# すべてのログ除外、でも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に追加しても既存ファイルが無視されないときの解決方法管理からファイルを外す方法を参照してください。

解決③:不要ファイルを削除する

一度きりのテンプファイル・実験コード・誤って作ってしまったファイルはrmgit cleanで削除します。特に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 -n 何もしない(一覧表示) 安全
git clean -f untrackedファイルのみ 中(復元不可)
git clean -fd untrackedファイル+ディレクトリ
git clean -fdx 上記+.gitignore対象も削除 高(node_modules等も消える)

警告:git clean -fdxnode_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)を付けます。

stashでuntrackedを退避
# 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大量整理

initial commit前のクリーンアップ
# 現状確認
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に退避してブランチ切替

untracked込みで退避
# 未追跡含めて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)に書いた方が、チームメンバー間の衝突が減ります。

よくある質問

Q.gitignoreに書いたのに毎回untrackedに出る
Agit check-ignore -v <file>で原因を確認してください。既に追跡中のファイル、パターン間違い、否定!で除外取消していた、などの原因が考えられます。詳細は.gitignoreに追加しても既存ファイルが無視されないときの解決方法を参照。
Qgit clean が「dangerous」と警告を出す
Aclean.requireForce = true(Git既定)で、-fまたは-i/-nのいずれかを指定しないと拒否される設計です。安全のためのガードなので無効化せず、必ず-nで確認してから-fに進みましょう。
Quntracked filesを全部削除したい
Agit clean -ndで対象を確認してからgit clean -fdで削除。.gitignore対象も全部消したいなら-fdxですが、node_modules等も消える危険があるので慎重に。
Qstashにuntracked込みで退避できない
A既定ではuntrackedはstashの対象外です。git stash push --include-untracked(短縮形-u)を付けてください。ignoredまで含めたいなら--all-a)です。
Qディレクトリ全体をuntracked扱いしたい
A.gitignoreにbuild/のようにディレクトリ名+/で書くと配下全部が無視されます。既に追跡中のファイルがあればgit rm -r --cached build/で追跡解除も忘れずに。
Qグローバルgitignoreとリポジトリのgitignoreはどう使い分ける?
A個人環境固有(IDE設定・OS生成ファイル)はグローバル、プロジェクト固有(ビルド成果物・依存パッケージ)はリポジトリの.gitignoreに書きます。こうするとチームメンバー全員に共通のignoreはリポジトリに残り、個人カスタマイズはグローバルで完結します。
Qgit clean で削除したファイルを復元したい
AGit経由では復元できません(Gitが把握していなかったファイルのため)。OSのゴミ箱・IDEのLocal History・Time Machine等のバックアップツールを確認してください。今後のためにgit clean -nで事前確認を徹底しましょう。

関連記事

まとめ

  • 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を打ってから削除する習慣を付けていきましょう。