The terakhir kali kita melihat bagaimana mengubah kode dalam disalin komit menciptakan bahaya konflik yang duduk dengan tenang sampai kedua salinan bergabung di suatu tempat, yang dapat terjadi dalam waktu yang sangat jauh. Tapi tahukah Anda apa yang lebih buruk dari konflik penggabungan?
Tidak adanya konflik apapun.
Mari kembali ke situasi lama:

Bayangkan bahwa cabang "fitur" telah ada sejak lama dan secara berkala digabungkan menjadi "master". Diagram menunjukkan snapshot dari pohon setelah penggabungan terakhir A. Kami sedang mengerjakan sprint dalam "fitur" yang penuh dengan fungsionalitas baru.
Misalkan baris "apel" ada di file pengaturan yang mengontrol beberapa fitur. Kedua cabang melakukan komit M1 dan F1, yang tidak menyentuh file ini.
Sekarang mari kita bayangkan bahwa kita telah menemukan kesalahan serius dalam fitur lama yang benar-benar menghancurkan perilaku seluruh program. Tiba-tiba menghentikan masalah, kami mematikan fitur tersebut dengan mengubah baris menjadi "berry" dan melakukan perubahan sebagai F2.
Dalam hidup, sesuatu seperti mengubah baris c akan terjadi
#define IS_FEATURE_ENABLED 1
di
#define IS_FEATURE_ENABLED 0
Tapi sejak saya mulai menggunakan "apel" dan "beri", biarkan mereka tetap seperti itu.
, , , "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) .
" , ", . , , , .
Jika Anda cukup berhati-hati untuk tidak menyentuh garis yang ada dalam salinan, harapan akan menjadi kenyataan. Jika tidak, alih-alih menggabungkan, Anda akan mendapatkan perubahan yang ditumpangkan di atas satu sama lain. Lebih buruk lagi, jika perubahan Anda membatalkan yang disalin, Anda bahkan tidak akan mendapatkan konflik penggabungan untuk menunjukkan bahwa ada sesuatu yang salah. Dalam tim kami, kami menyebutnya masalah ABA karena pertama baris berisi A, lalu diubah menjadi B, B disalin, dan kemudian dikembalikan ke A sebelum digabungkan menjadi "master".
Singkatnya, kami ingin melakukan penggabungan sebagian dari "fitur" ke "master", tetapi masalahnya adalah tidak ada penggabungan "sebagian".
Atau ada?
Di artikel berikutnya, saya akan menunjukkan cara melakukannya.