【IT用語】.gitignoreの書き方を図解形式で理解しよう!

IT用語

.gitignoreとは、Gitで管理しないファイルを指定することが出来るファイルの事です。

以下のように、.gitignoreファイルにsample1.rbと指定することで、sample1.rbファイルをGit管理下から除外することが出来ます。

.gitignoreファイルに指定するファイルを記述する

.gitignoreで指定するファイルは、ローカル(自分のパソコン)だけに必要なファイルを指定します。

.gitignoreの基本的な使い方

この章では、.gitignoreについて基本的な使い方について解説します。

ファイルをGit管理下から除外する手順
リンクをコピーしました

sample1.rbファイルをGit管理下から除外する手順について1つ1つ確認していきます。

まずは、以下のようにgitignore_sampleディレクトリにsample1.rbsample2.rbのファイルを作成します。

git管理状態のサンプルファイル

次にgitignore_sampleディレクトリの現在の状態を確認していきます。

Git管理の状態を確認しよう
リンクをコピーしました

ディレクトリにリポジトリが作成されていれば、以下のファイルの状態をgit statusコマンドで確認する事が出来ます。

  • トラッキング状態:インデックスに登録したが、コミットされていないファイル
  • アントラッキング状態:Git管理されていない、かつ.gitignoreファイルで指定されていないファイル
  • 既にGit管理されているファイルを変更した場合(再度、インデックスに登録する必要がある)

gitignore_sampleディレクトリでgit statusを実行すると、次の様に表示されます。

git管理されている状態

先ほど作成したsample1.rbとsample2.rbは、アントラッキング状態を意味するUntracked filesで表示されています。つまり2つのファイルは以下の状態にあります。

Pikawakaマークアントラッキング状態

  1. 現在は、Git管理されていないが、
  2. .gitignoreで指定されていないので
  3. これからgit addでインデックスに登録しなければいけないファイル

現時点ではsample1.rbとsample2.rbは、Git管理下にあると言えます。

.gitignoreファイルの作成とファイル指定
リンクをコピーしました

Git管理下にあるファイルを除外するには、.gitignoreファイルを作成して除外するファイルを指定する必要があります。先ほどのsample1.rbはGit管理下にあるファイルですが、.gitignoreファイルを使ってGit管理から除外していきます。

まずは、gitignore_sampleディレクトリに、以下のように.gitignoreファイルを作成してsample1.rbを指定します。

.gitignoreファイルに指定するファイルを記述する

次に、sample1.rbがGitで管理されていない事を確認するために、再度git statusを実行します。

git statusの実行結果

上記の実行結果からアントラッキング状態にあるのは、Git管理から除外していないsample2.rbと先ほど作成した.gitignoreの2つのファイルで、.gitignoreファイルで指定したsample1.rbはGit管理下から除外されます。

次に、ここまでのgitignore_sampleディレクトリの作業内容を GitHub のリモートリポジトリにアップロードして確認していきましょう。

githubのリモートリポジトリで確認
リンクをコピーしました

以下の操作によって、Git管理下にあるワークツリーの作業内容をリモートリポジトリにアップロードします。

ワークツリーからリモートリポジトリにアップロードする流れ

  1. git add インデックスへ登録する
  2. git commit ローカルリポジトリにコミットする
  3. git push リモートリポジトリにアップロードする

この操作の詳しい概要はコマンド操作の方法を参考にして下さい。

現在のgitignore_sampleディレクトリのファイル状態は、以下の通りでした。

git statusの実行結果

上記の状態からインデックスに登録する為に、addコマンドを実行して再度git statusでファイルの状態を表示させます。

git addコマンドを実行

2つのファイルは、コミット準備が整っている状態だと確認出来たので、以下のようにcommitコマンドを実行します。

commitコマンドを実行する

これでローカルリポジトリに登録することが出来たので、Githubにあるリモートリポジトリに登録とアップロードする為に以下のコマンドを実行します。

リモートリポジトリにアップロードする

リモートリポジトリのGithubを開くと、.gitignoresample2.rbのアップロードを確認することが出来ました。

Githubでアップロード確認

もちろん.gitignoreで指定したsample1.rbはGit管理から除外されているので、アップロードされていないことも確認する事が出来ます。

