【Git】リモートブランチ上に「同一パス同一ファイル名のファイル」が作られた時の対処法

いつものようにトピックブランチのコンフリクトを解消し、その流れでコミットログも綺麗に修正していたある日。

さあ、開発を続けるぞ・・・!

と思ったが、どうやら不穏な動きをしているファイルがある。

ある特定ファイルを修正してcommitしてpushする。

しかし何故か

「先程変更した箇所と同じ差分」がワーキングツリーに存在している。

なにこれ・・・?いやその変更は今さっきpushしたはずでは・・・。

スポンサーリンク

原因

何か変だなと思いGitHub上でリモートブランチの状態を見てみると、上記の状態に。

つまり、同一パスの同一ファイル(?)がリモートブランチ上に存在している。

こんな事ありえる・・・?

ともあれ、現在の状態は

「リモート上に同一ファイルが存在する」

「けれどもローカル上ではそのファイルは一つだけ存在する」

と、言うこと。

つまり、どういうことか

謎の差分が生まれていた理由は、

  1. ローカルでファイルを変更してpushする。
  2. 「リモートのファイルA」が更新される(同一ファイルが存在するので、どちらか一方)
  3. しかし、「リモートのファイルB」は更新されない。
  4. つまり、ローカルと「リモートのファイルA」だけ更新された状態
  5. 普通であれば、これでローカルとリモートが同期されて差分は出ないはず
  6. しかし「リモートのファイルB」はローカルのファイルと比較した差分を出す。
  7. 結果として、先程commitしたばかりの修正差分が再度出現する。

という流れでこの現象が起きていたことがわかった。

解決方法

流石にこの状態はマズイ。リモートブランチ上に存在する重複ファイルを消すしかない。

以下のコマンドを打ち込む。

$ git rm --cached 対象ファイルパス

やっていること

  • rmコマンドで指定ファイルをgit管理から外す。
  • --cachedオプションでローカルのファイルは残すオプションを付ける。

これでローカルのファイルは残してリモートだけを削除する変更を加える。

その後、当該のファイルに対して何か変更してみる。そうすると、

こんな感じで一方をgit管理から外し(削除)、一方は変更を加える2つが表示された。
あとはこれをpushすることで無事今回の問題は解決する。

--cachedのオプションを使うことで、

不正な「ローカル1:リモート2」のファイル関係を、「1:1」に戻すことが出来た。

まとめ

多分滅多に起こらない現象だと思います・・・。

参考記事

【Git】git rm –cached [ファイル名]:ファイルを管理対象から除外する /@megu_ma

git add ってなんのためにやるの? Gitの「ステージング」をイラストで解説します! /株式会社KRAY(asachun)