はじめに
Git
で ファイルを移動したときに、特に何もせずにファイルを移動すると、
削除して新規ファイルとして作成したと認識されてしまうときがあった。
それを解決するできるらしい、git mv
を実際に使用してみる。
環境
Windows 10 Professional
WSL2 (Ubuntu 22.04 LTS)
git version 2.34.1
実際に使ってみる
準備
適当なディレクトリを作成し、 index.php
というファイルを作成してみる。
中身は、以下のような感じ
<?php
echo "Hello,World";
これを保存し、 git add
, git commit
でコミットまで実行する。
mvの場合
では、このブランチから作業ブランチを作成する。git switch -c work-use-mv
として、切り替える。
新しくディレクトリを作成する。 (test
フォルダ)
そして、 mv
コマンドで、 index.php
→ test/index2.php
としてみる。
- test - index2.php
というような階層になる。
git status
を実行すると、
On branch work-use-mv
Changes not staged for commit:
(use "git add/rm <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
deleted: index.php
Untracked files:
(use "git add <file>..." to include in what will be committed)
test/
no changes added to commit (use "git add" and/or "git commit -a")
削除したファイルと新規作成したファイルという扱いになる。
さて、これを解消したい。
(※git add .
, git commit
でコミットまでしておく。)
git show
をすると
Date: Fri Jun 2 19:07:50 2023 +0900
mv
diff --git a/index.php b/test/index2.php
similarity index 100%
rename from index.php
rename to test/index2.php
こちらはリネーム扱いになっているようだ。
類似度100%と書いている。
履歴を確認してみる
git log --summary --follow test/index2.php
commit 9d4babaf52e3ca36fea0151d10684869ddfa436c (HEAD -> work-use-mv)
Date: Fri Jun 2 19:07:50 2023 +0900
mv
rename index.php => test/index2.php (100%)
commit 8ae58d6d4106f4b98715657013e3eef568375e4c (master)
Date: Fri Jun 2 18:59:01 2023 +0900
Initialize
create mode 100644 index.php
git mvをする
一旦、 git switch master
をし、同じことを新しく作成する作業ブランチでも実施する。git switch -c work-git-mv
で作業ブランチに切り替える。
git status
を見てみると、
On branch work-git-mv
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
renamed: index.php -> test/index2.php
今度は、リネームされた扱いになっているようだ。
(※git add .
, git commit
でコミットまでしておく。)
git show
Author: horiba <horiba@DESKTOP-M2SDB0M>
Date: Fri Jun 2 19:14:42 2023 +0900
gitmv
diff --git a/index.php b/test/index2.php
similarity index 100%
rename from index.php
rename to test/index2.php
リネームとなっている。
履歴を確認してみる。
git log --summary --follow test/index2.php
commit 5903d98677ed201d2349b6edffaa5e06d2e2b263 (HEAD -> work-git-mv)
Date: Fri Jun 2 19:14:42 2023 +0900
gitmv
rename index.php => test/index2.php (100%)
commit 8ae58d6d4106f4b98715657013e3eef568375e4c (master)
Date: Fri Jun 2 18:59:01 2023 +0900
Initialize
create mode 100644 index.php
良さそう。
参考
- Gitはファイルのリネームをどう扱うか
https://zenn.dev/yoichi/articles/how-git-handles-renaming
おわりに
mv
でもリネーム扱いになっていることに驚き。
以前、プロジェクトの階層をまるごと下げたときはだめだったので、なにか問題があったのかな。
リネームとして検出できないときは、git mv
を使ってみるのが良さそうだ。