.gitignoreファイルの指定方法
リンクをコピーしました

.gitignoreファイルの実際の指定方法について、先ほどのgitignore_sampleディレクトリに以下のファイルを追加して確認します。

gitignore_sampleの中身

サッと確認だけしたい方は、.gitignoreファイル指定方法一覧

.gitignoreファイルのパス指定
リンクをコピーしました

.gitignoreでのファイルのパスは、「.gitignoreをカレントディレクトリとした相対パス」で指定します。.gitignoreは、ファイルを絶対パスで指定する事が出来ません。

  • カレントディレクトリ - 現在作業を行なっているディレクトリ
  • 相対パス - 現在の作業している位置を基準に目的までの経路を表すパス
  • 絶対パス - 最上位に位置するルートパスから目的までの経路を全て表すパス

つまり.gitignoreに記述するファイルのパスは、「.gitignoreから見たファイルの場所までの道筋」を記述します。

例えば、directory配下にあるhoge3.pngを.gitignoreで除外したい場合は、以下のように指定します。

パス指定の例

特定のファイルとディレクトリを除外で詳しく解説しますが、ディレクトリの最初につく/は、絶対パスではなく.gitignoreファイルと同じ階層にあるファイルやディレクトリを指します。

その為、上記の/directory/hoge3.pngは、.gitignoreファイルと同じ階層にあるdirectory配下のhoge3.pngをGit管理下から除外する指定を行なっているのです。

同名のファイルとディレクトリを全て除外
リンクをコピーしました

同名のファイルとディレクトリを全てGit管理下から除外するには、「/」を含めないで指定します。

例えば、以下のようにsample1.rbと指定すると、gitignore_sampleディレクトリ直下にあるsample1.rbだけではなく、同名のdirectory/sample1.rbもGit管理下から除外されます。

全てのsample1.rbが除外される例

ディレクトリも同様です。
以下のように/を含めないでdirectoryと指定すると、gitignore_sampleディレクトリ直下にあるdirectoryだけではなく、同名のdirectory2/directoryもGit管理下から除外されます。

全てのdirectoryを除外

そして、ディレクトリの場合はディレクトリ配下にあるファイルもGit管理下から除外されます。

特定のファイルとディレクトリを除外
リンクをコピーしました

特定のファイルとディレクトリをGit管理から除外するには、末尾以外に/を含めて指定します。
パス指定でも解説しましたが、最初に/を含める事で.gitignoreファイルと同じ階層の相対パスで指定されたディレクトリやファイルを除外します。

例えば、.gitignoreファイルと同じ階層のsample1.rbをGit管理下から除外する場合は、.gitignoreファイルをカレントディレクトリとした相対パス/sample1.rbを指定して除外します。

相対パスでsample1.rbを指定する

sample1.rbの最初に/が含まれているので、.gitignoreファイルと同じ階層のsample1.rbが除外の対象となるので、同名のdirectory/sample1.rbは除外されません。

ディレクトリも同様に特定の箇所だけ除外する事が出来ます。.gitignoreファイルと同じ階層のdirectoryをGit管理下から除外する場合は、以下のように/directoryと指定します。

directoryだけGit管理下から除外

directory2/directoryは、.gitignoreファイルと同じ階層にないので除外されません。

同名のディレクトリを除外
リンクをコピーしました

同名のディレクトリを全て除外するには、冒頭の「指定するディレクトリ名に/を含めない」以外にも、ディレクトリ名の末尾に/を付ける事で除外する事が出来ます。

例えば、.gitignoreファイルにdirectory/と指定する事で、gitignore_sampleディレクトリ直下にあるdirectoryだけではなく、同名のdirectory2/directoryもGit管理下から除外されます。

同名のdirectoryを除外する

もちろんdiectoryの配下にあるsample1.rbhoge.rbファイルもGit管理から除外されます。

以下のようにdirectory/は、directoryと指定した場合と同様の結果が得られます。

directoryを全て除外する

特定ファイルとディレクトリだけ追跡
リンクをコピーしました

.gitignoreは、通常Git管理から除外するファイルを指定しますが、特定のファイルやディレクトリだけGit管理したい場合に、指定するファイル or ディレクトリの最初に!を付ける事で除外出来ます。

