.gitignore で除外する
.gitignore は「履歴に含めたくないファイル」を指定するテキストファイルです。ビルド生成物・ログ・パスワードを含む設定など、共有すべきでないものをここに書くと、Gitが追跡対象から外します。1行に1パターンを書き、*.log のようなワイルドカードや node_modules/ のようなフォルダ指定が使えます。ただし、すでにコミット済みのファイルは .gitignore に書いても追跡され続ける点に注意します。
プロジェクトを Git で管理していると、「履歴に含めたくないファイル」が必ず出てきます。たとえばビルドのたびに自動生成される一時ファイル、動作中に書き出されるログ、パスワードやアクセスキーを書いた設定ファイルなどです。これらをうっかりコミットしてしまうと、履歴が無駄に膨らんだり、最悪の場合は秘密情報をリモートで公開してしまう事故につながります。こうした「Git に追跡してほしくないもの」を指定する仕組みが .gitignore(git-gitignore)です。プロジェクトのフォルダ(git-repository の置かれた場所)の直下に .gitignore という名前のテキストファイルを置き、そこに無視したいファイルのパターンを書いておくと、Git はそれらを追跡対象から外してくれます。
書き方の基本
.gitignore は1行に1つのパターンを書く、素朴なテキストファイルです。たとえば debug.log という1ファイルを無視したいなら、その名前をそのまま1行書きます。実務でよく使うのはワイルドカードを使ったまとめ指定で、* は任意の文字列にマッチするため、*.log と書けば拡張子が .log のファイルすべてを、*.tmp と書けば .tmp で終わるファイルすべてを無視できます。フォルダごと丸ごと無視したいときは、末尾にスラッシュを付けて node_modules/ や build/ のように書きます。これにより、そのフォルダの中身すべてが追跡対象から外れます。先頭に # を付けた行はコメントとして扱われ、無視のルールには影響しないので、「なぜこれを無視するのか」を書き添えておくと、後から見たときに分かりやすくなります。また、いったん無視したものの中から特定のファイルだけは追跡したい、という場合は、行頭に ! を付けた否定パターン(例: !keep.log)で例外を指定できます。
動作を確かめる
.gitignore が効いているかどうかは git status で確認するのが手軽です。実際の流れを見てみましょう。echo "temp output" > debug.log で一時ファイルを作り、git status を打つと、この時点では debug.log が「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 はあくまで「これから新たに追跡を始めるかどうか」を判断する仕組みです。一度コミットして Git の追跡対象になったファイルは、後から名前を .gitignore に書き足しても、引き続き追跡され続けます。たとえば、うっかりログファイルをコミットしてしまった後で .gitignore に *.log を追加しても、そのログファイルは履歴から消えませんし、その後の変更も記録され続けてしまいます。これは「設定したのに効かない」と悩む典型的な原因なので、しっかり覚えておきましょう。
では、すでに追跡してしまったファイルを追跡対象から外すにはどうするか。git rm --cached <ファイル名> を使います。たとえば git rm --cached debug.log と打つと、ファイル本体は手元に残したまま、Git の追跡対象(インデックス)からだけ外せます。--cached を付けるのが重要で、これを忘れて単に git rm debug.log とすると、ファイルそのものまで削除されてしまうので注意してください。追跡から外したうえで、その変更を git commit すれば、以後はそのファイルが履歴に記録されなくなります。あわせて .gitignore にも名前を書いておけば、再びうっかり add してしまうことも防げます。ただし注意したいのは、この操作で「これからの履歴」からは外れても、過去のコミットにすでに記録された内容は履歴の中に残り続けるという点です。とくにパスワードなどを誤ってコミットしてしまった場合、追跡を外すだけでは過去の記録から消えないため、秘密情報は最初から絶対にコミットしないことが何より大切になります。
実務での使いどころ
実務では、プロジェクトを始めて最初のコミットをする前に、.gitignore を先に用意しておくのが理想です。最初から無視ルールを整えておけば、不要なファイルを一度もコミットせずに済み、前述の「追跡済みファイルを後から外す」面倒を避けられます。何を無視すべきかは使う言語やフレームワークによって決まっており、よくある組み合わせ用の .gitignore のひな形が広く共有されています。たとえば Node.js なら node_modules/ やログ、Python なら __pycache__/ や仮想環境のフォルダ、といった具合です。とくに大切なのが、パスワードやAPIキーなどの秘密情報を含むファイルは必ず .gitignore に入れておくことです。一度リモートに push してしまった秘密情報は取り消しが難しいため、「秘密は最初から追跡させない」を鉄則にしてください。