11

背景

こんにちは、私はローカル機能ブランチに取り組んでいます。このローカル ブランチは、多数の小さなコミットでめちゃくちゃになっています。ブランチをリモートにプッシュする前に、整理したいと思います。

このために、インタラクティブなリベースを行います。

git rebase -i

今のところ問題ありません。

問題

ここで難しい部分があります。機能の開発中に、名前の変更やファイルの移動など、いくつかのリファクタリングを行いました。名前を変更したファイルの履歴は、次のように名前を変更することで利用できます。

git -mv

しかし、rename-commit の前後にコミットを squash すると、履歴がなくなり、git はファイルの削除と追加として変更を通知します。

何が問題ですか?

ファイルの履歴を失うことなく、名前の変更を含むコミットを無効にするにはどうすればよいですか?

4

1 に答える 1

7

Git は名前の変更を直接追跡するのではなく、ファイルの内容を比較し、類似性によって名前の変更を検出します。

履歴をスカッシュすると、ファイルのすべての変更が 1 つのコミットにまとめられます。その後、ファイルは以前のコミットと比較して大幅に変更される可能性があります。したがって、以前のコミットとあまり似ておらず、git は削除/追加と見なします。

そのようなファイルの履歴を表示したい場合は、find-renamesしきい値を調整する必要があります。たとえば、50% の類似性を使用する場合

git log --follow --find-rename=50 -- someFile

diff、 、 にも同様のオプションがありmergeますrebase。ドキュメントを見てください:

git リベース

rename-threshold=n 名前変更の検出に使用される類似性のしきい値を制御します。git-diff 1 -M も参照してください。

git差分

--find-renames[=n]

名前の変更を検出します。n が指定されている場合、それは類似性指標 (つまり、ファイルのサイズと比較した追加/削除の量) のしきい値です。たとえば、-M90% は、ファイルの 90% 以上が変更されていない場合、Git が削除/追加のペアを名前変更と見なす必要があることを意味します。% 記号がない場合、数値は分数として読み取られ、その前に小数点が付きます。つまり、-M5 は 0.5 になり、-M50% と同じになります。同様に、-M05 は -M5% と同じです。検出を正確な名前変更に制限するには、-M100% を使用します。デフォルトの類似度指数は 50%です。

于 2015-02-19T12:44:16.530 に答える