2017-06-30 7 views
0

私は支店にいますfooと私はにdevelopをマージしたいと思います。すべての競合を自動的に解決し、支店内のコードを自動的に書いてください。foo支店fooから、私はgit merge -X theirs developを働かせます。ダブルチェックを2回行うと、Already up-to-dateとなります。`git merge -X theirs develop`の後のGit- rebaseの競合

しかし、を確認してfooを捕まえたら、マージの競合が発生します。 git merge -X theirs developマージですべてdevelopコードがfooに更新される必要があるのはなぜですか?

+1

「開発」を 'foo'にマージした場合、' git rebase development'をフォローして 'foo'が捕捉されていることを確認してください。そのようなマージを行うことの全ポイントは、 'foo'をキャッチすることです。 –

答えて

3

リベースとマージは全く異なることを行います。

あなたがにGitリポジトリを言っているgit merge developを実行します。

  1. は、現在のコミット(HEAD)を識別します。これにはハッシュIDがあります。
  2. 別のコミットを特定します。develop。これにはハッシュIDがあります。

    ...--o--B--o--1 <-- somebranch (HEAD) 
         \ 
          o--o--2 <-- develop 
    
  3. は#をコミットする(git diffのように)マージベースの比較:

  4. トレース最低共通の祖先マージベースは、手順1と2で識別される2つのコミットのコミットを見つけるために、グラフをコミット1。

  5. マージベースとコミット#2を比較します。
  6. これら2つの差分を結合します。 (この組み合わせのステップでは、-X theirsは違いがあります:2つの差分にマージの競合がある場合、Gitはそれらの変更を優先します。両方の変更を行います)。マージベースのツリーに結果を適用します。
  7. 現在のブランチ上の親(この順序で)#1、#2で、「コミットマージ」新しいタイプのコミットしてください:あなたが今、再び同じgit mergeを実行する場合

    ...--o--B--o--1---M <-- somebranch (HEAD) 
         \  /
          o--o--2 <-- develop 
    

GitはM2を見つけ、マージベースを見つけます(今度はBではなく2です)。何もしないと宣言します。マージベースはすでに2つのコミットのうちの1つです。から到達ではありません

  1. (このマージが行われた後、M)すべてのリストは、現在のブランチの先端から到達可能なコミットしてください:

    あなたがgit rebase developを実行すると、あなたがするGitリポジトリを言っています(#2をコミット)developで識別コミット:

    ...--o--B--o*-1*--M <-- somebranch (HEAD) 
         \  /
          o--o--2 <-- develop 
    

    私は*でこれらのコミットをマーク。注:MMからアクセスできますが、2ではアクセスできません。 git rebaseは意図的にすべてのマージをスローします。マージをリベースしようとすると意味がありません。すべてのコピーが正常に行われた後

    ...--o--B--o*-1*--M <-- somebranch 
         \  /
          o--o--2 <-- develop 
           \ 
            o*'--1*' <-- HEAD 
    
  2. (:名前developで識別コミットした後に新しいコピーを配置する「戸建HEAD」モード、コピー(下記参照)マークコミットをして、使用

  3. ...--o--B--o--1---M [abandoned] 
         \  /
          o--o--2 <-- develop 
           \ 
            o'--1' <-- somebranch (HEAD) 
    
  4. が今どこからsomebranchラベルを削除し、コピーしたコミットの最後に置き、)任意の競合をマージ解決を含みます

コミットをコピーするには、本質的に(場合によっては文字通り)git cherry-pickを実行します。チェリーピック操作は、それ自体がマージの「動詞の種類」です(少し独特のマージベースであり、「私たち」と「彼」もコメントとして混乱する可能性があります)。したがって、これらの各コピーは、多くのコミットがコピーされるため、コンフリクトをマージすることができます。 Mで行った解決方法は無視されます(当然、M自体は無視されるため)。

+1

コピーベースのリベースはマージベースとしてリベースされたコミットの親、リレーションされたコミットを "自分"のヒント、新しいベースを "私"のヒントとして使用してマージすることを明示的に指摘しておきますか? – jthill

+1

@jthill:おそらく...私は時々過度に長い答えにいくつかのプッシュバックを得るので、私は思っています:-) – torek