前提
ローカルの OS は Windows/MacOS とする。
大文字/小文字を区別させるために git config core.ignorecase false
の設定がされているものとする。
同名だが大文字/小文字が異なるファイルが存在する branch 同士の checkout
例えば、readme.md
というファイルを README.MD
に変更して別のブランチに commit してあるとする。
このとき、大文字の branch-2 から、小文字の branch-1 に切り替えようとすると、以下のようなエラーが出てしまう。
error: The following untracked working tree files would be overwritten by checkout:
readme.md
Please move or remove them before you switch branches.
Aborting
解決方法
-f
のオプションをつける。
git checkout -f branch-1
大文字/小文字変更を merge されたブランチの pull
github 上や、他者が branch-1 に branch-2 を取り込み、リモート上の最新の branch-1 も大文字になっているとする。
この時に pull を実行すると今度は以下のようなエラーがでる。
error: The following untracked working tree files would be overwritten by merge:
README.MD
Please move or remove them before you merge.
Aborting
解決方法
小文字のファイルを rm したのち pull する
git rm readme.md
なぜ?
Windows や MacOS はファイル名の大文字と小文字は同じ文字として扱うような仕様になっている (ABC == abc == Abc == aBC = ...)。
git config core.ignorecase false
を設定してあるために、git としては区別しているが、OSとしては同名のファイルなのでうまく処理ができない。
なお Linux 等では区別するので、この問題は発生しない。
その他
git はデフォルトだと git config core.ignorecase true
の状態になっている。
そのままの状態(かつ Windows/MacOS)で、 readme.md
を README.MD
に変更したとしても同名ファイルと認識されたままなので、ファイル名の変更は commit に反映されない。