Git は作業コピーのあらゆるファイルを次の 3 つのうちの 1 つとみなします。

  1. 追跡対象 - 過去にステージングまたはコミットされているファイル
  2. 追跡対象外 - ステージングまたはコミットされていないファイル
  3. 無視 - Git で無視されるよう明示的に指定されたファイル

無視されるファイルは通常、リポジトリソースから派生するか、またはコミットされないようにするビルド成果物およびマシン生成ファイルです。一般的な使用例の一部を次に挙げます。

  • 依存関係のキャッシュ (/node_modules/packages
  • など)
  • コンパイルされたコード (.o.pyc.class ファイルなど)
  • ビルド出力ディレクトリ (/bin/out/target
  • など)
  • 実行時に生成されるファイル (.log.lock.tmp など)
  • 非表示のシステムファイル (.DS_StoreThumbs.db など)
  • 個人用 IDE 設定ファイル (.idea/workspace.xml など)

無視されたファイルは、.gitignore という名前の特別なファイルで追跡されます。これはリポジトリのルートでチェックインされます。明示的な git ignore コマンドはありません。無視する新規ファイルがある場合には、.gitignore ファイルを手動で編集してコミットする必要があります。.gitignore ファイルには、ファイルを無視すべきかどうかを決定するためにリポジトリ内のファイル名と一致するパターンが含まれています。

Git の無視パターン

.gitignore は、グロブパターンを使用してファイル名を照合します。様々なシンボルを使用して独自のパターンを作成できます。

