web-dev-qa-db-ja.com

移動/名前変更されたファイルでgit diffを実行するには?

git mvを使用してファイルを移動しました。ここで、新しいファイルに対してdiffを実行して、古いファイル(古い、現在は存在しない名前)と比較します。

どうすればいいですか?

118
dr jerry

-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.
138
Zitrax

knittlが書いた に加えて、いつでも使用できます:

git diff HEAD:./oldfilename newfilename

ここで、HEAD:./oldfilenameは、現在のディレクトリを基準にした(HEAD内の)最後のコミットのoldfilenameを意味します。

新しい十分なgitがない場合は、代わりに使用する必要があります。

git diff HEAD:path/to/oldfilename newfilename
75
Jakub Narębski

Git 2.9(2016年6月)では、-Mを追加する必要はありません。 git diff はデフォルトで-Mを使用します。

commit 5404c11commit 9501d19commit a9276a6commit f07fc9ecommit 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」の間で一貫して失敗するようになりました。

この設定は配管コマンドには影響しないため、適切に記述されたスクリプトは影響を受けません。

この機能の新しいテストはこちら

18
VonC

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コマンドを再実行します。

1
mindriot

何らかの理由でHEAD:./oldfilename(または絶対パス)を使用しても機能しませんでしたが、HEAD:oldfilenameは機能しました(cmnに感謝):

git diff HEAD:oldfilename newfilename
git diff 2a80f45:oldfilename f65f3b3:newfilename

HTH

1
Oli Studholme