コピーをやめて、マージする時が来ました。パート2。決して起こらなかった(しかし起こったはずの)マージの競合

前回我々はコピーにコードを変更する方法を説明しましたが、両方のコピーが非常に遠い将来に発生する可能性がどこかを、マージされるまで静かに座っている紛争の危険がありますコミット。しかし、マージの競合よりも悪いことを知っていますか?







競合がないこと。







古い状況に戻りましょう:







最初の木







「機能」ブランチが長い間存在していて、定期的に「マスター」にマージされていると想像してみてください。この図は、最後のマージ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に戻されました。







つまり、「機能」から「マスター」への部分的なマージを実行したかったのですが、問題は「部分的な」マージがないことです。







それともありますか?







次の記事では、その方法を紹介します。








All Articles