La dernière fois que nous avons vu comment changer le code dans un commit copié crée le danger d'un conflit qui se tient tranquillement jusqu'à ce que les deux copies fusionnent quelque part, ce qui peut arriver dans un futur très lointain. Mais vous savez ce qui est pire qu'un conflit de fusion?
L'absence de tout conflit.
Revenons à l'ancienne situation:

Imaginons que la branche "fonctionnalité" existe depuis longtemps et qu'elle est périodiquement fusionnée avec "master". Le diagramme montre un instantané de l'arborescence juste après la dernière fusion A. Nous travaillons sur un sprint en «fonctionnalité» plein de nouvelles fonctionnalités.
Supposons que la ligne «pomme» se trouve dans le fichier de paramètres qui contrôle certaines fonctionnalités. Les deux branches commit commettent M1 et F1, qui ne touchent pas ce fichier.
Imaginons maintenant que nous ayons trouvé une erreur grave dans une ancienne fonctionnalité qui détruit complètement le comportement de l'ensemble du programme. Pour arrêter brusquement le problème, nous désactivons la fonctionnalité en changeant la ligne en «berry» et en validant les modifications en F2.
Dans la vie, quelque chose comme changer la ligne c se produira
#define IS_FEATURE_ENABLED 1
sur
#define IS_FEATURE_ENABLED 0
Mais depuis que j'ai commencé à utiliser "apple" et "berry", laissez-les rester ainsi.
, , , "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) .
" , ", . , , , .
Si vous faites suffisamment attention à ne pas toucher les lignes impliquées dans la copie, les attentes deviendront réalité. Sinon, au lieu de fusionner, vous obtiendrez des modifications superposées les unes sur les autres. Pire encore, si vos modifications annulent celles copiées, vous n'obtiendrez même pas un conflit de fusion pour montrer que quelque chose ne va pas. Au sein de notre équipe, nous appelons cela le problème ABA car d'abord la ligne contenait A, puis elle a été changée en B, B a été copié, puis retournée à A juste avant la fusion dans "master".
Bref, nous voulions faire une fusion partielle de «fonctionnalité» vers «maître», mais le problème est qu'il n'y a pas de fusion «partielle».
Ou y a-t-il?
Dans le prochain article, je vais vous montrer comment le faire.