Espero que o Git crie uma confirmação de mesclagem quando eu mesclar uma tag assinada ou anotada, mas, em vez disso, ele avança rapidamente o ponteiro da ramificação. Estou usando o Git versão 2.17.0 no openSUSE Tumbleweed que vem com ele.
De acordo com a página de manual git-merge(1)
dele, deve-se criar um merge commit no caso de mesclar uma tag assinada/anotada:
--no-ff Cria uma confirmação de mesclagem mesmo quando a mesclagem é resolvida como um avanço rápido. Este é o comportamento padrão ao mesclar uma tag anotada (e possivelmente assinada) que não está armazenada em seu lugar natural em refs/tags/hierarquia.
A sequência de comandos que emiti é assim:
git init foobar
cd foobar
git commit --allow-empty -m 'Empty root commit'
git checkout -b feature
git commit --allow-empty -m 'Feature one commit ahead of master'
git tag -a -m 'Feature ready for non fast-forward merge' ready-to-merge-feature
git checkout master
git merge ready-to-merge-feature
Infelizmente e inesperadamente, a mesclagem da tag anotada ready-to-merge-feature
resulta em uma mesclagem de avanço rápido em vez de criar uma confirmação de mesclagem. O mesmo comportamento inesperado que observo com uma tag assinada em vez de anotada.
Minhas suposições estão erradas? Estou fazendo algo errado? Qual seria uma solução?
Observe a parte da página de manual que você citou que coloquei em negrito abaixo:
Com a sequência de comandos que você forneceu, a tag estaria em seu lugar natural, portanto, as condições para esse padrão não se aplicariam.
Este padrão foi implementado para ajudar a buscar uma tag de um repositório de contribuidores como
FETCH_HEAD
no repositório do mantenedor. Essas tags provavelmente serão efêmeras, portanto, se tiverem conteúdo (uma anotação e/ou assinatura), geralmente é bom preservar essas informações em um commit de mesclagem. Porém, as tags que járefs/tags/
estão em andamento provavelmente farão parte do estado permanente do projeto e, portanto, o conteúdo deve permanecer disponível sem precisar ser transferido para um commit.A solução mais simples provavelmente seria usar explicitamente a
--no-ff
opção.