この記事で解決すること

「node_modulesをGitHubにpushしてしまった」「.envファイルにAPIキーを書いたまま公開してしまった」

こうしたミスを防ぐのが .gitignore ファイルです。この記事では、.gitignoreの書き方と、よく使うパターンを解説します。

GitHubを使い始めたばかりの方は、まずGitHubの基本を押さえてからこの記事を読むとスムーズです。

.gitignoreとは

.gitignore は、Gitに「このファイルは追跡しないでください」と伝えるための設定ファイルです。

プロジェクトのルートディレクトリに .gitignore という名前のファイルを作り、無視したいファイルやフォルダのパターンを1行ずつ書きます。

# .gitignoreの例
node_modules/
.env
dist/

このファイルに書かれたパターンに一致するファイルは、git add しても追跡されません。

なぜ.gitignoreが必要なのか

GitHubに上げてはいけないファイルは、大きく3つのカテゴリに分かれます。

機密情報

.env ファイルにはAPIキーやデータベースのパスワードが含まれていることがあります。これをGitHubに公開すると、第三者に悪用される危険があります。

環境変数の管理方法については環境変数と.envファイルの使い方で詳しく解説しています。

自動生成されるファイル

node_modules/(npm/yarnの依存パッケージ)や dist/(ビルド出力)は、コマンド一つで再生成できます。これらをリポジトリに含めると、容量が膨大になり、cloneやpullに時間がかかります。

npm/yarnの基本を理解していれば、npm installnode_modules が再生成されることが分かるはずです。

OS・エディタ固有のファイル

.DS_Store(macOS)や Thumbs.db(Windows)、.vscode/(VS Code設定)など、開発環境に依存するファイルは、他の開発者には不要です。

.gitignoreの基本的な書き方

ファイル名を直接指定する

# 特定のファイルを無視
.env
.DS_Store
Thumbs.db

ディレクトリを指定する

末尾に / をつけると、ディレクトリ全体を無視します。

# ディレクトリを無視
node_modules/
dist/
build/
__pycache__/

ワイルドカード(*)を使う

* は任意の文字列にマッチします。

# すべてのログファイルを無視
*.log

# すべての.tmpファイルを無視
*.tmp

ダブルアスタリスク(**)を使う

** はディレクトリの深さに関係なくマッチします。

# どの階層にある.envファイルも無視
**/.env

# どの階層にあるnode_modulesも無視
**/node_modules/

否定パターン(!)を使う

! をつけると、無視ルールの例外を指定できます。

# すべてのログファイルを無視するが、error.logだけは追跡する
*.log
!error.log

ディレクトリ内の特定ファイルを指定する

先頭に / をつけると、ルートディレクトリからの相対パスになります。

# ルート直下の.envだけ無視(サブディレクトリの.envは追跡する)
/.env

# srcディレクトリ内のテストファイルを無視
src/**/*.test.js

コメントを書く

# で始まる行はコメントです。何を無視しているか説明を書いておくと、後から見たときに分かりやすくなります。

# 依存パッケージ
node_modules/

# 環境変数(APIキーなどの機密情報)
.env
.env.local

# ビルド出力
dist/
build/

言語・フレームワーク別のよく使うパターン

JavaScript / TypeScript(Node.js)

# 依存パッケージ
node_modules/

# ビルド出力
dist/
build/
.next/
out/

# 環境変数
.env
.env.local
.env.*.local

# ログ
npm-debug.log*
yarn-debug.log*
yarn-error.log*

# OS固有
.DS_Store
Thumbs.db

Python

# 仮想環境
venv/
.venv/
env/

# バイトコードキャッシュ
__pycache__/
*.py[cod]
*.pyo

# 配布・ビルド
dist/
build/
*.egg-info/

# 環境変数
.env

# IDE
.idea/
.vscode/

Pythonの仮想環境についてはPython仮想環境(venv)の使い方で解説しています。

Java

# コンパイル出力
*.class
target/
build/

# IDE
.idea/
*.iml
.eclipse/
.settings/

# ログ
*.log

すでに追跡されているファイルを無視する方法

.gitignore に追加しても、すでにGitが追跡しているファイルは無視されません。追跡を解除するには、以下のコマンドを実行します。

ステップ1: キャッシュからファイルを削除する

# 特定のファイルの追跡を解除(ファイル自体は削除されない)
git rm --cached .env

# ディレクトリの追跡を解除
git rm --cached -r node_modules/

--cached オプションをつけることで、ローカルのファイルは残したまま、Gitの追跡だけを解除できます。

ステップ2: .gitignoreに追加する

.env
node_modules/