例えば、gitignoreファイルに*を指定すると全てがGit管理下から除外されますが、sample2.rbだけGit管理したい場合は、以下のように!/sample2.rbと指定する事でGit管理から除外されません。

あるファイルだけgitignoreから除外しない

しかし、!を使う場合はいくつか注意点があります。
まず.gitignoreファイルは上から読み込まれるので、最初の設定は後から追加した設定に上書きされます。

例えば、先ほどの!/sample2.rbを以下のように*の前に指定すると、*に上書きされてしまい全てのディレクトリとファイルがGit管理下から除外されます。

優先順位の例

また、Gitのパフォーマンス上の理由からディレクトリを除外した後に、ディレクトリ内の一部のファイルに対して「!」を使ってGit管理する事は出来ません。

例えば、以下のように/directory2/のディレクトリを除外してから!directory2/hoge2.rbを指定してもdirectory2/hoge2.rbは除外されてGitで管理されません。

ディレクトリの一部ファイルをGit管理することが出来ない

しかし、/directory2/でディレクトリを除外するのではなく、/directory2/*でディレクトリ内の全てのファイルやディレクトリを除外してから!/directory2/hoge2.rbと指定すると、/directory2/hoge2.rbはGit管理する事が出来ます。

全てのファイルを除外してから一部のファイルをGit管理する

Pikawakaマーク「 ! 」を使う際の注意点

  1. 最初の指定した設定は、後から追加した設定に上書きされるので指定する順番に気をつけましょう。
  2. ディレクトリを除外した後に、ディレクトリ内の一部のファイルに対して「!」を使ってGit管理する事は出来ません。
  3. ただし、ディレクトリ除外ではなくディレクトリの中身を除外する*を使う事で一部のファイルをGit管理する事が出来ます。

コメントアウト
リンクをコピーしました

コメントアウトは、#(ハッシュ記号)で指定します。
以下のファイルは、#でコメントアウトされているので除外されません。

コメントアウトされているので除外されない

特定の拡張子の除外
リンクをコピーしました

特定の拡張子を*を使って、* + 拡張子と指定する事で場所に関係なく指定した拡張子を全てGit管理下から除外する事が出来ます。

例えば、以下のように*.pngと指定する事で、png拡張子のファイルが全てGit管理下から除外されます。

特定の拡張子の除外

また、以下のように/*.pngと指定すると、ディレクトリ直下の.gitignoreファイルをカレントディレクトリとした相対パスになります。

ディレクトリ直下の特定の拡張子の除外

つまり、.gitignoreファイルと同じ階層にあるpng拡張子のhoge.pnghoge2.pngファイルのみGit管理下から除外され、directory/hoge3.pngは除外されません。

.gitignoreファイル指定方法一覧
リンクをコピーしました

これまで解説した.gitignoreファイルの指定方法は、以下の一覧にまとまっています。

指定方法 意味
/を含めないで指定 同名のファイルとディレクトリを全て除外 sample1.rb
末尾以外に/を含めて指定 特定のファイルとディレクトリを除外 /sample1.rb
ディレクトリ名の末尾に/を指定 同名のディレクトリを除外 directory/
ファイルやディレクトリの最初に!を指定 特定ファイルとディレクトリだけ追跡 !/sample2.rb
#(ハッシュ記号)で指定 コメントアウト #sample1.rb
* + 拡張子と指定 特定の拡張子の除外 *.png

.gitignoreの優先順位
リンクをコピーしました

.gitignoreファイルは、以下のように複数作成する事が出来ます。

gitignoreファイルの複数配置

.gitignoreファイルが複数存在する場合は、深い階層にある.gitignoreファイルに指定された設定の方が優先度は高いです。gitignore_sample/directory/に.gitignoreファイルを追加して確認します。

複数ディレクトリ
リンクをコピーしました

まず、gitignore_sample直下にある.gitignoreファイルに*.pngと指定し、全てのpng拡張子のファイルをGit管理下から除外します。

複数ディレクトリの優先順位

.gitignoreファイルで*.pngと指定すると、以下のようにどの場所であっても全てのpng拡張子のファイルがGit管理下から除外されます。

優先順位高いディレクトリ

これにdirectory/.gitignoreに、png拡張子だけGit管理させる!*.pngを指定したらどうなるでしょうか?

png拡張子だけGit管理

directory/.gitignore.gitignoreよりも深い階層に位置するので、directory/.gitignoreで指定した!*.pngが優先されてdirectory/hoge3.pngはGit管理されます。

深い階層のgitignoreが優先される

gitignore_sampleディレクトリ直下にあるhoge.pnghoge2.pngは、Git管理下から除外されます。

Railsアプリケーションの場合
リンクをコピーしました

Railsアプリケーションでは、gemやRails独自のディレクトリ構成の関係で.gitignoreで除外しなければいけないファイル、逆に除外してはいけないファイルがあります。下記は代表的な例です。

除外するファイル

  1. .env
  2. /public/uploads
  3. vendor/bundle

除外してはいけないファイル

  1. Gemfile.lock
  2. db/schema.rb

除外対象1 - [.env]
リンクをコピーしました

.envは環境変数を管理するファイルで、gemのdotenv-railsを使う際に作成します。
隠したいデータを.envに記述する為、.gitignoreでGit管理下から除外せずにリモートリポジトリで公開してしまうと非常に危険です。

例えば、carrierwaveのs3のaccess keyなどを.envに記述して、.gitignoreでGit管理下から除外せずにあげると、悪意あるユーザーからs3を不正利用されてしまい多額の請求をされてしまいます。

実際にこの様なケースが起きているので.envは必ずGit管理下から除外しましょう。

.envをgitignoreで指定する

除外対象2 - [/public/uploads]
リンクをコピーしました

gemのCarrierWaveを使う場合に、デフォルトでアップロードしたファイルの情報が/public/uploadsに保存されます。

本番環境では、AWSのS3にアップロードしたファイルは保存する様に設定したりしますが、開発環境などで/public/uploadsにアップロードされる画像はGit管理してリモートリポジトリに上げる必要がないので、Git管理下から除外します。

public/uploadsをgitignoreする

除外対象3 - [vendor/bundle]
リンクをコピーしました

アプリケーションで利用しているgemは、デフォルトで~/.rbenv/versions/rubyバージョン/lib/ruby/gems/(x.x.0)/gemsに保存されます。(rbenv利用時)

このgemをプロジェクト毎にアプリケーション内で管理したい場合、bundle install --path vendor/bundleを実行すると、vendor/bundle配下にプロジェクトのgemを保存する事が出来ます。しかし、vendor/bundle配下のgemはリモートリポジトリに上げるものではないのでGit管理下から除外します。

vendor/bundleをgitignoreする

vendor/bundleについて、詳しくはgemのインストール場所とは?からご確認ください。

その他のRailsアプリケーション独自に.gitignoreで指定した方が良いファイルなどは、Githubのgitignore/Rails.gitignoreを参考にして下さい。

非除外対象1 - [Gemfile.lock]
リンクをコピーしました

Gemfile.lockは、gemの依存関係を管理するファイルです。Railsアプリケーションで利用するgemのバージョンをlockしているので、Gemfile.lockをGit管理下から除外してしまうと、環境によってgemのバージョンがバラバラになってしまいます。

Gemfile.lockは、.gitignoreファイルで除外してはいけないファイルです。

詳しくは、Gemfile.lockとはを参考にして下さい。

非除外対象2 - [db/schema.rb]
リンクをコピーしました

db/schema.rbに書かれた情報を元にしてデータベースを操作をします。
このファイルをGit管理下から除外してしまうと、データベース系のコマンドが実行出来なくなります。

db/schema.rbは、.gitignoreファイルで除外してはいけないファイルです。

gitignoreが適用されない場合の解決方法

この章では、gitignoreが適用されない場合の解決方法を解説します。

.gitignoreに指定するファイルは、インデックスに登録されていない状態のものが適用されます。既にインデックスに登録されているファイルに関しては、.gitignoreで指定しても適用されません。

例えば、gitignore_sampleディレクトリ直下のsample1.rbだけインデックスに登録します。

sample1.rbだけインデックスに登録する

そして、以下のように.gitignoresample1.rbを指定しても、先ほどのsample1.rbはインデックス登録したので除外されていません。(directory/sample1.rbは、インデックス登録されていないので除外が適用される)

インデックスに登録したファイルを.gitignoreに指定する場合

一度インデックス登録したファイルをgitignoreするには、以下の状況で解決方法が異なります。

  1. git addまで実行した場合
  2. git commitまで実行した場合
  3. コミット履歴を残しても平気なファイルをgit pushまで実行した場合
  4. コミット履歴を残したくない重要なファイルをgit pushまで実行した場合

それでは、各状況の解決方法を1つ1つ解説します。

1. git add まで実行した場合
リンクをコピーしました

git addコマンドでインデックス登録したファイルやディレクトリは、Git管理を解除する為に、以下のコマンドでキャッシュを削除する必要があります。

コンソール | キャッシュを削除してGit管理を解除する
1
2
git rm -r --cached [ファイル名 or ディレクトリ名] # 特定ファイル(ディレクトリ)のキャッシュ削除
git rm -r --cached . #全てのキャッシュ削除

先ほどのsample1.rbgit statusで確認すると、以下の通りインデックスに登録した状態でした。

sample1.rbだけインデックスに登録する

sample1.rbをGit管理から解除するために、git rm -r --cached sample1.rbを実行してgit statusで確認します。

インデックスに登録したsample1.rbが解除される

上記は、sample1.rbのキャッシュが削除されてインデックス登録が解除されましたが、ローカルにあるファイルが削除される訳ではありません。

インデックス登録を削除した状態で、以下の.gitignoreファイルを確認します。

インデックス登録を削除したのでgitignoreされる

上記は、インデックス登録が解除されたので.gitignoreファイルで指定したsample1.rbが有効になり除外が適用されます。

2. git commit まで実行した場合
リンクをコピーしました

commitしたファイルをgitignoreしたい場合は、addと同様にgit rm -r --cachedでキャッシュを削除しますが、ファイル削除の変更点が加えられます。

コンソール | キャッシュを削除してGit管理を解除する
1
2
git rm -r --cached [ファイル名 or ディレクトリ名] # 特定ファイル(ディレクトリ)のキャッシュ削除
git rm -r --cached . #全てのキャッシュ削除

この変更点を確認する為に、先ほどのsample1.rbをcommitまで実行してgit statusします。以下のようにsample1.rbはアントラッキング状態ではありません。

sample1.rbをcommitまで実行

そしてcommitまで実行すると、以下のように.gitignoreファイルにsample1.rbと指定しても除外は適用されません。

commit状態でのgitignore

除外を適用させる為に、git rm -r --cached sample1.rbを実行してgit statusで確認すると、sample1.rbを削除したという変更点が追加されます。

ファイル削除の変更点が追加される

しかし、削除というのは実際にファイルが削除された訳ではなく、削除という形でGit管理から外す挙動になるので、ファイルはローカルに残ります。キャッシュを削除したsample1.rb がローカルで確認できます。

そして、現在sample1.rb はインデックスを解除したので、再びUntracking filesに出てくる状態です。ここから完全にGitの管理下から外すために以下のように.gitignoresample1.rbを指定します。

sample1.rbが除外される

これで、一度コミットしてしまったsample1.rbをgitignoreを適用する事が出来ます。

Pikawakaマークcommitの場合

git rm -r --cachedを実行すると、ファイルの状態はdeletedになりますが、ローカルのファイルが削除されている訳ではないので安心して下さい。

3. git pushまで実行した場合(コミット履歴が残る)
リンクをコピーしました

git pushでGithubにアップロードしたファイルをgitignoreしたい場合に加え、ファイルが重要ではなくコミット履歴が残っても平気な場合は、以下の方法で解決することが出来ます。

  1. git rm -r --cached [ファイル名]を実行
  2. .gitignoreにファイルを指定
  3. 再度add, commit, pushを実行

git rm -r --cached [ファイル名]の実行後に、対象ファイルを.gitignoreに指定して3番目のGitコマンドを実行すると、削除のコミットによってGithubにアップロードされたファイルが削除されます。(※最初のファイル追加のコミットは残る)

それでは、Railsアプリケーションのpublic/uploadsを例に実行内容を確認します。
まずは、以下のように.gitignoreに指定せずpublic/uploadsgit pushまで実行します。

重要ではないファイルをpushまで行う

pushしたものをGithubで確認すると、以下のようにpublic/uploads以下がアップロードされています。

Githubでファイルがアップロードされる

pushした状態では.gitignoreでは適用外なので、以下のようにgit rm -r --cached ~を実行してから.gitignoreに追加します。これで、キャッシュが削除され他ので適用されます。

git rm -r --cached ~を実行

そして、再度public/uploadsadd ~ pushまで行います。この時Git管理から除外する為にファイル削除のコミットが発生します。(※ローカルのファイルが削除されている訳ではありません。)

git add ~ pushを再度行う

pushしたものをGithubで確認すると、最初pushしたpublic/uploads/post/imageが削除されています。

コミット履歴を確認

コミット履歴を確認すると、一度pushしたpublic/uploads/post/imageは、先ほどのコミットによって削除されています。

コミットで削除されている

しかし、このコミットはファイルを削除しただけなので、ファイル追加したコミット履歴はそのまま残っています。(下記参照)

ファイルを追加した際のコミット履歴

このコミット履歴からファイルの中身を確認することが出来てしまうので、重要なファイルをアップロードした場合にはこの方法は適しません。あくまでも、コミット履歴を残しても平気なファイルに対して行う解決方法です。

4. git pushまで実行した場合(コミット履歴を残さない)
リンクをコピーしました

git pushでGithubにアップロードしたファイルをgitignoreしたい場合に加え、重要な情報が記述されたファイルをアップロードしてしまった場合は、以下の方法で解決することが出来ます。

  1. git resetでコミットを削除する
  2. .gitignoreにファイルを指定する
  3. git push -f ブランチ名で強制的に上書きする

上記は少し複雑なので、以下のサンプルで1つ1つ確認します。(初回コミットでREADME.mdを作成しpush済みですが、今回は省いています。)

envサンプルアプリの中身

.envファイルは、以下のように環境変数の記述された重要なファイルですが、.gitignoreで指定されていません。

環境変数をgitignoreする

この状態でgit add ~ pushまで実行すると、.envファイルがアップロードされるだけではなく、以下のようにコミット履歴からファイルの中身を見ることが出来てしまいます。

コミット履歴確認

この状態でgit rm -r --cachedでキャッシュ削除して.gitignoreに指定し直しても、.envファイルが削除されるだけで「.envを追加したコミット履歴」は削除されません。重要なファイルをpushした場合は、悪意あるユーザーがそれを不正利用して多額な請求をするケースも実際にあるので、コミット履歴まで削除する必要があります。

4-1. git resetでコミットを削除する
リンクをコピーしました

コミット履歴を削除するには、インデックスとコミット履歴(HEADの位置)を削除するgit reset [対象のコミット]を実行します。

コミット履歴とインデックスを削除する方法
1
git reset [対象のコミット] 

[対象のコミット]を確認する為にgit logを実行すると、以下のような画面が表示されます。commit 長い文字列の長い文字列部分はコミットIDになり、先ほどのGithubにアップロードしたコミット履歴のidと一致しています。(.envファイルを追加したコミット)

git log実行結果

このコミットは直前のコミットになるので、以下のようにgit resetで「直前のコミットの意味のHEAD^」を指定して実行します。

直前のコミット履歴とインデックスを削除する方法
1
git reset HEAD^ 

実行後に以下のようにgit logで確認すると、README.mdを追加した最初のコミットのcf3a81e130ce2aa6cf86f8a0f7696c806f93ee1aだけあり.envファイルを追加したbe646e266d20388bdae730fe6b0ffa9fdc40fb05が削除されています。

git reset HEAD^を実行後にgit logを確認

またgit statusでも確認すると、.envファイルを追加したコミット履歴だけではなくインデックスからも削除されています。

コミット削除後のファイル状態

次に.gitignore.envファイルを指定します。

4-2 .gitignoreファイルに.envを指定する
リンクをコピーしました

既に先ほどのgit reset HEAD^でコミット履歴とインデックス削除する事ができたので、.envファイルを.gitignoreに指定しGit管理下から除外します。

.envを除外する

以下のようにgit statusで確認すると、.envファイルがGit管理下から除外されている事がわかります。

.envがGit管理下から除外される

4-3 git push -f ブランチ名で強制的に上書きする
リンクをコピーしました

.gitignoreファイルは変更したので、そのままgit addgit commitを実行して変更を追加します。しかしgit pushでは、ローカルのコミットを削除したことによってリモートのコミットが進んだ状態になるのでpushしてもエラーが発生します。

git pushでエラーが発生

以下のようにリモートリポジトリには、.envファイルを追加したコミット履歴が残ったままなので衝突が起きてしまいpushする時エラーが発生してしまうのです。

リモートリポジトリとの競合発生

ローカルの方のコミット履歴を優先させたいので、-fオプションを使用して強制的にリモートリポジトリを上書きします。

強制的にリモートリポジトリを上書きする
1
git push -f origin master[ブランチ名]

上記を実行してGithubを確認すると、コミットが削除されたので.envファイルの情報が抜き取られる危険性がなくなりました。

コミット削除後のgithub

この様に重要なファイルをリモートリポジトリにアップロードしてしまった場合は、コミット履歴まで削除する様にしましょう。

Pikawakaマーク重要なファイルをpushした場合

  1. git reset 対象コミットでコミット履歴とインデックスを削除する
  2. .gitignoreファイルに除外するファイルを指定する
  3. git add ~ commitまで通常に行いgit push -f ブランチ名でリモートリポジトリに強制的に上書きする

開発者の個人の設定と自動生成サービス

この章では、開発者の環境によって自動生成されてしまうファイルをGit管理下から除外する方法と.gitignoreファイルの中身を自動で生成してくれるサービスについて解説します。

開発者の個人の設定方法
リンクをコピーしました

これまで解説してきた.gitignoreファイルはあくまでプロジェクトでGit管理下から除外したいファイル or ディレクトリを記録する場所です。

以下のような開発者の環境によって自動生成されるファイルは、~/.config/git/ignoreに指定する必要があります。

  • Mac - .DS_Store[フォルダの表示位置設定を記述する隠しファイル]
  • Windows - Thumbs.db[フォルダの画像が縮小表示された際に記録する一時ファイル]

~/.config/git/ignoreの設定方法
リンクをコピーしました

~/.config/git/ignoreに指定した設定は、Gitリポジトリで最初に読み込まれるので開発者の環境によって自動生成されるファイルなどのGit管理下からの除外は、このファイルで設定しましょう。

viを使ってファイルを開きます。

コンソール | ignoreファイルに設定を追加する
1
$ vi ~/.config/git/ignore

上記のコマンドを実行すると、以下のようにファイルが開きます。

自動生成されるファイルのGit管理下からの除外方法

このファイルにGit管理下から除外したい自身の環境のファイルを指定します。
viで編集するには、まずiを入力して編集モードにします。以下のようにファイル下部にINSERT表記が出たら編集可能です。

viのインサートモード

設定を追加したらESCで編集モードを終了して、:wqでファイルを保存して閉じます。これでGit管理下から指定した設定は除外されます。

もし、.DS_StoreThumbs.dbをGithubにあげている人がいたら~/.config/git/ignoreに設定しましょう。

~/.config/git/ignoreに設定する内容は、環境ごとに違うのでGithubのgitignore/Globalを参考に設定を追加してみて下さい。

自動生成サービス
リンクをコピーしました

今回は、.gitignoreファイルを自身で作成する方法を解説しましたが、.gitignoreファイルの中身を自動で生成するサービスがあります。

効率良くアプリケーションを作成するために、この様なサービスを使うのも良いでしょう。

まとめ
  • .gitignoreとは、Gitで管理しないファイルを指定することが出来るファイルのことです。
  • Git管理下から除外できるのは、インデックスに登録・コミットしてないファイル(ディレクトリ)です。
  • あくまでプロジェクトでGit管理下から除外したいファイルを記録する場所なので、開発者個人の除外したいファイルは~/.config/git/ignoreに設定します。