苦痛で死なずに、極性化された枝へのマージの影響をどのように元に戻すことができますか?
この問題は何ヶ月も私を悩ませてきましたが、ついにあきらめました.
2 つの名前付きブランチを持つ 1 つのリポジトリがあります 。AとB。
A に発生する変更は、必然的に B にも発生します。
B で直接発生する変更は、A で発生してはなりません。
このような構成では、「B」を「A」にマージすると、B へのすべての変更が A で行われたかのように A に表示されるため、リポジトリで悲惨な問題が発生します。
この状況から回復する唯一の「通常の」方法は、マージを「バックアウト」することです。つまり、次のようになります。
hg up -r A
hg backout -r BadMergeRev --parent BadMergerevBeforeOnA
後で正しい方向にマージすることを決定するまでは、これはすべて問題なくダンディに見えますが、あらゆる種類の厄介なことが発生し、特にブランチ B で消去/コメントアウトされたコードが突然消去またはコメント解除されます。
これまでのところ、「それをやらせてから、すべての問題を手作業で修正する」以外に、これに対する実用的な解決策はありませんでした。
問題を明確にする画像を次に示します。
【原画消失】
ファイル C & E (または変更 C & E ) は、ブランチ a ではなく、ブランチ b にのみ表示される必要があります。ここのリビジョン A9 (ブランチ a、revno 9) が問題の始まりです。
リビジョン A10 と A11 は、「バックアウト マージ」フェーズと「バックアウト マージ」フェーズです。
また、リビジョン B12 は水銀的であり、ドロップしないように意図された変更を誤って繰り返しドロップしています。
このジレンマは多くのフラストレーションと青煙を引き起こしました。私はそれを終わらせたいと思っています。
ノート
フックまたはポリシーのいずれかを使用して、リバース マージが発生しないようにすることが明らかな答えかもしれません。必然的にそれが起こると仮定して、それが起こったときにそれを解決できるようにします.
詳しく説明する
モデルでは、個別のファイルを使用しました。これらは問題を単純にします。これらは、別の行になる可能性のある任意の変更を表すだけです。
また、怪我に侮辱を加えるために、ブランチ A に実質的な変更があり、「ブランチ A の変更が、変更のように見える (そしてバックアウトされた) ブランチ B の変更と競合する」という問題が残ります。代わりにブランチ A で "
履歴書き換えのトリックについて:
これらすべての遡及ソリューションの問題は次のとおりです。
- 9000 件のコミットがあります。
- したがって、新たにクローニングするには30分かかります
- リポジトリの不良クローンがどこかに1 つでも存在すると、元のリポジトリに再び接触して、再びすべてをぶち壊す可能性があります。
- 誰もがこのリポジトリを既に複製しており、進行中のコミットで数日が経過しました。
- そのようなクローンの 1 つがたまたまライブ サイトであるため、「それを消去してゼロから始める」=「ビッグ ノノ」
(上記の多くは少しばかげていることは認めますが、私の制御の範囲外です)。
実行可能な唯一の解決策は、人々はすべて間違ったことをする可能性があり、そうするであろうこと、そしてこの間違いを「元に戻す」方法があることを前提とするものです。