まず、git filter-branch
歴史を書き直すことを意図しており、別の歴史と並行して歴史を作成することはありません。filter-branch
マージして操作を終了した場合は、それを正しく使用していません。
これは確かに混乱を招く可能性があります。歴史の 1 つの線が表示されることもあれば、別の線が表示されることもあります。同じ変更を行う履歴の行が複数ある場合はいつでも、それは悪いことです。特定の変更を導入したコミットを見つけようとしているbisect
やなどの操作を想像してみてください。blame
現在、実際には同じことを行う 2 つの歴史的なコミットがよくあります。どちらが必要ですか?
のような基本的な操作でさえgit log
、日付順の場合、「重複した」コミットが長時間実行されることがあります。明らかに望ましくない動作です。
より理想的な注意点として、このような小さな問題を修正するために履歴を書き直す必要があるでしょうか? git にはまさにこの状況のための機能があります: " mailmap ".
一般に、セキュリティ上の懸念がない限り、公開された履歴を書き換えることは避けるべきです (つまり、開示の問題...そして、一度秘密が公開されたら、可能であれば、単にその公開を制限するのではなく、秘密を無効にすることが最善です)。 、またはこのような状況で、悪い履歴が公開され、リポジトリが使いにくくなっています。
filter-branch
またはなどの履歴書き換えコマンドrebase
を公開された履歴に対して実行すると、git がローカル コミットを既存のアップストリーム コミットに「基づいている」と見なさなくなることに注意してください。このため、通常どおりにプッシュすると、次のようなエラーが発生します。
! [rejected] master -> master (non-fast forward)
したがって、プッシュを「強制」する必要がありますgit push -f
。applyに関する標準的な警告-f
(他の人のコミットを壊さないように注意してください) と、もちろん公開履歴の書き換えに関する警告です。
公開履歴の書き換えに関する警告は別として、並列履歴を作成せずに実際に書き換える限り、心配する必要はありません。完全を期すために、主な潜在的な問題の概要を見てみましょう。
- プッシュする前に新しい履歴にリベースしない既存のコピーを持つ人は、「非早送り」警告を受け取り、マージする必要があると想定する場合があります。
- 古い履歴を新しい履歴とマージしてプッシュすると、「古い」履歴が復元されます。
- 「古い」履歴からの ID をコミットするためのメーリング リスト、電子メールなどの古い参照は、もはや関連性がなくなります。
3 番目の点により、「古い」履歴のタグを有効にしておくことをお勧めします。これにより、commit-id に言及する歴史的な議論が引き続き有効な場所を指すようになります。ただし、そのタグが新しい開発に使用されないことが明確になるように、タグに名前を付けてください。