最善の努力にもかかわらず、私たちは Git リポジトリのフィーチャー ブランチで非常に困難な状況に陥ってしまいました。最終結果はgit diff develop..feature-branch
、完全に予期しない差分が表示されることです。
たとえば、develop で追加された 1 つのファイルは、差分では削除として表示されます。他の多くのファイルも同様の問題を示しており、欠落しているもの、追加されているもの、多くの予期しない変更が多数あります。含まれているはずの一部のファイルdevelop
は、差分にも表示されません。プル リクエストを介してコードをレビューしたときに、Atlassian Stash の問題に最初に気付きました。保留中のマージは完全に正しくなく、マージ中の標準的な競合解決では解決できません。
この原因の解読を試みたところ、問題は開発者が既にオリジンにプッシュされたフィーチャー ブランチのコミットに対して数回のリセットを実行したことが原因であると考えられます。これは、プル リクエストのコード レビュー中に提案されたいくつかの変更を「元に戻す」ためのものでした。具体的には、これがイベントのタイムラインであると考えています。
- 開発から作成された機能ブランチ
- 機能ブランチで実行される作業
- Atlassian Stash で生成されたプル リクエスト (PR は問題ないように見えますが、いくつかのマイナーな編集が提案されています)
- 開発者はリセットを使用して一部の変更を元に戻し、それらを元にプッシュします
- 一方、開発ブランチと機能ブランチの間でマイナーな競合が見つかりました
- 開発者は、develop からの機能ブランチを更新して競合を調整し、オリジンにプッシュします
- プル リクエスト (diff) は、以前のものとは大幅に異なる予期しない diff を示します。コミットされると予想されるファイルが見つからない、またはその逆
- 「悪い」マージを元に戻して(リセットではなく元に戻して)、もう一度試してみます。ただし、PR/差分は、保留中のマージに対して同じ誤った変更を示しています
- その後、開発者が開発からの最初のマージの前にどこかでリセットを使用したことがわかりました。
そこで、質問が 3 つあります。
変更を正しく開発にマージできるように、修正された機能ブランチをどのように「回復」する必要がありますか? 私の考えは、リセット前に発生することが知られている機能ブランチのコミットから、新しい「良い」機能ブランチを作成することです。次に、必要なコミットを「悪い」機能ブランチから「良い」機能ブランチにチェリーピックして、再作成することができます。最後に、「良い」フィーチャー ブランチを開発にマージし、「悪い」フィーチャー ブランチを削除します。
「悪い」機能ブランチを開発にマージすると、ファイルの状態が正しくないことを除けば、他の「破損」が開発ブランチに漏れることになります。つまり、汚染された「悪い」機能ブランチは、開発ブランチとその下流の何かをさらに汚染しますか? もちろん、これを行う予定はありませんが、その影響を理解したいと思っています。
私が説明したようにリセットすると、私が見ている問題が発生しますか、それとも他の何かに関連している可能性がありますか?