Gitは、問題の2つのツリー(またはgit merge
を含まない場合は1つのツリーとインデックス)を比較することによって、「事後」の名前を常に検出します。
いずれにしても、git merge
は、マージ検出が有効なgitの内部差分を実行し、それ以外の場合はデフォルトの類似性インデックスを50%に設定します(ただし、構成しない限り)。 同様に、git diff
にはいくつかのデフォルト値があり、これも設定可能です。マージベースとアップストリームの間で手動でgit diff --find-renames -M50%
を実行すると、おそらく問題ありません(ただし、構成については脚注1を参照してください)。
git がでリネームされていない場合は、リネーム検出のしきい値を調整したり、gitで考慮する必要があるファイル数を増やしたりする必要があります。これらのうちの最初は、-X
オプションのrename-threshold
値です(rename-threshold
はgit 1.7.4ではじめて登場しました)。詳細については、the documentationを参照してください。
あなたはリネーム検出の面で考慮すべきファイルの数にmerge.renameLimit
を設定することができます。これを設定しないと、現在のデフォルトは1000ファイルです(ただし、デフォルトでは時間の経過とともに変更されています)。また、設定しない場合、マージではdiff.renameLimit
を使用します。したがって、2番目のものだけを設定し、両方の値をdiffとmergeで使用することができます。
ファイルリネームの検出方法はちょっと複雑ですが、例で説明するには簡単です。 gitがコミット12345
とコミット67890
を比較し、12345
に、パス名がA
、B/C
、およびD
のファイルがあると仮定します。 67890
には、パス名B/gronk
,B/C
およびD
があります。つまり、パスA
はなくなりましたが、新しいパスB/gronk
が出現しました。Gitはそのようなパス(リネーム制限値まで)を記憶し、12345:A
の内容と67890:B/gronk
の内容を比較します。ファイルが "十分に似ている"場合、の名前が67890:B/gronk
に変更されたことを宣言します。
gitがファイルが50%、75%など、どのように似ている/異なるのかを正確に判断する方法は不明です。私は、たとえ類似したインデックスが行ではなく "チャンク"に基づいているのを見てきました(ただし、通常のdiff出力は行指向です)。
マージ時に競合が発生しますか?通常、Gitはファイルが移動されたことを理解するのに十分なほど巧妙です。単に 'git merge origin/master'(またはあなたの上流のブランチが呼び出されたもの)を実行するとどうなりますか? – knittl