基本

git mv

ファイルやディレクトリの移動・リネームをGitに追跡させます。OSのmvコマンドとは異なり、Gitが変更を'rename'として認識するため履歴が途切れません。

構文 git mv <移動元> <移動先>

オプション

フラグ 説明
-f, --force 移動先に同名ファイルが存在する場合でも強制的に上書きします。通常は安全のため上書きが拒否されます。
-n, --dry-run 実際には移動せず、移動対象のファイルを確認するだけです。操作前のチェックに使います。
-v, --verbose 移動したファイルの名前を表示します。

git mv は、ファイルやディレクトリをGitの管理下で移動・リネームするコマンドです。OS の mv コマンドでファイルを動かすと Git が「削除 + 新規追加」と誤認してしまいますが、git mv を使うと Git が正しく「rename」として記録し、ファイルの変更履歴が追跡できる状態を保てます。

基本的な使い方

# ファイルをリネーム
git mv old-name.txt new-name.txt

# ファイルを別ディレクトリへ移動
git mv src/utils.js lib/utils.js

# 移動内容をコミット
git commit -m "utils.js を lib/ に移動"

git mv を実行すると、移動がすぐにステージングされます。あとは git commit するだけで履歴に記録されます。

移動後の git status の見え方

git mv README.md docs/README.md
git status
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        renamed:    README.md -> docs/README.md

renamed: として表示され、Git が移動を正しく認識していることが確認できます。

移動前                     移動後
────────────────────────────────────────────────
README.md          →      docs/README.md
(追跡中)                  (renamed として記録)

ディレクトリのリネーム

ディレクトリ単位でリネームしたい場合も同様に使えます。

# ディレクトリをリネーム
git mv old-docs/ docs/

# 移動対象を事前に確認する(実際には移動しない)
git mv -n old-docs/ docs/

OS の mv コマンドとの違い

操作Git の認識ステージング
mv 旧ファイル 新ファイル削除 + 新規追加git add が別途必要
git mv 旧ファイル 新ファイルrename自動でステージングされる

OS の mv は Git を関知せずファイルを動かすだけのため、Git 側では「古いファイルが消えて、新しいファイルが増えた」という認識になります。

mv を使ってしまったときのリカバリ方法

誤って OS の mv を使ってしまった場合でも、以下の方法で同じ結果を得られます。

# OS の mv でファイルを移動してしまった
mv README.md docs/README.md

# git status で確認(削除と新規追加として見える)
git status
# deleted:    README.md
# Untracked files: docs/README.md
# 方法1: -A ですべての変更をステージング(Git が rename と判定する)
git add -A

# 方法2: 個別にステージング
git add docs/README.md
git add README.md   # 削除もステージングされる

どちらの方法でも、Git は「削除 + 追加」のペアを自動的に renamed と判定し、同等の結果になります。

git status
# renamed:    README.md -> docs/README.md

注意点

  • 移動先のパスが存在しない場合はエラーになります。事前にディレクトリを作成しておいてください(mkdir -p など)。
  • git mv は移動とステージングを同時に行うため、git add を別途実行する必要はありません。
  • コミット前に取り消したい場合は git restore --staged <ファイル名> でアンステージ後、元のパスに手動で戻します。