私が誰かの git リポジトリをフォークして、A、B、C、および D をコミットしたとします。私がフォークした人は、A と C をチェリーピックします。したがって、A' と C' になります。また、X、Y、Z のコミットを自分で作成します。結局のところ、私のブランチには ABCD があり、彼のブランチには A' C' XY Z があります。両方のブランチが公開されていると仮定すると、リベースは魅力的なオプションではありません。また、XYZ が ABC D のいずれとも競合しないと仮定します。これら 2 つのブランチを便利な方法でマージするにはどうすればよいですか? 単純にマージしてから、すべてを手動で解決する必要がありますか? マージされたヘッドのログに重複するコミット メッセージについてできることはありますか? これらの 2 つのブランチは、今後、互いのコミットをチェリー ピックすることによってのみ同期する運命にありますか?
2 に答える
ストレートマージが機能するはずです。Git は同一の変更セットを認識し、A/A' または C/C' をマージしようとしません。X、Y、または Z が A'/C' が変更された同じコードに触れた場合、特に B または D が同じコードに触れた場合は、競合を解決する必要があります。
いつでもgit merge --no-commit
結果を調べて、期待どおりかどうかを確認できます。
競合がない場合、単純なマージは明らかです。競合が発生した場合でも...
最初に彼の C' をマージすることができます。この段階での競合は、自明ではない場合、または少し順不同で適用された場合に、独自の変更を再適用することによるものです。あなたの C が B 上に構築され、彼の C' がクリーン コピーでなかった場合、または BCD のいずれかが A 上に構築されたため、彼の A' を再適用してももはや明らかなノーオペレーションではない場合などに発生する可能性があります。
詳細な競合調査をスキップして、バージョンを手動で受け入れるか、次のようにすることができます。
git merge --strategy=ours C'
次に、競合に注意を払いながら、残りをマージします。彼の XYZ が実際に ABCD のものに触れていない場合、これは競合することなく行われるはずです。彼が C を C' としてマージする際に何かおかしなことや間違ったことをして、C' をマージするときにそれを破棄した場合、それが戻ってきて、ここまたは将来いつでもあなたを噛む可能性があります。