その他
    ホーム技術発信DoRubygitの大文字小文字でハマった話

    gitの大文字小文字でハマった話

    この記事はアピリッツの技術ブログ「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