UPDATE:あなたの更新の質問に基づいて
ファイルの削除が発生した理由を、私は参照してください。それは私にとって状況の珍しい組み合わせのように思えます。最も興味深い点は、マージの復帰が、一見したように私には見えないより危険な操作であるということです。マージを元に戻す(それがプッシュされる前に履歴からクリアすることによって)元に戻すのが典型的な手順であり、プッシュ前に問題が検出された場合はこの種の問題を回避します。しかし、それは今ここであまり役に立ちません。
私はあなたが提案した履歴編集に対してまだ推奨しており、その編集に関する私のアドバイスはすべて私の元の回答に含まれています。release
からコミットを編集する方法でmaster
をrebaseした場合、release
には元のコミットが残っているため、特定のマージ操作で競合する可能性がある奇妙でスプリントされた履歴があります(同じことを行うコミットが重複しているため) 。
M1からのすべての変更を履歴に戻したい場合は、W1を元に戻して頭痛の少ないようにすることができます。あなたはまだ一握りの対立を得るかもしれませんが、それははるかに簡単な手続きです。アップストリームのリベース問題を作成しません。あなたが道のりで衝突の少ない合併に遭遇するのを暴露します。
リリースブランチの履歴の編集を検討しているようです。私は、短期的な理由(「上流リベース」の再要求)と長期的な理由(リリースされたものはもはやリリースされたものを文書化しない)の両方でそれを薦めます。もちろん、私はあなたが提案しているものを誤解し、その者が共通の出発点に取得してみましょうしている可能性があります
あなたは現在
M1
が
W1
が戻った、
release
に
feature
の誤マージした
O --- x --- x --- x --- M2 <--(master)
\ \ /
\ x --- M1 --- W1 <--(release)
\ /
A ----- B --- C --- D <--(feature)
のようなものを持っていますM1
およびM2
は、release
とmaster
の最終的なマージです。
私が理解しているように、すべてがプッシュされています。その一部はリリースバージョンの履歴に反映されています。また、「問題」コミットは既にmaster
の共有履歴の一部です。だから、もし私がそれだったら、ほとんどすべてが "石で書かれている"と思うだろう。
あなたは最終的に、リリースブランチを「修正」するためにリベースを使用することを決定し、考慮すべき二つのものならば:
1)それはように、リリースブランチ履歴からM1
とW1
を削除するのが最善だろう結果として得られるツリーは、あなたがリリースしたツリーの正しい反映です。新しいrelease
を使用してM2
マージ(M2'
の作成)をやり直す必要があるだろう、ということ(私は最終的にM1
から仕事が再導入されることを認識し、それはあなたが解放するものではありません。)
2)を行ってましたその後、master
と、からM2
に、M2'
に分岐したものをすべてリベースしてください。これがアクティブなレポであれば、迅速にスパイダーウェブにすることができます。
それで私はそうしませんでした。だから何をすることができますか?
release
はそれが必要として見て出てきた、とあなたはfeature
をマージしようとするまで、これはmaster
上の任意の悪影響を持っているでしょうなぜそれは私には不明だように聞こえます。結局のところ、ファイルの削除がW1
で行われた場合、そのファイルはM1
で追加されている必要があります(release
の観点から)ので、これをmaster
に適用すると、通常は変更されません。 feature
が含まれていないにもかかわらずmaster
が乱れている場合は、その理由(およびその対処方法)を理解するためにさらに詳しい情報が必要になることがあります。
(またはfeature
ががすでにマスタにrelease
をマージしようとし始めた時点でmaster
にマージされている場合OTOHは、 - マージは混乱のように見えた理由を説明するだろう - そしてそれは、異なる解像度を必要とするものを私は以下の提案しました。)
でもあれば、それは質問から音として、あなたはがはまだfeature
を合併していないあなたはmaster
にfeature
をマージする試してくださいとき、それから、私はgitのが思うことを期待しますA
およびB
(ファイルを最終的に追加した)は既にM1
によって適用されています。 (W1
のその後の変更は、それを元に戻すために起こるが、Gitはあまり注意していません。)私はあなたが必要と推測何
はA
とB
がやったん新しいコミットしています。 でこれを得ることができます。feature
からM2
(またはそれ以降はmaster
)にリベースすることにより、頭痛が少しあります。問題は、master
がアップストリームであることをリベースすると、A
とB
(これらはmaster
から到達可能であるため)をスキップします。したがって、アップストリームを強制的にコミットする必要があります。O
。
ですから(feature-root
言う)O
のためのSHA値を検索、またはそれにタグを入れることができ、その後
A' --- B' --- C' --- D' <--(feature)
/
O --- x --- x --- x --- M2 <--(master)
\ \ /
\ x --- M1 --- W1 <--(release)
\ /
A ----- B --- C --- D
のでC
とD
重要ではありませんが得
git rebase --onto master feature-root feature
(gc
が最終的にそれらを再利用する)、A
およびB
(およびM1
)は、歴史上一人のままです(最も問題のあるアップストリーam rebases)、feature
のリファレンスを共有しているユーザーだけが、上流のリベース回復について心配する必要があります。
返信ありがとう、私はあなたが言ったことを勉強して、私はメインポストで状況を少し良く説明した – gienini