🐧 Linux 総合学習プラットフォーム
Git バージョン管理 ・ 入門

.gitignore で除外する

.gitignore は「履歴に含めたくないファイル」を指定するテキストファイルです。ビルド生成物・ログ・パスワードを含む設定など、共有すべきでないものをここに書くと、Gitが追跡対象から外します。1行に1パターンを書き、*.log のようなワイルドカードや node_modules/ のようなフォルダ指定が使えます。ただし、すでにコミット済みのファイルは .gitignore に書いても追跡され続ける点に注意します。

プロジェクトを Git で管理していると、「履歴に含めたくないファイル」が必ず出てくる。

たとえばビルドのたびに自動生成される一時ファイル、動作中に書き出されるログ、パスワードやアクセスキーを書いた設定ファイルなどだ。

💡
ポイント.gitignore は「Git に追跡してほしくないもの」を指定する仕組み。一時ファイル・ログ・秘密情報を履歴から外す。

これらをうっかりコミットすると、履歴が無駄に膨らんだり、最悪の場合は秘密情報をリモートで公開してしまう事故につながる。

こうした「Git に追跡してほしくないもの」を指定する仕組みが .gitignore(git-gitignore)だ。プロジェクトのフォルダ(git-repository の置かれた場所)の直下に .gitignore という名前のテキストファイルを置き、そこに無視したいファイルのパターンを書いておくと、Git はそれらを追跡対象から外してくれる。

✏ どう書けば無視できるのか

.gitignore は、1行に1つのパターンを書く、素朴なテキストファイルだ。

たとえば debug.log という1ファイルを無視したいなら、その名前をそのまま1行書く。

# コメント行*.log… 拡張子 .log 全部node_modules/… フォルダごとdebug.log… この1ファイル!keep.log… ! は例外(追跡する)

実務でよく使うのはワイルドカードを使ったまとめ指定だ。* は任意の文字列にマッチするため、*.log と書けば拡張子が .log のファイルすべてを、*.tmp と書けば .tmp で終わるファイルすべてを無視できる。

*.log で拡張子 .log を全部、node_modules/ で末尾スラッシュによりフォルダごと無視する。

フォルダごと丸ごと無視したいときは、末尾にスラッシュを付けて node_modules/ や build/ のように書く。これにより、そのフォルダの中身すべてが追跡対象から外れる。

コツ先頭に # を付けた行はコメント。「なぜ無視するか」を書き添えると、後から見て分かりやすい。

先頭に # を付けた行はコメントとして扱われ、無視のルールには影響しない。「なぜこれを無視するのか」を書き添えておくと、後から見たときに分かりやすくなる。

また、いったん無視したものの中から特定のファイルだけは追跡したい、という場合は、行頭に ! を付けた否定パターン(例: !keep.log)で例外を指定できる。

🔍 本当に効いているか確かめる

.gitignore が効いているかどうかは git status で確認するのが手軽だ。

実際の流れを見てみよう。echo 'temp output' > debug.log で一時ファイルを作り、git status を打つと、この時点では debug.log が「Untracked files」として一覧に出る。

echo 'debug.log' > .gitignore で登録してから git status を打つと、debug.log が一覧から消える。代わりに .gitignore 自体が Untracked files に出る。

次に echo 'debug.log' > .gitignore として .gitignore に debug.log を登録し、もう一度 git status を打つと、今度は debug.log が一覧から消える。代わりに .gitignore というファイル自体が新しく作られたので、それが「Untracked files」として表示される。

この .gitignore は他の人とも共有すべき設定だ。git add .gitignore でステージに載せ、git commit でコミットして履歴に含めておくのが普通だ。これにより、プロジェクトに参加した全員に同じ無視ルールが適用される。

🤔 なぜ「書いたのに無視されない」のか

.gitignore で初学者が必ずと言っていいほどはまる落とし穴がある。「すでにコミット済みのファイルは、後から .gitignore に書いても無視されない」という点だ。

つまずきすでにコミット済みのファイルは、後から .gitignore に書いても無視されない。.gitignore は「これから追跡を始めるか」だけを判断する仕組みだからだ。

なぜそうなるのか。.gitignore はあくまで「これから新たに追跡を始めるかどうか」を判断する仕組みだからだ。一度コミットして Git の追跡対象になったファイルは、後から名前を .gitignore に書き足しても、引き続き追跡され続ける。

まだ未追跡のファイル.gitignore に書けば無視される ✓すでにコミット済み後から書いても追跡され続ける ✗境目は「もう追跡対象になっているか」どうか

たとえば、うっかりログファイルをコミットしてしまった後で .gitignore に *.log を追加しても、そのログファイルは履歴から消えないし、その後の変更も記録され続けてしまう。

これは「設定したのに効かない」と悩む典型的な原因なので、しっかり覚えておこう。

🧹 追跡済みファイルを外すには

すでに追跡してしまったファイルを追跡対象から外すには、git rm --cached <ファイル名> を使う。

git rm --cached debug.log ……ファイル本体は手元に残したまま、Git の追跡対象(インデックス)からだけ外す。

たとえば git rm --cached debug.log と打つと、ファイル本体は手元に残したまま、Git の追跡対象(インデックス)からだけ外せる。

つまずき--cached を忘れて git rm debug.log とすると、ファイルそのものまで削除される。追跡だけ外したいときは必ず --cached を付ける。

--cached を付けるのが重要だ。これを忘れて単に git rm debug.log とすると、ファイルそのものまで削除されてしまうので注意してほしい。

追跡から外したうえで、その変更を git commit すれば、以後はそのファイルが履歴に記録されなくなる。あわせて .gitignore にも名前を書いておけば、再びうっかり add してしまうことも防げる。

ただし注意したいのは、この操作で「これからの履歴」からは外れても、過去のコミットにすでに記録された内容は履歴の中に残り続けるという点だ。とくにパスワードなどを誤ってコミットしてしまった場合、追跡を外すだけでは過去の記録から消えない。だからこそ、秘密情報は最初から絶対にコミットしないことが何より大切になる。

⏱ いつ用意するのが正解か

実務では、プロジェクトを始めて最初のコミットをする前に、.gitignore を先に用意しておくのが理想だ。

コツ最初のコミットの前に .gitignore を用意しておけば、不要なファイルを一度もコミットせずに済み、後から外す面倒を避けられる。

最初から無視ルールを整えておけば、不要なファイルを一度もコミットせずに済み、前述の「追跡済みファイルを後から外す」面倒を避けられる。

何を無視すべきかは使う言語やフレームワークによって決まっており、よくある組み合わせ用の .gitignore のひな形が広く共有されている。たとえば Node.js なら node_modules/ やログ、Python なら __pycache__/ や仮想環境のフォルダ、といった具合だ。

とくに大切なのが、パスワードやAPIキーなどの秘密情報を含むファイルは必ず .gitignore に入れておくことだ。一度リモートに push してしまった秘密情報は取り消しが難しいため、「秘密は最初から追跡させない」を鉄則にしてほしい。

この項目に出てくる用語

.gitignoreぎっといぐのあ
Gitの追跡対象から外すファイルを指定するテキストファイル。
リポジトリりぽじとり
変更履歴をまとめて保存する入れ物。略してリポとも呼ぶ。

関連コマンド

git statusgit add

▶ 学習アプリでこの続きを学ぶ・演習する