Práticas recomendadas de ramificação e marcação do Git

141

Atualmente, estou aprendendo a usar o Git lendo o Pro Git . No momento, estou aprendendo sobre ramificações e tags. Minha pergunta é quando devo usar uma ramificação e quando devo usar uma tag?

Por exemplo, digamos que eu crie uma ramificação para a versão 1.1 de um projeto. Quando terminar e liberar esta versão, devo deixar o ramo para marcar a versão? Ou devo adicionar uma tag? Se eu adicionar uma tag, devo excluir a ramificação da versão (supondo que ela seja mesclada na master ou em alguma outra ramificação)?

Code-Guru
fonte

Respostas:

162

Resumindo: a melhor prática é ramificar, mesclar com frequência e manter sempre sincronizado .

Existem convenções bem claras sobre como manter seu código em ramificações separadas da ramificação principal:

  1. Você está prestes a fazer uma implementação de mudanças importantes ou disruptivas
  2. Você está prestes a fazer algumas alterações que podem não ser usadas
  3. Você deseja experimentar algo que não tem certeza de que funcionará
  4. Quando você é instruído a se ramificar, outras pessoas podem ter algo que precisam fazer no mestre

Como regra geral, após a ramificação, você deve manter a sincronização com a ramificação principal. Porque, eventualmente, você precisa mesclá-lo de volta ao mestre. Para evitar uma bagunça enorme e complicada de conflitos ao mesclar novamente, você deve confirmar frequentemente, mesclar com frequência.

Boas práticas a seguir

Um modelo de ramificação Git bem-sucedido de Vincent Driessen tem boas sugestões. Se este modelo de ramificação lhe interessar, considere a extensão do fluxo para git . Outros comentaram sobre o fluxo .

Práticas de marcação

Como você já sabe, o Git fornece a você identificadores de confirmação como 1.0-2-g1ab3183, mas esses não são tags! A marcação é feita com a tag git, e as tags criadas usando a tag git são a base para os identificadores de confirmação que o git descreve cria. Em outras palavras, no Git você não codifica ramos. Você está marcando confirmações. É correto dizer que a tag é apenas um ponteiro anotado para uma confirmação.

Vamos olhar para o exemplo prático que o demonstrou,

                        / - [v1.0]
                       v
---. ---. --- .--- S ---.--- A <- mestre
                         \ 
                           \ -.--- B <- teste

Vamos confirmar 'S' ser confirmado, apontado pela tag 'v1.0'. Essa confirmação está na ramificação 'master' e na ramificação 'test'. Se você executar " git description " no topo do commit 'A' (no topo do ramo 'master'), obterá algo como v1.0-2-g9c116e9. Se você rodar "git description" em cima do commit 'A' (também conhecido como ramificação 'test'), você obterá algo como v1.0-2-g3f55e41, esse é o caso da configuração padrão do git-description. Observe que esse resultado é um pouco diferente. v1.0-2-g9c116e9significa que estamos no commit com o ID SHA-1 classificado 9c116e9, 2 confirma após o tag v1.0. Não há etiqueta v1.0-2!

Se você deseja que sua tag apareça apenas na ramificação 'master', é possível criar uma nova confirmação (por exemplo, atualizar apenas as informações da versão padrão / fallback em GIT-VERSION-FILE) após o ponto de ramificação da ramificação 'test'. Se você marcar commits no ramo 'test' com, por exemplo, 'v1.0.3`, isso seria visível apenas em' test '.

Referências

Encontrei muitos blogs e posts úteis para aprender. No entanto, os que são ilustrados profissionalmente são raros. Portanto, eu gostaria de recomendar um post - Um modelo de ramificação Git bem-sucedido por @nvie. Eu emprestei sua ilustração :)

insira a descrição da imagem aqui

EL Yusubov
fonte
4
1.0-2-g1ab3183 é um identificador construído pelo git description a partir das informações disponíveis no git, mas chamá-lo de identificador do git é um pouco demais. Git identificado pelo hash SHA; tags e branches são construções humanas que o git acompanha de maneira útil. Como tal, faça uma etiqueta quando achar que algum humano um dia desejará encontrar um marcador conveniente para um commit.
mabraham
2
uma maravilhosa ilustração da multidimensionalidade no universo git. bela. obrigado
Tope
É importante notar que muitos projetos não precisam de algumas das faixas mostradas neste diagrama. Alguns projetos precisam apenas do que é chamado de desenvolvimento e recurso aqui. Isso geralmente acontece com aplicativos da web que podem ser implantados à vontade.
usr
37

Uma ramificação será usada se você tiver 2 versões diferentes do repositório ao mesmo tempo. Uma tag é uma maneira de marcar um momento no seu repositório.

Você deve adicionar uma tag para marcar uma versão lançada. Se você precisar fazer correções de erros nessa versão, criaria uma ramificação na tag.

Você deseja excluir apenas os ramos que foram mesclados novamente no HEAD [ou algum outro ramo].

gam3
fonte
3
ah ... e suponho que você queira dizer que o ramo é mesclado em outro ramo, como mestre. HEAD se move toda vez que faço um checkout, certo?
Code-Guru
O HEAD normalmente aponta para um ramo (a menos que você esteja no modo HEAD desanexado), portanto o HEAD se move com o ramo que aponta para
LoicAG