2012-01-10 38 views
7

私たちはSVNから移行しており、ブランチのマージも行っています。大幅に簡素化するために、私たちはずっと前から分岐していたブランチBを持っていますが、少し開発が進んでいます。一方、巨大な変更がマスターに起こった: Git:小さな、しかし非常に古いブランチをマージするには?

A 
| 
X---(a few changes)--- B 
| 
|(hundreds of changes) 
| 
HEAD/master 

私はブランチから「gitのマージマスター」を行う場合

は、多くの競合が示され、マージ、BおよびHEADは現在、非常に異なっているので。しかし、これは間違っているように思えます。Bは胴体から遠く離れているわけではありません。

この事実を利用する方法はありますか?私は最初にBをXにマージし、そこからHEADにマージする必要がありますか?どのようなコマンドはに次のようになります。

を頭にその新しいマージされたバージョンからのX

  • アップデートとBとX
  • マージBの違いを参照してくださいリビジョンX
  • を特定です人々がこれらの状況で使用する別のアプローチがありますか?

    (恐らく私が前にあるいくつかの非常に愚かと非のgit-ようなことを言ってきた - 。それを指摘して自由に感じる:))

  • +1

    2つのブランチの間にパッチを作成して、現在のヘッドに適用しようとしましたか? XとBの間の –

    +0

    を意味しますか?それは私がやりたいことのように聞こえる。あなたは正しい命令で私を指揮することができますか? –

    +1

    あなたのために何がうまくいくかによって、いくつかの例がgit diff X..HEAD foo.cc> foo.patchまたはgit diff X..HEAD> all.patch –

    答えて

    2

    ポイントBから新しいブランチ「X」を作成しますマスターが分岐してからBをXにマージすることはあなたを助けません。それは単純に早送りマージです。文字通りの変更はありませんは、マージBがマスターになることによるコンフリクトになります。あなたの唯一の選択肢は、Bをマスターにマージし、競合を解決することです。紛争は彼らのものであり、彼らの周りには道がありません。

    +0

    最後に、あなたは正しいと思います。これが私が取ったアプローチです。良いツールは多くを助けるだろう。不思議なことに、Eclipseの紛争解決ツール(とにかくPyDevとか)は、一般的なMacの "opendiff"よりもあまり良くありませんでした。しかし、多くの紛争を管理し、何も紛失しないようにするのはかなり難しいです。良いテストケースも役に立ちます。 –

    +0

    @SteveBennett:テストは本当に素晴らしいですが、実際に古いコミットをマージしていると、追加されたテストはもう完了しない可能性があり、変更されたテストが間違った方法で変更される可能性があるためです。 – Cascabel

    +0

    マスタの上に古いブランチをリベースする方が簡単な場合があります。この方法では、古いコミットごとのマージ競合に対処しなければならず、単一のマージの結果としてのすべての古いコミットから生じる巨大な競合では動作しません。 –

    1

    もしそれが十分ではない場合は、HEADまたは少なくとも最新のバージョンに対して手動でパッチを書き直すことができます。これは紛争に対処するだけでなく、おそらくあなたが好きな歴史を残すだけでなく、マージ競合の一部ではないバグを回避するのに役立ちます。変更のもとでコードが変更されるために問題が発生する可能性は非常に高く、すべてが実際にマージ競合として現れるわけではありません。

    しかし、あなたはそれをmerge-yの方法で単独でやりたいのであれば、これらの紛争を何らかの形で処理しなければならないと言います。 が可能です。あなたは漸進的にそれを行うことで少しずつ痛みを払うことができます。私は徐々に前方分岐をリベースすることでこれを行う可能性があります:

    git rebase version-2 old-branch 
    # deal with conflicts if they happen 
    git rebase version-3 old-branch 
    # and so on... 
    # until old-branch is based on a recent version 
    git checkout master 
    git merge old-branch 
    

    これは効果的にあなたの代わりに一度にすべてを扱うのは、各ステップにおける小さな変化に対応させます。

    関連する問題