2012-02-13 3 views
3

私は、関数a()を定義するファイルhello.phpを持っているとしましょう。2つのgitブランチは、ファイルの最後に関数を定義します。どうすればgitがそれらを組み合わせようとするのを防ぐことができますか(競合を起こす)?

ここで、ブランチ "b"は、ファイルhello.phpの最後に関数b()を定義しています。

一方、hello.phpの最後のブランチマスタでは、さらに開発が行われます。関数c()が定義されています。関数を定義

  • マスタ機能()とb()

を定義()及びC()

  • 分岐B:私は2つの分岐を有するこの時点で

    今、私がマスターしていて、bをそれにマージしようとすると、gitは関数b()とc()を結合しようとして、衝突の束を作ります(これは特に長い関数を解くのが難しい)。この場合、私はそれらをまったく組み合わせることは望ましくなく、さらに、c()がb()の前に定義されている場合や、c()の前にb()が定義されている場合は、実際には重要ではありません。

    ファイルの最後に修正が加えられたときには、前に来たものにかかわらず、最後に配置する必要があるので、ブランチbのマスターをマージすると関数a ()、関数b()、関数c();分岐bをマスタにマージすると、関数a()、関数c()、関数b()が得られます。

    ありがとうございます!

    Albert

  • 答えて

    2

    いいえこれは、競合を手動で解決するだけのシナリオです。

    ただし、作ることができる3ウェイ競合ディスプレイ、オンにしてみてください簡単に物事を解決することができます。

    $ git config --global merge.conflictstyle diff3 
    
    0

    あなたが別のものに1つのブランチを引くとマージツールを選択し、選択することができます分岐コードを使用する必要があります。

    私は思い

    Git checkout master 
    Git pull origin branch_b 
    Git mergetool 
    

    これは、あなたが使用するコードを決定するために「左」または「右」または両方を選択できるようにする必要があります。

    これまでのところ、まだ問題がある場合は、それに応じて更新してください。

    0

    diff3とマージツールが少し複雑すぎます。むしろ、私は次の手法を使用します:ファイルの最後にプレースホルダを追加する。たとえば、masterブランチでは、PHPファイルはと終わるかもしれない:

    ... 
    /* new code after this line */ 
    /* new code before this line */ 
    

    、二つの新しい枝は各これらの線の間にいくつかの新しいコードを追加することができます。新しいブランチが実際にマスタにマージされると、新しいブランチをマスタにマージしてから、最後の行の上にファイルの末尾に/* new code after this line */行を移動します。

    次に、新しいコードを定義した私の他のブランチをマージすることができます。

    結果的にgitは新しいコードを結合しようとせず、ブランチがマージされた順番で新しいコードをファイルの最後にきれいに置きます。

    関連する問題