git mv
ファイルやディレクトリの移動・リネームをGitに追跡させます。OSのmvコマンドとは異なり、Gitが変更を'rename'として認識するため履歴が途切れません。
構文
git mv <移動元> <移動先> 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 <ファイル名>でアンステージ後、元のパスに手動で戻します。