この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。
プロジェクトでバージョン管理にgit/GitLabを使っているのですが、そのgitの大文字小文字の扱いに落とし穴があって困った話です。
Gitは大文字小文字の違いを…
Gitはデフォルトでは大文字小文字の違いを無視する設定になっています。
なっているのですが、git mvを使わずにファイルの名前を変えたときは微妙におかしい無視のしかたをします。
今回はUnityエディタ上でImage.png
を image.png
にrenameしました。
(mvコマンドなどで名前を変えても同じ現象が起こります)
変えた後 git status
でどういう状況になっているか確認してみましょう。
new file: image.png
なんでやねん!!
違いを無視すると言っても Image.png
と image.png
を同じファイルだと思ってくれるわけではないようです。
これに気づかずにコミットしてpushすると、リポジトリ的には Image.png
と image.png
両方存在することになります。
Image.png
と image.png
が存在するため、他の人が Image.png
に対して変更をした場合、その変更は image.png
には反映されません。
さらにImage.png
と image.png
が別のブランチで変更されてマージしようとしたときにさらなる悲劇は起こります。
コ ン フ リ ク ト
仕方ないな…と思ってgit statusで状況を見てみると
nothing to commit, working tree clean
こうなるともうどうしていいのかわかりません。
同じファイルなのか別のファイルなのかはっきりしてほしいです。
gitの外からmvコマンドなどで名前を変えても同じ現象が起こります。
git mvを使った場合、そもそも同じものだと認識されてrenameできません。
fatal: destination exists ...
解決策
なんとかしてマージしよう
こうなったときは問題のファイルを一旦どこかに退避させて消してコミットしてまた戻しましょう。
あるいは一旦まったく違う名前にしてコミットしましょう。
gitの設定を変えよう
Gitはデフォルトでは大文字小文字の違いを無視する設定になっています。
この設定のせいです。
大文字小文字の違いを認識させたい場合は設定を変えましょう。git config -l
で設定を見ると以下のような行があるはずです。
core.ignorecase=true
trueだと大文字小文字の違いを無視します。falseだと違いを認識してくれます。
まとめ
ファイル名変えた程度の変更の場合、手癖でついよく見ずにコミットしがちですが、よくよく確認しましょう。
[参考]
https://qiita.com/sawadashota/items/aa312a3b7e2403448efe