gitで管理されたファイルを別のフォルダに移動として認識されないときは

Gitで管理しているファイルを別フォルダに移動したのに、「rename(移動)」ではなく「削除+追加」と表示されて困ったことはないだろうか。
特に、VSCodeやエクスプローラーでドラッグ&ドロップした場合に起きやすい現象だ。

結論から言うと、これはエラーではなくGitの仕様である。
本記事では、初心者でも理解できるように以下を解説する。

  • なぜ移動として認識されないのか
  • 正しい対処方法
  • Gitの仕組み(重要)
PR

Gitでファイル移動が認識されない原因

Gitには「移動」という概念がない

Gitは一見「ファイルを管理している」ように見えるが、実際は違う。

👉 Gitが管理しているのは**ファイルの状態(スナップショット)**である。

そのため、ファイル移動は内部的には次のように扱われる。

  • 元のファイルが削除された
  • 新しい場所にファイルが作成された

つまり、「移動」という操作自体は記録されていない

表示上の「rename」は、あとからGitが内容を比較して、「同じファイルだろう」と判断しているだけである。

ファイル内容が変更されている

ファイルを移動したあとに少しでも編集すると、Gitは別ファイルと判断する。

例えば:

  • 改行を追加した
  • コメントを1行追加した

この程度でも、類似度が下がり「別物」と扱われることがある。

複数ファイルの移動で判定が崩れる

大量のファイルを一度に移動した場合も注意が必要だ。

Gitは内容の類似性を元に判定するため、

  • 同時に多くの変更がある
  • ファイル構造が大きく変わる

といったケースでは、正しくrename判定されないことがある

PR

移動として認識させる方法

git mvコマンドを使う

最も確実な方法は、Gitのコマンドを使うことだ。

git mv 元ファイル 移動先/

例:

git mv src/test.txt docs/

この方法を使えば、Gitは移動として扱いやすくなり、履歴も追いやすくなる。

移動後でも問題ないケース

実は、「削除+追加」と表示されても問題ないケースがほとんどである。

理由は以下の通り。

  • Gitは内部的に同じ扱いをしている
  • 履歴はあとから追跡できる

つまり、見た目にこだわる必要はない。

Visual Studio Codeでの表示

単純なファイルの異動だけの場合は、VSCodeのエクスプローラやWindowsのエクスプローラでのファイルの移動で、ちゃんと移動と認識してくれる場合がある。

ファイルを移動後、「ソース管理」クリックし、「変更」セクションで移動したファイルの「D」「U」をクリック選択して右クリックし、表示されたメニューの変更ステージをクリック。

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

VSCodeの「ソース管理」ウインドウで、移動したファイルが削除+追加で表示されていてもびっくりしないようにしよう。

PR

すでに移動してしまった場合の対処方法

そのまま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の挙動に迷うことはなくなる。

\ITメモが役に立ったら/

ITメモをサポートする!
開発環境
PR

コメント

タイトルとURLをコピーしました