この記事について
.gitignoreがどう動くのか、また何なのかを実際のBefore、Afterの状態をキャプチャして説明していきます。
モチベーション
.gitignoreを使用しないと、以下のようなことが起こる可能性があります。
- Git初心者が複数人で一つのアプリを開発する際、個々で毎回変わる設定ファイルを持つせいでマージする際にConflictが起きる
- Githubの無料アカウントを使用している場合に、全ファイルは公開されるため、サーバー情報を書いたファイルもGithubで公開されてしまう
そんな時に、この.gitignoreが大事であることに気づいたのでまとめようと思いました(今までは誰かが.gitignoreを常に作っていたので特に意識していなかったです。。)。
手順
単純に、ルートディレクトリ配下に、.gitignoreというファイルを作成し、そこにGithubに載せたくない、またはgitで追跡したくないファイルを指定します。その前に、ファイルを既にpushしてしまっている場合、git rm -r --cached ファイル名というコマンドで、gitから指定ファイルを除外します。
実装
CakePHPベースのアプリのtemp/cacheフォルダを除外します。
現状

しっかりcacheがGithubで確認できてます(本来ならアウト。。)。
Step1: git rm -r --cached ファイル名でgitから指定ファイルを除外
以下、実際の実行結果です。

git statusを見ると、しっかりuntrackされたように書かれています。

Step2: .gitignoreをルートディレクトリ配下に作成し、このtemp/cacheを無視するよう以下のように記述
以下、実際の実行動作です。

自分の場合、既に.gitignoreを作成していたのですが、実行するコマンドは基本的には同じです。動画にあるように、最後に変更した内容をcommitしましょう。
Step3: git pushでGithubに反映
実装後

tmp/cacheフォルダがGithubで消えていることが確認できます。
一方ローカルでフォルダを見てみると、tmp/cacheフォルダが消えていないことが確認できます。つまりサーバー情報を載せたファイル等はローカルだけに保持するようなことができます。

追記
※@htsignさんから指摘がありましたが、git rm -r --cached ファイル名では、最新のコミットからしかファイルが削除されません。なので、以下のように過去のコミット履歴をみると、削除したファイルが普通に存在してしまいます。

このファイル情報を見せたくない場合、git filter-branch等のコマンドで過去履歴からもファイルを削除する必要があります。
Git リポジトリに上がっているファイルを履歴ごと消すには?を参考に、実際に消してみます。
以下、実際の実行結果です。

次に、git gc --aggressive --prune=nowでレポジトリを最適化します。

このままPushすると、コミット情報にコンフリクトがあるせいか、断られます。

git push -fで強制的にPushします。

うまくいきました。
※チームで開発を行う場合、このような強制的なPushを行うかは、慎重に検討しましょう。
最後に
以上、.gitignoreの動きについてまとめました。
参考:
https://qiita.com/y_minowa/items/e3d8513dc31c1b378e0d
https://qiita.com/go_astrayer/items/6e39d3ab16ae8094496c
https://stackoverflow.com/questions/6403601/purging-file-from-git-repo-failed-unable-to-create-new-backup
