Os modelos de dados internos são fundamentalmente diferentes.
Fundamentalmente, no SVN, quando você olha para o histórico de uma ramificação, vê apenas o que aconteceu nessa ramificação. Portanto, quando você mesclar de ramificação Bem ramificação A, o histórico da ramificação Aconterá uma confirmação grande contendo todas as alterações feitas explicitamente Bdesde que foram ramificadas.
Nas primeiras versões do SVN, se você tiver que mesclar ramificação Bem ramificação Amais uma vez, precisará especificar manualmente qual intervalo de revisão de ramificação Bdeseja mesclar para evitar mesclar as mesmas revisões duas vezes. É claro que o desenvolvedor inteligente usaria uma mensagem de confirmação como 'Mesclado em B: 1234'.
O SVN 1.5 "corrigiu" isso. Mas não mudou como as fusões são aplicadas fundamentalmente. Apenas adicionou alguns metadados extras à ramificação A, informando ao SVN que a revisão 1234 foi mesclada, permitindo que o SVN escolha automaticamente o intervalo de revisão correto.
Mas essa solução é basicamente uma solução alternativa para um modelo de dados que fundamentalmente não suporta o rastreamento do que foi mesclado.
Mesclar duas ramificações é um exemplo relativamente simples. Mas imaginar esse cenário mais complexo
- Crie uma ramificação
Ade trunke faça algumas confirmações aqui
- Criar ramo
Bde Ae fazer alguns commits aqui
- Faça algumas confirmações
trunkeA
- Mesclar
Bemtrunk
- Mesclar
AemB
- Mesclar
Aemtrunk
- Mesclar
Bem trunk(isso realmente não deve fazer nada)
Manipular isso corretamente usando o modelo de metadados se torna extremamente complexo (não sei se o SVN realmente manipula esse cenário corretamente e não me sinto inclinado a testá-lo).
Lidar com esse cenário no git é extremamente simples.
No git, toda vez que você confirma, o objeto interno que representa essa confirmação contém uma referência ao cabeçalho anterior. Quando você mescla um ramo, o commit contém referências ao cabeçalho anterior de todos os ramos que estão sendo mesclados (você pode mesclar mais de um ramo por vez no git)
Portanto, quando você examina o histórico de um único commit no git, pode ver todo o histórico, quando foi ramificado, quando foi mesclado e o histórico dos dois ramos entre a ramificação e a mesclagem.
Portanto, ao mesclar em uma ramificação parcialmente mesclada, é extremamente simples determinar o que já foi mesclado e o que não foi.
Não tenho experiência com Mercurial, mas suspeito que seu funcionamento interno seja semelhante ao git.
Então, fundamentalmente, para o SVN, era um objetivo do projeto tornar as ramificações baratas. Mas no git, era um objetivo do projeto tornar a fusão barata.
Por fim, da última vez que usei o SVN, ele não foi capaz de lidar com mesclagens, onde um arquivo foi renomeado em uma ramificação e modificado em outra.