Você deve olhar para o fluxo git . É um excelente (e popular) modelo de ramificação.
Resumo do fluxo Git
Ramificação
Os principais troncos que ficam para sempre são develop
e master
. master
mantém sua versão mais recente e develop
sua cópia de desenvolvimento "estável" mais recente.
Os colaboradores criam feature
ramificações (prefixadas feature/
por convenção) com develop
:
$ git checkout -b feature/my-feature develop
e hotfix
filiais (prefixadas hotfix/
por convenção) de master
:
# hotfix the latest version of master
$ git checkout -b hotfix/hotfix-version-number master
# or hotfix from a specific version
$ git checkout -b hotfix/hotfix-version-number <starting-tag-name>
Esses galhos são "descartáveis", o que significa que eles têm uma vida útil curta antes de serem mesclados de volta aos troncos principais. Eles destinam-se a encapsular pequenos pedaços de funcionalidade.
Ramos de acabamento
Quando um colaborador termina uma feature
ramificação, ele o mescla novamente develop
:
$ git checkout develop
$ git merge --no-ff feature/my-feature
$ git branch -d feature/my-feature
Quando eles terminam com uma hotfix
ramificação, eles os mesclam novamente nos dois master
e, develop
portanto, o hotfix avança:
$ git checkout master
$ git merge --no-ff hotfix/hotfix-version-number
$ git checkout develop
$ git merge --no-ff hotfix/hotfix-version-number
$ git branch -d hotfix/hotfix-version-number
Este é o aspecto da integração contínua.
Lançamentos
Quando você estiver pronto para iniciar o empacotamento de um release, crie uma release
ramificação a partir da ramificação "estável" develop
(o mesmo que criar feature
ramificações). Você então colide com o número da versão em uma tag (descrita abaixo).
O uso de release
ramificações separadas permite continuar desenvolvendo novos recursos develop
enquanto você corrige bugs e adiciona retoques finais à release
ramificação.
Quando você estiver pronto para concluir o lançamento, mesclar o release
ramo em ambos master
e develop
(como em hotfix
) para que todas as suas alterações sejam levadas adiante.
Marcação
Ao criar uma release
ramificação ou hotfix
ramificação, você aumenta o número da versão adequadamente em uma marca. Com o vanilla git, fica assim:
$ git tag -a <tag-name> -m <tag-description>
Você também precisará enviar as tags (separadamente) para o seu repositório remoto:
$ git push --tags
Geralmente, é melhor usar versões semânticas nas quais suas versões assumem a forma major.minor.hotfix
. Os grandes saliências são incompatíveis com versões anteriores, enquanto os pequenos e com hotfix não são incompatíveis com versões anteriores (a menos que você esteja na versão beta 0.x.x
).
Mesclando
Como você viu acima, o git-flow incentiva você a mesclar ramificações com o seguinte comando:
$ git merge --no-ff <branch-name>
A --no-ff
opção permite que você mantenha todo o seu histórico de ramificações sem deixar um monte de ramificações no commit atual do repositório (portanto, não se preocupe, você não terá uma ramificação para todas as versões).
Você também é incentivado a puxar com
$ git pull --rebase
Portanto, você não adiciona muitos commits de mesclagem inúteis.
Você pode configurar o git para fazer essas duas coisas por padrão no seu .gitconfig
. Eu vou deixar você procurar isso;)
Navegando nas versões
Quando alguém procura uma versão específica da sua base de código, pode fazer o checkout da tag pelo nome:
# checkout in detached HEAD to browse
$ git checkout <tag-name>
# OR checkout and create a new local branch (as you might for a hotfix)
$ git checkout -b <new-branch-name> <tag-name>
Ou, se alguém estiver navegando no github, também haverá uma guia "tags" no menu suspenso "branches".
Usando a extensão git-flow (recomendado)
Minha maneira favorita de usar esse modelo é com a extensão git flow para git.
( Edit: Louis recomendou o garfo AVH que funciona melhor git describe
e pode estar mais ativo agora. Obrigado Louis.)
A extensão automatiza todas as partes confusas (como usar merge --no-ff
e excluir ramificações após a mesclagem) para que você possa continuar sua vida.
Por exemplo, com a extensão, você pode criar uma ramificação de recurso assim:
$ git flow feature start my-feature-name
e termine assim
$ git flow feature finish my-feature-name
Os comandos para hotfixes e releases são semelhantes, embora eles usem o número da versão no lugar do nome de uma filial, assim:
# Create hotfix number 14 for this minor version.
$ git flow hotfix start 2.4.14
# Create the next release
$ git flow release start 2.5.0
O Git flow então cria a tag version para você e lembra-o de aumentar a versão em qualquer configuração ou arquivo de manifesto (o que você pode fazer com um gerenciador de tarefas como o grunt).
Espero que ajude :) Não sei exatamente como você integraria tudo isso à sua configuração do Travis CI, mas acho que os githooks o levarão até lá.