【Git】大文字小文字の異なるファイルが共存する問題の解決方法

※この記事は MTI Blog Summer 2025 の8月12日分の記事です。

はじめに

こんにちは、アプリ開発支援部に所属しているエンジニアの涌井です。

今回は、プロジェクトで開発をしていた際に発生したGitの問題について、その事象と解決方法をご紹介いたします。

エンジニアであれば、誰しもGitを使う機会はあると思いますので、ぜひ参考にしていただければと思います。

目次

背景

プロジェクト開発中、リモートリポジトリに大文字小文字が異なるファイルが混在し、clone後も「変更」に表示され続けてしまい、git stashでは解決できない問題が発生しました。
そのため、原因と解決策を調査しました。

発生した問題

発生した問題について説明します。 以下のような事象が発生しました。

  1. GitHubなどで以下のようなファイルが共存していることを確認する
    • HogeHoge.txt
      • 中身:Hello
    • Hogehoge.txt
      • 中身:Hello
    • hogehoge.txt
      • 中身:hello
  2. この状態で、WindowsやMacBookでgit cloneする
    すると、以下のようにhogehoge.txtしか認識されておらず、VSCodeの変更の箇所にHogeHoge.txtHogehoge.txtが表示されています。
  3. git stashする
    そうしても、以下のようにHogeHoge.txtしか認識されておらず、VSCodeの変更の箇所にhogehoge.txtが表示されている状態になるだけです。

※これは事象再現のためのスクリーンショットで、正式なファイル名ではありません。
※ファイルが3つあるのは、今回発生した事象がそうだったことと、ファイルが2つの場合同じ事象を再現することができなかったためです。

解決したいこと

1. 3つあるファイルを1つにする

現在ある以下3つのファイルを、適切な内容(hello)を持つhogehoge.txtのみが残るようにします。

  • HogeHoge.txt
    • 中身:Hello
  • Hogehoge.txt
    • 中身:Hello
  • hogehoge.txt
    • 中身:hello

2. 同一ファイル名を複数存在させない

hogehoge.txtのみ残るように変更しますが、その後HogeHoge.txtを作成してコミット・プッシュすると、同じ問題が再発します。
この問題の解決方法も必要です。

原因

なぜこの事象が起こるのかを調査しました。
この事象が起こる原因は2つ考えられます。

1: core.ignoreCaseがtrue

公式ドキュメントGit - git-config Documentationにある通り、デフォルトでは、core.ignoreCaseがfalseになっていますが、git cloneしたときなどは、trueになります。

そのため、チーム開発などで、誰かが知らず知らずのうちに、大文字小文字が違うだけのファイル名を変更してリモートリポジトリにプッシュしてしまったりして、このような事象が起こったのではないかと考えられます。

ファイル名を変更する際には、明示的にcore.ignoreCaseをfalseにした後に行う必要があります。

2: case-sensitiveなOSではない

MacBookやWindowsはcase-insensitive(大文字小文字を区別しない)OSであるため、リモートリポジトリ上では大文字小文字の区別がされていても、ローカル上では区別されません。
それも原因の一つだと考えられます。

解決策

調べたところ、ファイルシステムをCase-sensitiveに設定しておこう for Mac #Git - Qiitaという記事でファイルシステムを変更する方法もあります。
しかし、今回は、ファイルシステムなどの変更をせずに解決する方法をご紹介します。

場合によって、複数ファイルがある場合、どれを残すべきか慎重にチェックする必要があります。
また、そのファイルによって中身が大幅に違うなどの場合は、そちらもチェックしながら対応する必要があるでしょう。

冒頭に説明した通り、現在リモートリポジトリに、以下のようなファイルが存在しているという状況です。

  • HogeHoge.txt
    • 中身:Hello
  • Hogehoge.txt
    • 中身:Hello
  • hogehoge.txt
    • 中身:hello

こういうケースは厄介ですが、以下のような手順で対応することができます。

3つあるファイルを1つにする方法

  1. 以下のコマンドで違うファイルに一時的にコピーする

    cp hogehoge.txt tmp_hogehoge.txt
    
  2. コピーした変更をコミットする

  3. VSCode上で、hogehoge.txtを削除する
    すると、全てのファイルが削除されていることになります。
    • HogeHoge.txt
    • Hogehoge.txt
    • hogehoge.txt
  4. これをコミットする
  5. 以下のコマンドを実行してファイル名をtmp_hogehoge.txtからhogehoge.txtに戻す

    git mv tmp_hogehoge.txt hogehoge.txt
    

    このとき、git statusを実行すると、renamed: tmp_hogehoge.txt -> hogehoge.txtと表示されているはずです。

  6. これをコミットする
    このとき、手元では正しいファイルのみが残っている状態になっているはずです。
  7. プッシュしてリモートリポジトリを確認する
    こちらでも、ローカルと同じく、正しいファイルのみが残っている状態になります。

同一ファイル名を複数存在させない方法

3つあるファイルを1つにする方法だけでは、HogeHoge.txtを作成してコミット・プッシュすると、同じ問題が再発します。
そのため、問題が再発しないようにファイル名を変更する手順をご紹介します。

ファイル名を変更する方法

  1. 以下のコマンドで該当のファイルを探す

    git ls-files hogehoge*  
    

    これで、gitが認識しているファイル名を確認することができます。
    参考:git findじゃなくてgit ls-files #Git - Qiita

  2. core.ignoreCaseをfalseにする

    git config core.ignorecase false
    

    上で書いているとおり、ここでfalseにしておかないと、大文字小文字の変更が正しく認識されません。

    git config -l --local | grep core.ignorecaseで今どちらになっているかを確認できます。
    参考:Gitでファイル名の大文字・小文字の変更を検知するようにする #Git - Qiita

  3. 以下のコマンドで、一時的に別の名前に変更する

    git mv hogehoge.txt temp_HogeHoge.txt
    

    このとき、git statusを実行すると、renamed: hogehoge.txt -> temp_HogeHoge.txtと表示されているはずです。

  4. 最終的な名前に変更する

    git mv temp_HogeHoge.txt HogeHoge.txt
    

    このとき、git statusを実行すると、renamed: temp_HogeHoge.txt -> HogeHoge.txtと表示されているはずです。

  5. コミットする
  6. プッシュしてリモートリポジトリで確認する
    今回は、ファイル名がHogeHoge.txtで、ファイルの中身がhelloのものが残っていることになります。

参考にしたサイトであるGit でファイル名の大文字小文字の変更が検出されない #初心者 - Qiitaでは、git mvで直に変更していましたが、うまく認識されないことがあったため、2段階の変更をお勧めします。
git mvは、Git - git-mv Documentationを参照してください。

まとめ

今回は、Gitで大文字小文字が異なるファイルが共存してしまった場合の問題と解決策についてご紹介しました。

この問題は、LinuxやWSLなどのcase-sensitive(大文字小文字を区別する)OSで大文字小文字が違うだけのファイルを作成し、WindowsやMacBookなどのcase-insensitive(大文字小文字を区別しない)OSでcloneした際に発生することがあります。

このような問題を未然に防ぐためには、チーム全体でファイルの命名規則や大文字小文字の使用に関するルールをチーム内で統一しておくことが重要です。

また、ファイル名を大文字小文字で変更するときは、細心の注意を払って行うことが必要です。

今回の記事が、同様の問題が発生した際の参考になれば幸いです。