ステップ3: コミットする

git add .gitignore
git commit -m ".envとnode_modulesの追跡を解除"

Gitブランチの基本を理解していれば、この変更を別ブランチで行ってからマージすることもできます。

gitignore.ioで自動生成する

gitignore.ioは、言語やフレームワークを選ぶだけで .gitignore を自動生成してくれるWebツールです。

使い方

  1. gitignore.io にアクセスする
  2. 使用する言語やツールを入力する(例:Node, Python, macOS)
  3. 「Create」をクリックする
  4. 生成された内容をプロジェクトの .gitignore にコピーする

コマンドラインからも使えます。

# Node.js + macOS用の.gitignoreを生成
curl -sL https://www.toptal.com/developers/gitignore/api/node,macos

グローバル.gitignoreを設定する

.DS_Store.vscode/ のように、すべてのプロジェクトで無視したいファイルは、グローバル .gitignore に設定すると便利です。

# グローバル.gitignoreファイルを作成
git config --global core.excludesfile ~/.gitignore_global

~/.gitignore_global に共通の無視パターンを書きます。

# macOS
.DS_Store

# Windows
Thumbs.db
desktop.ini

# エディタ
.vscode/
.idea/
*.swp
*~

これで、プロジェクトごとの .gitignore にはプロジェクト固有のパターンだけを書けばよくなります。

よくあるミスと注意点

.envをpushしてしまった場合

APIキーやパスワードが含まれた .env をGitHubに公開してしまった場合、すぐに以下の対応を行ってください。

  1. 漏洩したAPIキーやパスワードを無効化・再発行する
  2. git rm --cached .env で追跡を解除する
  3. .gitignore.env を追加する
  4. コミットしてpushする

重要: Gitの履歴にはファイルの内容が残り続けます。コミットを消しても、履歴をたどれば閲覧できます。漏洩した認証情報は必ず再発行してください。

.gitignoreが効かない場合

.gitignore に書いたのに無視されない場合、そのファイルがすでにGitに追跡されている可能性があります。前述の git rm --cached で追跡を解除してください。

空のディレクトリを保持したい場合

Gitは空のディレクトリを追跡しません。空のディレクトリを残したい場合は、そのディレクトリに .gitkeep という空ファイルを作成する慣習があります。

# logsディレクトリを保持する
touch logs/.gitkeep
# logsディレクトリ内のファイルは無視するが、.gitkeepは残す
logs/*
!logs/.gitkeep

よくある質問(FAQ)

Q: .gitignoreはいつ作るべきですか?

A: プロジェクトの最初に作るのがベストです。git init の直後、最初のコミットの前に .gitignore を作成してください。後から追加すると、すでに追跡されているファイルの解除が必要になり、手間が増えます。

Q: .gitignore自体はGitHubにpushすべきですか?

A: はい、pushしてください。.gitignore はプロジェクトの設定ファイルなので、チームメンバー全員が同じ無視ルールを共有する必要があります。.gitignore.gitignore に書いてはいけません。

Q: node_modulesをpushしてしまいました。どうすればいいですか?

A: git rm --cached -r node_modules/ で追跡を解除し、.gitignorenode_modules/ を追加してコミットしてください。ただし、Gitの履歴にはnode_modulesが残るため、リポジトリの容量は大きいままです。履歴からも完全に削除したい場合は git filter-branch や BFG Repo-Cleaner を使います。

Q: .envファイルのテンプレートを共有したい場合はどうしますか?

A: .env.example というファイルを作り、変数名だけを書いて値は空にしておきます。.env.example はGitHubにpushし、.env.gitignore で無視します。新しいメンバーは .env.example をコピーして .env を作り、自分の環境に合わせた値を設定します。

Q: 特定のブランチだけで.gitignoreを変えることはできますか?

A: .gitignore もGitで管理されるファイルなので、ブランチごとに内容を変えることは技術的には可能です。ただし、ブランチを切り替えるたびに無視ルールが変わると混乱の原因になるため、おすすめしません。すべてのブランチで同じ .gitignore を使うのが一般的です。

まとめ

  • .gitignore はGitに「追跡しないファイル」を伝える設定ファイル
  • .env(機密情報)、node_modules/(依存パッケージ)、ビルド出力は必ず無視する
  • ***! を使ってパターンを柔軟に指定できる
  • すでに追跡されているファイルは git rm --cached で解除する
  • gitignore.io を使えば言語別のテンプレートを自動生成できる
  • プロジェクトの最初に .gitignore を作るのがベスト

あわせて読みたい

関連リソース

Git・GitHubをもっと学びたい方へ: