2017-10-05 6 views
1

私のシナリオ:私はブランチAから作成されたブランチBを持っています。私はブランチBでブランチCを選択します)。私はAからの特定のものがそこに入ることを望まないので、BをCにマージするのは嫌です。git cherry-pick conflictに不要なコードが含まれています

私の問題:私がBのコミットのチェリーピックをするとき、私はブランチCに矛盾がある箇所があります。これは、ブランチBの紛争の変化のブロックAからのいくつかのものがそこにあります。

なぜ、私はBで直接追加されていないときにCで表示されているものを見ていますが、私はそのコミットを選んでいますか?私はこれが紛争に関係していると推測しています。なぜなら、Aからの何も来ていない、紛争のまわりのものだけが来ているからです。

下のスクリーンショットでは、赤い括弧内のすべてが元々Aにありましたが、Cには存在しません。実際に欲しいのは最後の行だけです。これはまた別のファイルでも起こりました。

enter image description here

答えて

1

桜摘みされる材料で矛盾がある場合には、Gitはそれがいつものと同じことを行います。マージベースバージョンで

  • ルック。
  • HEADバージョンをご覧ください。
  • マージされるバージョンを見てください。

あなたは(私は)diff3merge.conflictStyleを設定する場合は、紛争地域で、むしろわずか2これら3のよりも、すべての3つのバージョンが表示されます。私はこれがGitの見た目を知るのに役立つことがわかりました。

なぜ私はBで直接追加されず、コミットを選んでいるときにCでの表示から何かを見ていますか?私はこれが紛争に関係していると推測しています。なぜなら、Aからの何も来ていない、紛争のまわりのものだけが来ているからです。問題は、Gitはマージベースは「何が変わっ」 - これは "あなたの現在にマージベースを比較した結果であるかHEADコミットして決定するためにコミット見つけなければならないということである。正しいのです

彼らが変更したもの "は、マージベースを"それらの "コミットと比較した結果です。

あなたは、このすべての最初に「枝」を述べた:

を私はブランチAのオフに作成された分岐Bを持っている私はチェリーピックしたいブランチBでのいくつかのコミットを作ります(これはAに類似している)ブランチCに入る。

実際、Gitはほとんどブランチを気にしません。 Gitはを気にするだけです。 - ブランチは主にGitに関係しているので、ブランチ名によってGitは個々のコミットを見つけることができます。これは、実際のコミットを引き出すのに役立ちます(そして、あなたが好きなら、私たち-およびこれらのコミットをGitの-見つけてみましょう分岐ラベルを含める):

   H--I--J <-- branch-B 
      /
...--E--F--G <-- branch-A 
     \ 
     K--L <-- branch-C 

私は全体の布から、このグラフのアップを行った、とあなたのグラフに似ているかもしれませんが、これで奇妙な方法を説明することができますgit cherry-pick Git内部のマージベースコミットを識別します。

git statusのように「ブランチC」の場合、HEADコミットはコミットL、ブランチCの先端です。私たちは、その後git cherry-pick <hash-of-commit-I>を実行すると、Gitはこれらの割り当てを行います

  • マージベース=コミットH
  • HEADまたは--oursは= L
  • --theirs =私は

Gitはその後、デフ(意志コミットコミットgit diffのように)コミットHコミットに対してI彼らは何をしたのかを見てみましょう。それは私たちが選ぶことを望む桜ですが、 diff commit Hに対してコミットL、何を参照するかが変更され、競合が検出されました。

競合がある場合は、Gitは、両側が実際に私たちは基本バージョンH自体をマージ表示せずに、マージベースバージョンHに何をしたか私たちに示しています。これには、望ましくないものが含まれます:HからLに「後方に」移動して「削除」したもの。 GitはマージベースのバージョンHも表示していましたが、望ましくないものを「削除」していることが分かりました。

関連する問題