git mv
を使用してファイルを移動しました。ここで、新しいファイルに対してdiffを実行して、古いファイル(古い、現在は存在しない名前)と比較します。
どうすればいいですか?
-Mを使用して、Gitが差分のときに移動したファイルを自動検出できるようにする必要があります。前述のように、git diff
だけを使用しても機能しません。
単純に:git diff -M
で実行する必要があります。
このスイッチのドキュメントは次のとおりです。
-M[<n>], --find-renames[=<n>]
Detect renames. If n is specified, it is a threshold on the similarity index
(i.e. amount of addition/deletions compared to the file’s size). For example,
-M90% means git should consider a delete/add pair to be a rename if more than
90% of the file hasn’t changed.
knittlが書いた に加えて、いつでも使用できます:
git diff HEAD:./oldfilename newfilename
ここで、HEAD:./oldfilename
は、現在のディレクトリを基準にした(HEAD内の)最後のコミットのoldfilenameを意味します。
新しい十分なgitがない場合は、代わりに使用する必要があります。
git diff HEAD:path/to/oldfilename newfilename
Git 2.9(2016年6月)では、-M
を追加する必要はありません。 git diff
はデフォルトで-M
を使用します。
commit 5404c11 、 commit 9501d19 、 commit a9276a6 、 commit f07fc9e 、 commit 62df1e6 を参照してください(2016年2月25日)by Matthieu Moy(moy
) 。
( 浜野邦夫-gitster
- in commit 5d2a30d 、2016年4月3日)
diff
:デフォルトでdiff.renames
を有効にします名前の変更の検出は非常に便利な機能であり、新しいユーザーがこの機能を利用するためにドキュメントを掘り下げる必要はありません。
名前変更検出をアクティブにすることに対する潜在的な異論は、失敗することもあれば、遅くなることもあるということです。ただし、「
git status
」や「git merge
」などのいくつかのケースでは、名前変更検出はデフォルトですでに有効になっているため、diff.renames
を有効にしても基本的に状況は変わりません。名前変更の検出に失敗すると、「git diff
」と「git status
」の間で一貫して失敗するようになりました。この設定は配管コマンドには影響しないため、適切に記述されたスクリプトは影響を受けません。
git diff -M
は、他の人が言ったように名前変更検出を有効にします(そして@VonCが指摘したように、git 2.9からデフォルトで有効になります)。ただし、大きな変更セットがある場合、不正確な名前変更の検出が再びオフになる場合があります。 Gitは、次のような警告を表示します。これは、表示している差分の中で見落としがちです。
warning: inexact rename detection was skipped due to too many files.
warning: you may want to set your diff.renameLimit variable to at least 450 and retry the command.
その場合、たとえばgitが提案するように構成オプションを設定します
git config diff.renamelimit 450
diffコマンドを再実行します。
何らかの理由でHEAD:./oldfilename
(または絶対パス)を使用しても機能しませんでしたが、HEAD:oldfilename
は機能しました(cmnに感謝):
git diff HEAD:oldfilename newfilename
git diff 2a80f45:oldfilename f65f3b3:newfilename
HTH