1. ホーム
  2. git

[解決済み] Git でのファイル名変更の扱い

2022-03-20 07:24:56

質問

を読んだことがあります。 Git でファイル名を変更する 変更をコミットし、リネームを実行した後、リネームしたファイルをステージングする必要があります。Git はそのファイルを新しい未追跡ファイルとして見るのではなく、内容から認識し、変更履歴を保持します。

しかし、今夜はこれだけでは、結局 git mv .

> $ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#    modified:   index.html
#

でスタイルシートの名前を変更しました。 ファインダー から iphone.css から mobile.css :

> $ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#    modified:   index.html
#
# Changed but not updated:
#   (use "git add/rm <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#    deleted:    css/iphone.css
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#    css/mobile.css

つまり、Git は私が CSS ファイルをひとつ削除し、新しいファイルを追加したと考えているのです。これは私が望んでいることではありません。リネームを元に戻して、Gitに作業をさせましょう。

> $ git reset HEAD .
Unstaged changes after reset:
M    css/iphone.css
M    index.html

私は、最初の場所に戻ってきました。

> $ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#    modified:   index.html
#

を使ってみましょう。 git mv の代わりに

> $ git mv css/iphone.css css/mobile.css
> $ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#    renamed:    css/iphone.css -> css/mobile.css
#
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#    modified:   index.html
#

どうやら問題なさそうだ。では、なぜ最初にFinderを使ったときに、Gitはリネームを認識しなかったのでしょうか?

解決するには?

対象 git mv マニュアルページ は言う。

正常に終了すると、インデックスが更新されます。 [...]

そのため、最初は自分でインデックスを更新する必要があります。 (を使用して)。 git add mobile.css ). しかし git status は、依然として2つの異なるファイルを表示します。

$ git status
# On branch master
warning: LF will be replaced by CRLF in index.html
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       modified:   index.html
#       new file:   mobile.css
#
# Changed but not updated:
#   (use "git add/rm <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       deleted:    iphone.css
#

を実行することで、異なる出力を得ることができます。 git commit --dry-run -a という結果になります。 を期待します。

Tanascius@H181 /d/temp/blo (master)
$ git commit --dry-run -a
# On branch master
warning: LF will be replaced by CRLF in index.html
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       modified:   index.html
#       renamed:    iphone.css -> mobile.css
#

なぜ、このような違いが出てくるのか、その理由を正確に説明することはできませんが の間に git statusgit commit --dry-run -a しかし 以下は Linusからのヒント :

<ブロッククオート

git は本当に何もしません。 気遣い については 内部的にリネームの検出が可能であり、コミットする際に リネームを行ったことは、そのリネームとは全く関係なく に使用するヒューリスティック 見せる リネームができる。

A dry-run は実際のリネームメカニズムを使用するのに対し git status おそらく、そうではないでしょう。