前回我々はコピーにコードを変更する方法を説明しましたが、両方のコピーが非常に遠い将来に発生する可能性がどこかを、マージされるまで静かに座っている紛争の危険がありますコミット。しかし、マージの競合よりも悪いことを知っていますか?
競合がないこと。
古い状況に戻りましょう:
「機能」ブランチが長い間存在していて、定期的に「マスター」にマージされていると想像してみてください。この図は、最後のマージAの直後のツリーのスナップショットを示しています。新しい機能が満載の「機能」のスプリントに取り組んでいます。
「apple」という行が、いくつかの機能を制御する設定ファイルにあるとします。両方のブランチは、このファイルに触れないコミットM1とF1をコミットします。
ここで、プログラム全体の動作を完全に破壊する古い機能に重大なエラーが見つかったと想像してみましょう。問題を突然停止し、行を「berry」に変更し、変更をF2としてコミットすることにより、機能をオフにします。
人生では、線cを変えるようなことが起こります
#define IS_FEATURE_ENABLED 1
オン
#define IS_FEATURE_ENABLED 0
でも、「りんご」と「ベリー」を使い始めたので、そのままにしておきます。
, , , "master". , , , .
"master", "feature", .
, "master" . , F3 "feature" . :
"berry" M3 "master". "feature" "apple" F3.
"feature" "master" . :
M4, "berry". "master" ! , "master" : , . , . , "feature", "master" .
, .
:
Git (merge base): , . Git - (three-way merge), , M3 HEAD, F3 . , :
"master" "apple" "berry". "feature" . "apple" "feature", "master" . "master" "berry" .
, "master" "feature", "berry" "feature":
, . ( ) "apple", "feature" , "berry" "master". , (fast-forward) .
" , ", . , , , .
コピーに含まれる行に触れないように十分注意すれば、期待は実現します。それ以外の場合は、マージする代わりに、変更が互いにオーバーレイされます。さらに悪いことに、変更によってコピーされたものが取り消された場合、何かが間違っていることを示すためにマージの競合が発生することさえありません。私たちのチーム内では、これをABA問題と呼んでいます。最初に行にAが含まれ、次にBに変更され、Bがコピーされ、「マスター」にマージされる直前にAに戻されました。
つまり、「機能」から「マスター」への部分的なマージを実行したかったのですが、問題は「部分的な」マージがないことです。
それともありますか?
次の記事では、その方法を紹介します。