01 / 10
stash と .gitignore
INPUT · スライド
作業の一時退避と除外設定(stash / .gitignore)
02 / 10
未 commit の変更がある状態での branch 切り替え拒否
機能開発の途中で「本番環境の緊急バグを今すぐ直してほしい」と依頼されたとします。
しかし、手元の working tree には中途半端な変更が残っています。未 commit の変更を抱えたまま git switch を実行すると、Git は衝突を防ぐためにbranch の切り替えを拒否します。
かといって、動作もしない未完成コードを main や作業 branch に commit として残したくもありません。ここで活躍するのが git stash です。
$ git switch fixerror: Your local changes would be overwritten by switch.03 / 10
git stash — 作業内容の一時退避
git stash を実行すると、working tree と staging area の未 commit 変更が stash(一時保管場所)へ退避されます。
working tree は直前の commit 時の状態(クリーンな状態)に戻るため、安全に別 branch へ切り替えて緊急対応を進めることができます。
作業内容は消去されたのではなく、Git の内部 stash 領域に安全に保存されています。
$ git stashSaved working directory and index state WIP on main: 9f2a1c4 土台を作成$ git statusOn branch mainnothing to commit, working tree clean04 / 10
git stash pop と git stash list — 退避内容の確認と復元
緊急対応が終わり元の作業 branch へ戻ってきたら、git stash pop を実行して stash から作業内容を作業ツリーへ復元します。
pop を実行すると退避していた変更が working tree に戻り、同時に stash 領域からその entry が削除されます。
stash に何が保存されているかは git stash list で確認できます。stash@{0} が最新の退避データです。
$ git stash liststash@{0}: WIP on main: 9f2a1c4 土台を作成$ git stash pop$ git statusChanges not staged for commit: modified: app.js05 / 10
バージョン管理対象外にすべきファイル
ここからは .gitignore の解説です。
プログラムを実行すると、自動的に生成されるファイルがあります。ログ、キャッシュ、一時ディレクトリ、そして機密情報(パスワードや秘密鍵)などです。
これらが git status に表示され続けると、次の2つの重大な問題が発生します。
1. 本当に確認すべきコード差分が埋もれて見落とす
2. git add . を実行した際に機密情報や不要ファイルを誤って commit してしまう
特に API key やパスワードを一度 commit して remote へ push してしまうと、後からファイルを削除しても履歴上に残り続けるため非常に危険です。
06 / 10
.gitignore — 除外パターンの指定規則
リポジトリのルートに .gitignore という名前のテキストファイルを作成し、Git の追跡から除外したいファイル名やパターンを1行ずつ記述します。
*.logtmp/secret.txt*.log… 拡張子が.logで終わるすべてのファイルtmp/…tmpディレクトリ配下のすべてのファイルsecret.txt… 指定された完全一致のファイル名
ここに指定されたファイルは Git の追跡から完全に除外され、git status にも表示されず git add . の対象にもなりません。
07 / 10
.gitignore 自体はバージョン管理(commit)する
初心者がよく疑問に思うポイントです。
.gitignore ファイル自体は、必ず Git で commit してバージョン管理します。
「プロジェクト全体でどのファイルを除外するか」というルールは、チーム開発者全員で一貫して共有する必要があるためです。
したがって、.gitignore を編集した後は通常通り git add .gitignore して commit します。
08 / 10
注意点: すでに追跡済みのファイルは .gitignore で無視されない
これが .gitignore に関する最も代表的なトラブルです。
過去に一度でも commit されて Git の追跡対象になっているファイルは、後から .gitignore に記述しても除外されません。
.gitignore は「まだ追跡されていない未追跡ファイル(Untracked files)」に対してのみ機能するルールだからです。
すでに追跡されているファイルを除外するには、まず Git の追跡対象から外す(index から削除する) 必要があります。
$ git rm --cached secret.txtrm 'secret.txt'$ git commit -m "secret.txt の追跡を解除"09 / 10
git rm --cached — 追跡のみを解除する
git rm コマンドに --cached オプションを付けて実行すると、working tree の物理ファイルを残したまま、Git の index(追跡対象)からのみ削除できます。
--cached を付け忘れるとディスク上の実ファイルまで削除されてしまうため、必ずオプションを付けて実行してください。
追跡を解除して commit すると、ファイルは未追跡状態に戻り、.gitignore の除外ルールが有効化されます。
なお、過去の commit 履歴の中にはファイルが残っているため、機密情報を誤コミットした場合はパスワードやキーの再発行・無効化が必須です。
10 / 10
演習の進め方
.gitignore を作成する際は、ファイル先頭のピリオド . を忘れずに入力してください。
正しく除外設定が機能しているファイルは、ステータス画面で薄いグレーのバッジが表示され、git status の未追跡ファイル一覧から非表示になります。
stash した作業内容は、画面下部の stash 領域で確認できます。