Por que o Git tem tags?

8

Eu li Git ramificação e marcação de melhores práticas e comentários de marcação git - melhores práticas , mas eu não ver uma resposta direta a algo que eu quis saber por um longo tempo:

Por que o Git tem tags? (em vez de apenas ramificações)

Eles parecem ser cidadãos de segunda classe, ou pelo menos "diferentes". Eles não são enviados a menos que você especifique isso explicitamente. Exclusões de tags remotas não causam exclusão em repositórios a jusante.

Esse último ponto foi um problema recentemente, pois alguém colocou um monte de tags de lixo com toneladas de confirmações de outro repositório. Nós poderíamos excluí-los a montante e obter as confirmações, mas isso não se propagaria, e da próxima vez que alguém pressionasse uma tag git push --tags, eles repuseram essas tags e confirmações de lixo. Então tivemos que garantir que todos os excluíssem.

Quando e por que eu usaria uma tag em vez de uma ramificação?

Paul Draper
fonte
1
Por um lado, as tags podem ser anotadas, as ramificações não. Tags são geralmente coisas "permanentes" (normalmente para marcar versões específicas de um projeto).
Rufflewind

Respostas:

10

Isso é feito de propósito .

Eles parecem ser cidadãos de segunda classe, ou pelo menos "diferentes". Eles não são enviados a menos que você especifique isso explicitamente. Exclusões de tags remotas não causam exclusão em repositórios a jusante.

Não concordo com a resposta do lxrec sobre o git ter padrões ruins. Se você seguir a lista de discussão, poderá ver que os desenvolvedores do git realmente se preocupam em ter padrões sensíveis. Faria sentido ter --ff-onlycomo padrão? Acho que não.

As tags possibilitam anotações para sua própria cópia de desenvolvimento local. Eu não gostaria de ver minhas tags why_does_it_break_heree todo_fix_formattingserem enviadas sem meu consentimento (esses não são nomes de tags reais). A identificação de uma liberação, por outro lado, é algo que ocorre com menos frequência e faz sentido exigir um envio explícito (ou usar um alias).

Não vejo grande diferença entre tags e ramificações, como o comportamento de envio / busca se comporta. No seu exemplo, se as tags de lixo tivessem sido ramificações, a exclusão seria propagada como você pretendia?

Quando e por que eu usaria uma tag em vez de uma ramificação?

De um modo geral:

  • galhos são para árvores: apontam para diferentes commits ao longo do tempo
  • as tags são para confirmações individuais e são imutáveis ​​(isso inclui árvores congeladas, como liberações)
coredump
fonte
As tags anotadas e as anotadas assinadas (ou seja, aquelas que uma pessoa realmente usaria para, digamos, marcar uma liberação pública) são empurradas por padrão? São apenas tags "locais" não anotadas que não são enviadas por padrão, porque, como você disse, elas são locais .
Jörg W Mittag
@ JörgWMittag Não verifiquei, mas confio em você. Espere um minuto, isso significaria, que o git tem padrões sensatos ?!
Coredump
@ JörgWMittag Então, tentei localmente com dois repositórios em diretórios diferentes, e nem as tags anotadas nem as anotadas + assinadas foram empurradas. Isso ocorre com o git 1.8.2.
coredump
Ah espera. Acho que as tags anotadas e assinadas são enviadas automaticamente git push --tags, mas as tags locais não. Já faz um tempo desde que eu usei o git com raiva, isso foi muito antes do Git 1.0.
Jörg W Mittag
1

1) Por que os git tags são cidadãos de segunda classe?

Porque, infelizmente, o git tem muitos padrões ruins. Por mais que eu goste, simplesmente não é uma ferramenta muito intuitiva ou amigável para iniciantes. Quase todo mundo tem que configurar configurações ou aliases ou scripts do git que usem uma dúzia de opções - (como --ff-only) para fazer o git começar a se comportar da maneira que realmente deseja. Tags são apenas mais um exemplo.

2) Por que eu usaria uma tag git em vez de uma ramificação?

Uma ramificação destina-se a marcar uma confirmação na qual você faz outras confirmações. Quando você faz um novo commit nesse ramo, o próprio ramo "move" para que aponte para o novo commit.

Uma tag, por outro lado, marca um commit e depois marca esse mesmo commit para sempre (em teoria). O uso mais comum é a marcação de commits com suas versões de lançamento oficiais toda vez que você lança uma nova versão em produção.

Usamos ramos e tags para nossas versões de lançamento. A ramificação representa apenas a versão principal / secundária, enquanto as tags especificam versões de correção / compilação nessa versão principal / secundária. Portanto, se precisarmos aplicar uma correção de bug em uma versão antiga, simplesmente selecionamos a confirmação de correção de bug do master no ramo apropriado e, em seguida, identificamos a nova confirmação com o novo número de versão obtido durante a implantação.

Ixrec
fonte