2015-10-21 9 views
5

私はレポをフォークしてファイルAを変更しました。今度は、上流のレポのファイルAがサブディレクトリに移動しました。上流のレポをフォークに結合しようとしています。移動されたファイルの統合。

Gitは、ファイルAが元の場所で削除され、新しいサブディレクトリに新しいファイルが作成されたと思っています(これは、ファイルを上流に移動したためかもしれません)。

私は、コミットや物事の履歴を最小限に抑えながら、新しい場所でこのファイルに変更を加えたいと考えています。誰もこれを達成するための方法で私を助けてもらえますか?

+0

マージ時に競合が発生しますか?通常、Gitはファイルが移動されたことを理解するのに十分なほど巧妙です。単に 'git merge origin/master'(またはあなたの上流のブランチが呼び出されたもの)を実行するとどうなりますか? – knittl

答えて

5

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に、パス名がAB/C、およびDのファイルがあると仮定します。 67890には、パス名B/gronk,B/CおよびDがあります。つまり、パスAはなくなりましたが、新しいパスB/gronkが出現しました。Gitはそのようなパス(リネーム制限値まで)を記憶し、12345:Aの内容と67890:B/gronkの内容を比較します。ファイルが "十分に似ている"場合、の名前が67890:B/gronkに変更されたことを宣言します。

gitがファイルが50%、75%など、どのように似ている/異なるのかを正確に判断する方法は不明です。私は、たとえ類似したインデックスが行ではなく "チャンク"に基づいているのを見てきました(ただし、通常のdiff出力は行指向です)。

1

ファイルを移動するには、mvだけでなく、git mvを使用する必要があります。

gitはコンテンツのスナップショットを取るので、ファイル名(idxファイルにメタデータとして格納されています)は気にしません。

単にファイルを移動すると、gitは移動することを「理解」しませんし、新しいファイルとして扱います。

あなたの変更を元に戻す必要があり、その後、使用:

git mv <old path> <new path> 

今のgitの状態で使用すると、ファイルではなく1の削除と新しいものの創造の動きを見ることができます。

+2

これは間違っているか、少なくとも不完全です:gitは、2つのツリーを比較するとき、または内部diffコードに与えられたフラグに基づいてツリーとインデックスを比較するときに、 "事後"の名前を発見します。 'git status'コマンドは常に"名前を確認する "を設定しますが、' git diff 'と' git show'は '-M'、' --find-renames'、 '--no-renames'、 'diff.renames'と' diff.renamelimit')を使用して名前変更の検出機構を制御します。既にファイル名を変更しておけば、古いパスを 'git rm --cached'し、新しいパスを' git add'すると 'git mv'と同じ効果が得られます。 – torek

+0

ファイルを手動で移動していません。私は上流のレポを私と合併しようとしています。それは上流のレポで移動されます。 –

関連する問題