ゲーム開発を複数人で進めていた時、あるメンバーのブランチに切り替えたら、なぜか想定外の差分が出続ける、という問題にぶつかりました。

その後、ブランチを切り替えようとした時、何度差分を破棄しても、スタッシュしてみても、差分が出続けて消えないのです。

しかも、git reset --hardをすると、Encountered 6 file(s) that should have been pointers, but weren't: (以下、ファイル名)

というメッセージが出て、リセットできません。

...新手のホラーか?


原因

(ところで、ターミナルのメッセージがいつもイタリア語で出るんだが何故...)

Git LFS(Large File Storage)をプロジェクトに導入していたが、そのメンバーはGit LFSを導入していなかったから。

Git LFS(Large File Storage)は、Gitリポジトリ内の大きなファイルを効果的に管理するための拡張機能です。
Git LFSを使うと、大容量のバイナリファイル(画像、動画、バイナリデータなど)をリポジトリに含めず、代わりにそれらのファイルのポインタをコミットに格納します。

これによって、リポジトリのサイズが小さくなり、クローンやプッシュが高速化できる、というメリットがあるんですね。



今回作っているゲームは、かなり大量の画像や音声を使うので、.pngや.jpgなどの拡張子を、一括でGit LFSで管理していたのです。

それを自分の方で共有していなかっため、予期せぬ差分が発生してしまったようです。



対策

メンバーにGit LFSを入れてもらう。

そもそも、ファイル管理の方法をちゃんと伝える(ここ大事)。

普段、一人開発していると忘れてしまうことですが、開発環境を揃えること、その情報をシェアすることって大事だよな(戒め)。




差分が出続けてブランチを切り替えられない時の対処法

対策1

git checkout -f

これで強制的にブランチを切り替えることで、まっさらにできます。


対策2

git rm --cached -r .    
git reset --hard
git rm .gitattributes
git reset .
git checkout .

ステージングエリアから全てのファイルやディレクトリを削除して、
ワーキングディレクトリとステージングエリアを最後のコミットと同じ状態に戻して、
.gitattributes ファイルをステージングエリアから削除して、
ステージングエリアを最後のコミットと同じ状態に戻して、
ワーキングディレクトリの変更を最後のコミットの状態に戻す

ということをしています。



参考