Gitで管理しているファイルを別フォルダに移動したのに、「rename(移動)」ではなく「削除+追加」と表示されて困ったことはないだろうか。
特に、VSCodeやエクスプローラーでドラッグ&ドロップした場合に起きやすい現象だ。
結論から言うと、これはエラーではなくGitの仕様である。
本記事では、初心者でも理解できるように以下を解説する。
- なぜ移動として認識されないのか
- 正しい対処方法
- Gitの仕組み(重要)
Gitでファイル移動が認識されない原因
Gitには「移動」という概念がない
Gitは一見「ファイルを管理している」ように見えるが、実際は違う。
👉 Gitが管理しているのは**ファイルの状態(スナップショット)**である。
そのため、ファイル移動は内部的には次のように扱われる。
- 元のファイルが削除された
- 新しい場所にファイルが作成された
つまり、「移動」という操作自体は記録されていない。
表示上の「rename」は、あとからGitが内容を比較して、「同じファイルだろう」と判断しているだけである。
ファイル内容が変更されている
ファイルを移動したあとに少しでも編集すると、Gitは別ファイルと判断する。
例えば:
- 改行を追加した
- コメントを1行追加した
この程度でも、類似度が下がり「別物」と扱われることがある。
複数ファイルの移動で判定が崩れる
大量のファイルを一度に移動した場合も注意が必要だ。
Gitは内容の類似性を元に判定するため、
- 同時に多くの変更がある
- ファイル構造が大きく変わる
といったケースでは、正しくrename判定されないことがある。
移動として認識させる方法
git mvコマンドを使う
最も確実な方法は、Gitのコマンドを使うことだ。
git mv 元ファイル 移動先/例:
git mv src/test.txt docs/この方法を使えば、Gitは移動として扱いやすくなり、履歴も追いやすくなる。
移動後でも問題ないケース
実は、「削除+追加」と表示されても問題ないケースがほとんどである。
理由は以下の通り。
- Gitは内部的に同じ扱いをしている
- 履歴はあとから追跡できる
つまり、見た目にこだわる必要はない。
Visual Studio Codeでの表示
単純なファイルの異動だけの場合は、VSCodeのエクスプローラやWindowsのエクスプローラでのファイルの移動で、ちゃんと移動と認識してくれる場合がある。
ファイルを移動後、「ソース管理」クリックし、「変更」セクションで移動したファイルの「D」「U」をクリック選択して右クリックし、表示されたメニューの変更ステージをクリック。

「ステージされている変更」セクションに対象のファイル名が1つ表示される。ファイル名の右側には「R」と表示され、移動と認識されたことがわかる。


VSCodeの「ソース管理」ウインドウで、移動したファイルが削除+追加で表示されていてもびっくりしないようにしよう。
すでに移動してしまった場合の対処方法
そのままcommitしてOK
すでにファイルを移動してしまった場合でも、基本的にはそのままで問題ない。
git add .
git commit -m "ファイル移動"Gitはコミット時に内容を比較し、場合によっては自動的に「rename」として扱うこともある。
履歴を追う方法
移動前の履歴を確認したい場合は、以下のコマンドを使う。
git log --follow ファイル名これにより、移動前の履歴も含めて確認できる。
Gitの仕組みを理解する(初心者向け)
Gitは「状態」を管理している
Gitは「ファイル操作」ではなく、ある時点の状態全体を管理している。
イメージとしては以下の通り。
- コミット = スナップショット(その時点の全体状態)
そのため、
- ファイルがどこにあるか
- 名前が何か
よりも、中身が何かが重要になる。
renameはあくまで見せ方
Gitの「rename表示」は、あくまで後からの推測である。
- 実際には記録されていない
- 表示時に判断しているだけ
この仕組みを理解すると、今回のような現象に迷わなくなる。
注意点
見た目にこだわりすぎない
「renameにならない=失敗」ではない。
Gitの本質は履歴を管理することであり、表示形式ではない。
履歴が追えることが重要
重要なのは以下である。
git log --followこれが使えれば、実務上は問題ない。
重要ファイルはgit mvを使う
以下のようなケースでは、git mvを使うのが安全だ。
- 重要なファイル
- 履歴を確実に残したい場合
- 大量のリファクタリング
まとめ
Gitでファイル移動が認識されないのは、バグではなく仕様である。
- Gitには「移動」という概念がない
- 実際には「削除+追加」として扱われる
- renameは後からの判定
対処としては以下を押さえておけばよい。
- 確実にやるなら
git mv - すでに移動済みでも問題なし
- 履歴は
git log --followで追える
仕組みを理解しておけば、Gitの挙動に迷うことはなくなる。
コメント