Parece que file2.c deve ser:
int b=NULL;
int a;
em vez de uma cópia de file1.c .
Com essa alteração, o que podemos entender é que file0.c é um ancestral comum (a "base de mesclagem") para file1.c e file2.c , cada qual corrigindo metade do erro de usar NULL para inicializar int variables.
Se as alterações não estivessem tão próximas, poderíamos usar diff3 -m file1.c file0.c file2.c . Infelizmente, isso apenas produzirá um marcador de conflito.
No entanto, se sabemos que o que está acontecendo não é nada além de substituições de uma linha - ou seja, nenhuma linha está sendo adicionada, removida ou movida, apenas fixada no lugar - podemos obter os dois deltas 0-1 e 0-2 como ed script difere com diff -e . Podemos catenar esses scripts e usar ed para aplicá-los.
Primeiro, vamos fazer uma cópia do file0.c chamado test.c . Vamos tentar aplicar essas alterações em test.c :
$ cp file0.c test.c
Agora, vamos coletar as correções do estilo ed :
$ (diff -e file0.c file1.c ; diff -e file0.c file2.c) > patch
Como eles se parecem?
$ cat patch
1c
int b;
.
2c
int a;
.
Isso parece muito com os comandos corretos para transformar test.c no arquivo mesclado desejado. O que está faltando é o wq para salvar:
$ echo wq >> patch
Agora vamos tentar:
$ cat test.c
int b=NULL;
int a=NULL;
$ ed test.c < patch
ed test.c < patch
24
14
$ cat test.c
int b;
int a;
Feito.