Parece óbvio, mas: o objetivo dos números de versão é permitir que você determine facilmente qual versão do software alguém está executando.
Se houver alguma chance de alguém ter acesso a uma iteração específica do código e não conseguir determinar facilmente um identificador exclusivo, essa iteração deverá ter um número de versão exclusivo. Eu vejo isso como a 'primeira regra'. Como conseqüência, versões distintas desejarão claramente números de versão distintos.
No entanto, mais entra em jogo:
Uma maneira de ter certeza disso é aumentar os números de versão com cada confirmação, mas isso geralmente não é uma boa ideia. Pode levar várias confirmações / iterações para que uma alteração relativamente pequena funcione, e é confuso para o mundo externo ver a versão 0.0.1 -> 0.0.2 como resultado de um grande número de alterações acumuladas, em seguida, 0.0.2 -> 0.0 .56 porque alguém cometeu espaço em branco corrige um arquivo de cada vez e não alterou nada funcional.
A distância entre "uma versão por versão completa" e "uma versão para cada confirmação" depende realmente de você, dos outros usuários e de quais sistemas você está disposto a usar para preencher as lacunas.
Pessoalmente, estou acostumado a trabalhar em pequenos projetos e fico feliz em usar hashes git até uma versão usada por outras pessoas e uma versão melhorada para cada um deles (não importa o número de pessoas que espero colocar as mãos nele). No entanto, em empresas maiores e em projetos maiores, algo fora dos números das versões semânticas, mas uma fidelidade menor do que cada confirmação, como a numeração de candidatos a lançamento, é usada. Eles têm vantagens, mas aumentam a complexidade.