Esse problema é conhecido como mesclagem. Você tem um arquivo original A e duas versões modificadas B e C, e você quer fazer uma versão D que combine ambas as modificações. Isso só funciona se as alterações forem independentes; caso contrário, a mesclagem é um processo manual. O gerenciamento de mesclagens de alterações simultâneas no código-fonte é uma tarefa frequente na engenharia de software.
Em casos simples, um patch produzido por diff
já funcionará se o arquivo de origem for alterado. O utilitário patch
permite algum “fuzz”: se você fizer um diff de A para B, e as áreas afetadas por esse diff forem idênticas (mas possivelmente em diferentes deslocamentos no arquivo) em A e C, então o patch será aplicado limpamente em C. Isso funciona bem, desde que as áreas alteradas em B e C não estejam nos mesmos locais (deve haver uma separação de algumas linhas).
Quando os patches não se aplicam corretamente, a mesclagem é um problema difícil e específico do domínio. Por exemplo, considere estas duas alterações:
A B C
a=2 a=3 b=2
x=a x=a x=b
Os seres humanos tendem a identificar o padrão que B mudou 2
para 3
e C renomeou a
para b
, portanto, o resultado da mesclagem deve ser b=3
, x=b
. Mas as ferramentas automatizadas provavelmente marcarão a primeira linha como um conflito, porque ela foi modificada de duas maneiras diferentes.
Escrever um patch que “faz algo sensato” para B e C é um problema difícil (AI-completo). Em casos práticos, para muitas situações típicas, usar diff -u A B
como o patch tende a funcionar e produzir o D desejado de C, ou falhar com um erro declarando que o patch não se aplica de forma limpa.