A última vez que vimos como alterar o código em um commit copiado cria o perigo de um conflito que permanece silencioso até que ambas as cópias se fundam em algum lugar, o que pode acontecer em um futuro muito distante. Mas você sabe o que é pior do que um conflito de fusão?
A ausência de qualquer conflito.
Vamos voltar à velha situação:

Vamos imaginar que o branch "feature" já existe há muito tempo e é periodicamente mesclado com o "master". O diagrama mostra um instantâneo da árvore logo após a última fusão A. Estamos trabalhando em um sprint em "recurso" cheio de novas funcionalidades.
Suponha que a linha "apple" esteja no arquivo de configurações que controla algum recurso. Ambas as ramificações confirmam confirmações M1 e F1, que não tocam neste arquivo.
Agora vamos imaginar que encontramos um erro sério em um recurso antigo que destrói completamente o comportamento de todo o programa. Parando abruptamente o problema, desligamos o recurso alterando a linha para "berry" e consolidando as alterações como F2.
Na vida, algo como mudar a linha c vai acontecer
#define IS_FEATURE_ENABLED 1
sobre
#define IS_FEATURE_ENABLED 0
Mas desde que comecei a usar "apple" e "berry", deixe que continuem assim.
, , , "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) .
" , ", . , , , .
Se você tiver o cuidado de não tocar nas linhas envolvidas na cópia, as expectativas se tornarão realidade. Caso contrário, em vez de mesclar, você obterá as alterações sobrepostas umas às outras. Pior, se suas alterações desfizerem as copiadas, você nem mesmo obterá um conflito de mesclagem para mostrar que algo está errado. Em nossa equipe, chamamos isso de problema ABA porque primeiro, a linha continha A, depois foi alterada para B, B foi copiado e, em seguida, retornou para A pouco antes da fusão em "mestre".
Bem, em resumo, queríamos fazer uma mesclagem parcial de "recurso" para "mestre", mas o problema é que não há uma mesclagem "parcial".
Ou existe?
No próximo artigo, mostrarei como fazer isso.