パターン 一致する例 説明*
**/logs logs/debug.log
logs/monday/foo.bar
build/logs/debug.log
リポジトリ内の任意のディレクトリと照合するために、2つのアスタリスクをパターンの前に追加できます。
**/logs/debug.log logs/debug.log
build/logs/debug.log
以下は該当しません
logs/build/debug.log
ファイル名や親ディレクトリの名前に基づいてファイルを照合するために、2 つのアスタリスクも使用できます。
*.log debug.log
foo.log
.log
logs/debug.log
アスタリスクは、0 個以上の文字に一致するワイルドカードです。
*.log
!important.log
debug.log
trace.log
以下は該当しません
important.log
logs/important.log
感嘆符をパターンの先頭に追加すると、パターンを否定します。ファイルがあるパターンと一致するものの、ファイルの後半で定義済みの否定パターンとも一致する場合、そのファイルは無視されません。
*.log
!important/*.log
trace.*
debug.log
important/trace.log
以下は該当しません
important/debug.log
否定パターンの後に定義されたパターンは、以前に無効化されたファイルを再度すべて無視します。
/debug.log debug.log
以下は該当しません
logs/debug.log
スラッシュを先頭に追加すると、リポジトリのルートにあるファイルのみ照合します。
debug.log debug.log
logs/debug.log
既定では、パターンは任意のディレクトリ内のファイルと照合されます。
debug?.log debug0.log
debugg.log
以下は該当しません
debug10.log
疑問符は正確に 1 文字に一致します。
debug[0-9].log debug0.log
debug1.log
以下は該当しません
debug10.log
角括弧を使用して、指定した範囲の 1 文字を照合もできます。
debug[01].log debug0.log
debug1.log
以下は該当しません
debug2.log
debug01.log
角括弧は、指定されたセットの 1 つの文字と一致します。
debug[!01].log debug2.log
以下は該当しません
debug0.log
debug1.log
debug01.log
感嘆符を使用して、指定されたセット以外の文字を照合できます。
debug[a-z].log debuga.log
debugb.log
以下は該当しません
debug1.log
範囲は数値またはアルファベットです。
logs logs
logs/debug.log
logs/latest/foo.bar
build/logs
build/logs/debug.log
スラッシュを付けないと、その名前を持つファイルおよびディレクトリのコンテンツの両方がパターンと照合されます。左の例の照合では、logs という名前のディレクトリとファイルの両方が無視されます。
logs/ logs/debug.log
logs/latest/foo.bar
build/logs/foo.bar
build/logs/latest/debug.log
スラッシュを追加して、パターンがディレクトリであることを示します。その名前に一致するリポジトリ内のディレクトリすべてのコンテンツ (そのファイルとサブディレクトリをすべて含む) が無視されます。
logs/
!logs/important.log
logs/debug.log
logs/important.log
注意! 左の例で logs/important.log は無効にすべきではありません。

Git のパフォーマンスに関連する性質上、ディレクトリに一致するパターンで無視されるファイルは無効にできません
logs/**/debug.log logs/debug.log
logs/monday/debug.log
logs/monday/pm/debug.log
2 つのアスタリスクは、0 個以上のディレクトリと一致します。
logs/*day/debug.log logs/monday/debug.log
logs/tuesday/debug.log
以下は該当しません
logs/latest/debug.log
ワイルドカードはディレクトリ名でも使用できます。
logs/debug.log logs/debug.log
以下は該当しません
debug.log
build/logs/debug.log
特定のディレクトリ内のファイルを指定するパターンは、リポジトリのルート相対パスです (スラッシュを前に付けられますが、特に何も生じません)。

**この説明は、ご使用の .gitignore ファイルが規則と同様に、リポジトリの最上位ディレクトリにあることを想定しています。リポジトリに複数の .gitignore ファイルがある場合、単に「リポジトリルート」を「.gitignore ファイルを含むディレクトリ」と置き換えて把握してください (そして、チームが混乱しないようにファイルを統合することを検討してください)。*

これらの文字に加えて、# を使用して .gitignore ファイルにコメントを含められます。

# すべてのログを無視
*.log

.gitignore パターン文字が含まれるファイルまたはディレクトリがある場合、\ を使用してそれらのパターン文字をエスケープできます。

# 文字通り foo[01].txt という名前のファイルを無視
foo\[01\].txt

リポジトリ内の共有 .gitignore ファイル

Git は通常 .gitignore ファイルで定義される規則を無視します。このファイルは、ユーザーのリポジトリのルートにあります。しかし、ユーザーのリポジトリ内の様々なディレクトリにある複数の .gitignore ファイルを定義するという選択肢があります。特定の .gitignore ファイルの各パターンがそのファイルがあるディレクトリに対してテストされます。ただし、従来の、最もシンプルな方法はルートで単一の .gitignore ファイルを定義することです。.gitignore ファイルをチェックインすると、ユーザーのリポジトリ内の他のファイルと同様にバージョン管理され、プッシュ時にチームメイトと共有されます。一般的に、.gitignore に含めるパターンは、リポジトリの他のユーザーにとってメリットになるものに限定すべきです。

個人用の Git 無視規則

また、特定のリポジトリの個人用無視パターンを .git/info/exclude にある特別なファイルにも定義できます。これらはバージョン管理されず、ユーザーのリポジトリと共に配布されないので、自分にのみメリットがある可能性が高いパターンを含めるには適した場所です。たとえば、カスタムロギング設定や、リポジトリの作業ディレクトリにファイルを生成する特別な開発ツールがある場合、それらを .git/info/exclude に追加して、自分のリポジトリに誤ってコミットされないようにできます。

グローバルな Git 無視規則

さらに、Git core.excludesFile プロパティを設定することで、ローカルシステム上のすべてのリポジトリに対するグローバル Git の無視パターンを定義できます。このファイルは自分で作成する必要があります。グローバルな .gitignore ファイルを配置すべき場所がよくわからない場合は、ホームディレクトリでかまいません (後で簡単に見つけられます)。ファイルを作成したら、git config でその場所を設定する必要があります。

$ touch ~/.gitignore
$ git config --global core.excludesFile ~/.gitignore

プロジェクトによって異なる種類のファイルが関連するため、グローバルに無視するパターンは慎重に選択する必要があります。特殊なオペレーティングシステムファイル (.DS_Storethumbs.db など)、または一部の開発ツールで作成された一時ファイルが、グローバルに無視する一般的な候補になります。

以前にコミットされたファイルを無視

過去にコミットしたファイルを無視する場合、リポジトリからファイルを削除してから、それに対して .gitignore ルールを追加する必要があります。--cached オプションを git rm で使用すると、ファイルはリポジトリから削除されますが、無視されたファイルとして作業ディレクトリに残ります。

$ echo debug.log >> .gitignore
$ git rm --cached debug.log
rm 'debug.log'
$ git commit -m "Start ignoring debug.log"

ファイルをリポジトリとローカルファイルシステムの両方から削除する場合は、--cached オプションを省略できます。

無視されたファイルのコミット

-f (または --force) オプションを git add で使用して、無視されたファイルをリポジトリに強制的にコミットできます。

$ cat .gitignore
*.log
$ git add -f debug.log
$ git commit -m "Force adding debug.log"

一般的なパターン (*.log など) が定義されていても、特定のファイルをコミットする場合は、これを行うとよいでしょう。ただし、より良い解決策は一般的な規則の例外を定義することです。

$ echo !debug.log >> .gitignore
$ cat .gitignore
*.log
!debug.log
$ git add debug.log
$ git commit -m "Adding debug.log"

これは、チームメイトにとって明白で、混乱を招きにくいアプローチです。

無視されたファイルを隠す

git stash は、ローカルの変更を一時的に棚上げして取り消した後、再適用できる高度な Git 機能です。既定では、git stash では無視されたファイルは無視され、Git の追跡対象ファイルに対する変更のみが stash されます。ただし、--all オプションを指定して git stash を呼び出し、無視されたファイルや追跡対象外のファイルに対する変更も stash できます。

.gitignore ファイルのデバッグ

.gitignore パターンを複雑化したかパターンが複数の .gitignore ファイルに分散している場合は、特定のファイルが無視されている理由を特定しにくい可能性があります。git check-ignore コマンドを -v (または --verbose) オプションを指定して使用し、特定のファイルが無視される原因となっているパターンを特定できます。

$ git check-ignore -v debug.log
.gitignore:3:*.log debug.log

次のような出力が得られます。

<パターンを含むファイル> : <パターンの行番号> : <パターン> <ファイル名>

必要に応じて、複数のファイル名を git check-ignore に渡せます。名前自体は、リポジトリに存在するファイルと一致する必要はありません。

Git を学ぶ準備はできていますか?

この対話式のチュートリアルをお試しください。

今すぐ始める