今日やったこと

  • すでに Git 管理されているファイルを、あとから .gitignore に追加した場合の挙動を確認した
  • .gitignore は、基本的にまだ Git 管理されていないファイルに対して効くことを確認した
  • Git 管理中のファイルを、ローカルには残したまま今後の管理対象から外す方法を確認した
  • git rm --cached の使い方を整理した

例として、すでに hoge.txt が Git 管理されている状態を考えた。

git add hoge.txt
git commit -m "Add hoge.txt"

このあとで .gitignorehoge.txt を追加しても、hoge.txt は Git 管理されたままになる。

hoge.txt

そのため、hoge.txt を変更すると、通常どおり git status に表示される。

echo "追記" >> hoge.txt
git status

すでに Git 管理されているファイルを、今後の管理対象から外したい場合は、次のようにする。

git rm --cached hoge.txt
git add .gitignore
git commit -m "Stop tracking hoge.txt"

--cached を付けることで、Git の管理対象からは外すが、ローカルの hoge.txt は削除しないようにできる。

学んだこと

  • .gitignore は、未追跡のファイルを Git 管理対象にしないための設定
  • すでに Git 管理されている tracked なファイルには、あとから .gitignore に追加しても効かない
  • tracked なファイルは、.gitignore に書いてあっても変更すると git status に表示される
  • tracked なファイルは、.gitignore に書いてあっても git addgit commit ができる
  • 今後 Git 管理対象から外したい場合は、.gitignore に追加するだけでは足りない
  • ローカルファイルを残したまま Git 管理から外すには、git rm --cached を使う

git rm --cached hoge.txt は、次のような意味になる。

Git のインデックスから hoge.txt を削除する
作業ディレクトリ上の hoge.txt は残す
次回以降は .gitignore により無視される

一方で、次のように --cached を付けずに実行すると、ローカルファイルも削除される。

git rm hoge.txt

そのため、ローカルにはファイルを残したい場合は、必ず --cached を付ける必要がある。

今回のポイントは、次のとおり。

.gitignore に書いたからといって、
すでに Git 管理されているファイルが自動で管理対象外になるわけではない。

あいまいなこと

  • git rm --cached したファイルを他の人が pull した場合、相手の作業ツリー上でファイルがどう扱われるのか
  • チーム開発で設定ファイルを管理対象外にするとき、どのタイミングで周知すべきか
  • 過去の履歴からもファイルを削除したい場合に、どの方法を使うべきか

次にやること

  • 誤ってコミットしたファイルを、Git の履歴から削除する方法を整理する
  • git filter-repo や BFG Repo-Cleaner のような履歴書き換えツールについて調べる