他の人がリポジトリ内の過去のコミットを見ていて、後でそれらを書き直した場合、問題が発生します。これは git の設計の一部にすぎません。
git は、コミットを書き換えたが最新のリポジトリを持っていることと、コミットを書き換えていないが、プッシュする前にマージする必要があるコミットを持っていることを実際に区別できません。最新のプッシュが検出される方法は、宛先 ref のすべてのコミットが、プッシュしている ref の履歴にあることを確認することです。これは早送りと呼ばれます。リベースすると、ローカル ブランチからコミットが削除され、新しい同様のコミットが作成されます。git は、これらの新しいコミットが履歴内の古いコミットと等しいことを確実に判断できず、保留中のマージと見なし、強制的にこれをオーバーライドして、宛先リポジトリに既にあるものをすべて上書きする必要があります。
したがって、強制すると、宛先にあるものは何でも上書きされます。これは仕様によるものです。さらに、あなたのリポジトリから引っ張ってきた他の人も、これが原因で問題に遭遇します。リポジトリ内のコミットの順序を反転するとしましょう:
A-------B-------C oldmaster
\
------C'------B' master
他のユーザーがローカルに oldmaster のコピーを持っていて、master からプルすると、git はこれら 2 つのブランチをマージしようとします。C'
これにより、とのパッチが二重に適用されますB'
。良くない。Git はマージ時にこれらの問題を検出できる場合がありますが、正しくマージされたとしても、次のような問題が残ります。
A-------B-------C------D master
\ /
------C'------B'----
そして今、リベースされたコミットが復活しました。
rebase を使用しても役に立ちません。あなたはちょうど同じように終わることができます:
A------B------C------C'------B'
このような単純なケースでは、git は二重に適用されたパッチを検出してドロップできる可能性がありますが、保証はされていません。
結論として、他の人に見えるようになったコミットをリベースしないでください。まだローカルに保持しているプライベート ブランチである場合、または「DEVELOPMENT BRANCH - MAY BE REBASED - DO NOT BASE WORK ON THIS BRANCH」という重大な警告があるパブリック ブランチである場合は、必要なすべてのリベースを実行してください。しかし、他の誰かがその上に構築している瞬間に、歴史をいじるのをやめてください。
複数のユーザーと常に履歴をいじる必要がある場合は、 StGIT 、 guilt、topgitなどを使用して、機能ブランチをパッチのバッグとして操作する方がよい場合があります。その後、それらをパッチとして使用し、必要に応じてパッチを並べ替えることができます (ただし、コミット自体は変更しないでください!)。その後、変更を上流にプッシュするときが来たら、パッチを元の上流ブランチの上に線形化します。