2017-05-30 6 views
0

私はfeatureブランチを間違ってマージしてreleaseに送り込みました。 その後、それを元に戻し、マージコミットの逆コミットを行い、エブリシングがうまくいった。Git revert merge commit、いくつかのファイルを失った

releasemasterにマージしようとすると、ファイルや奇妙な変更があることがわかりました。問題は、破損したマージが実際に私のmasterブランチにプッシュされたときに変わります。

復帰マージコミット(W1)を振り返ってみると、逆のコミットでファイルが削除されたファイルがすべて見つかります。 feature分岐がmasterにとにかくマージされようとしていることを念頭に

キーピングは、私が(W1)をコミットし、逆にコミットすることなく、そのマージが行われていただけのよう先に行き、その逆にmasterからリベース-iに考えていました。

もっと良い解決策があると思いますか?

ありがとうございました! :)すべての enter image description here

EDIT

まず、あなたの注意および応答に感謝します!状況をよりよく説明するために、写真にいくつかのものを追加しました。
実際には、図のreleaseブランチがなくなり、いくつかのファイルにしか影響がなく、大きな問題なしでmasterに存在する可能性があります。ファイルの追加と変更はmasterの間に行われ、releasefeatureの間に作成されます。

リリースマージ(M2)(W1)を削除した後、私はマスターブランチをリベースします。 releaseの履歴が失われていることはわかっていますが、実際にリリースされたコードを「保存」するより良いソリューションだと思っており、必要になった場合にはそこからレポを開始することができます。 リベースするコミットは1000件あり、いくつかの競合が発生しています。私は各ファイルの最新の正しいバージョンとのすべての明らかな競合を修正しています。

EDIT 2

は最後に、私たちはmasterブランチをリベースした後、「偽のリベース」のような枝の上部の違いを、適用され、この方法で変更が見えると変更可能です。

答えて

1

UPDATE:あなたの更新の質問に基づいて

ファイルの削除が発生した理由を、私は参照してください。それは私にとって状況の珍しい組み合わせのように思えます。最も興味深い点は、マージの復帰が、一見したように私には見えないより危険な操作であるということです。マージを元に戻す(それがプッシュされる前に履歴からクリアすることによって)元に戻すのが典型的な手順であり、プッシュ前に問題が検出された場合はこの種の問題を回避します。しかし、それは今ここであまり役に立ちません。

私はあなたが提案した履歴編集に対してまだ推奨しており、その編集に関する私のアドバイスはすべて私の元の回答に含まれています。releaseからコミットを編集する方法でmasterをrebaseした場合、releaseには元のコミットが残っているため、特定のマージ操作で競合する可能性がある奇妙でスプリントされた履歴があります(同じことを行うコミットが重複しているため) 。

M1からのすべての変更を履歴に戻したい場合は、W1を元に戻して頭痛の少ないようにすることができます。あなたはまだ一握りの対立を得るかもしれませんが、それははるかに簡単な手続きです。アップストリームのリベース問題を作成しません。あなたが道のりで衝突の少ない合併に遭遇するのを暴露します。


リリースブランチの履歴の編集を検討しているようです。私は、短期的な理由(「上流リベース」の再要求)と長期的な理由(リリースされたものはもはやリリースされたものを文書化しない)の両方でそれを薦めます。もちろん、私はあなたが提案しているものを誤解し、その者が共通の出発点に取得してみましょうしている可能性があります

あなたは現在

M1W1が戻った、 releasefeatureの誤マージした
O --- x --- x --- x --- M2 <--(master) 
\  \    /
    \  x --- M1 --- W1 <--(release) 
    \  /
    A ----- B --- C --- D <--(feature) 

のようなものを持っていますM1およびM2は、releasemasterの最終的なマージです。

私が理解しているように、すべてがプッシュされています。その一部はリリースバージョンの履歴に反映されています。また、「問題」コミットは既にmasterの共有履歴の一部です。だから、もし私がそれだったら、ほとんどすべてが "石で書かれている"と思うだろう。

あなたは最終的に、リリースブランチを「修正」するためにリベースを使用することを決定し、考慮すべき二つのものならば:

1)それはように、リリースブランチ履歴からM1W1を削除するのが最善だろう結果として得られるツリーは、あなたがリリースしたツリーの正しい反映です。新しいreleaseを使用してM2マージ(M2'の作成)をやり直す必要があるだろう、ということ(私は最終的にM1から仕事が再導入されることを認識し、それはあなたが解放するものではありません。)

2)を行ってましたその後、masterと、からM2に、M2'に分岐したものをすべてリベースしてください。これがアクティブなレポであれば、迅速にスパイダーウェブにすることができます。

それで私はそうしませんでした。だから何をすることができますか?

releaseはそれが必要として見て出てきた、とあなたはfeatureをマージしようとするまで、これはmaster上の任意の悪影響を持っているでしょうなぜそれは私には不明だように聞こえます。結局のところ、ファイルの削除がW1で行われた場合、そのファイルはM1で追加されている必要があります(releaseの観点から)ので、これをmasterに適用すると、通常は変更されません。 featureが含まれていないにもかかわらずmasterが乱れている場合は、その理由(およびその対処方法)を理解するためにさらに詳しい情報が必要になることがあります。

(またはfeatureがすでにマスタにreleaseをマージしようとし始めた時点でmasterにマージされている場合OTOHは、 - マージは混乱のように見えた理由を説明するだろう - そしてそれは、異なる解像度を必要とするものを私は以下の提案しました。)

でもあれば、それは質問から音として、あなたははまだfeatureを合併していないあなたはmasterfeatureをマージする試してくださいとき、それから、私はgitのが思うことを期待しますAおよびB (ファイルを最終的に追加した)は既にM1によって適用されています。 (W1のその後の変更は、それを元に戻すために起こるが、Gitはあまり注意していません。)私はあなたが必要と推測何

ABがやったん新しいコミットしています。 でこれを得ることができます。featureからM2(またはそれ以降はmaster)にリベースすることにより、頭痛が少しあります。問題は、masterがアップストリームであることをリベースすると、AB(これらは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 

のでCD重要ではありませんが得

git rebase --onto master feature-root feature 

gcが最終的にそれらを再利用する)、AおよびB(およびM1)は、歴史上一人のままです(最も問題のあるアップストリーam rebases)、featureのリファレンスを共有しているユーザーだけが、上流のリベース回復について心配する必要があります。

+0

返信ありがとう、私はあなたが言ったことを勉強して、私はメインポストで状況を少し良く説明した – gienini

関連する問題