Branch Feature Forking Workflow é uma mistura de Branch Feature Workflow com Forking Workflow. Baseado em Git Workflows
Não é a intenção desse guia explicar em detalhes o que cada comando do Git faz e sim ilustrar as etapas do workflow. É necessário um conhecimento básico do Git e seus comandos para entender e usar o BFFWorkflow.
- [Sumário]
Dado uma nova funcionalidade é necessário que a mesma seja criado no repositório oficial do projeto, isso pode ser feito pelo command line ou pelo próprio GitHub
Vamos supor que nossa funcionalidade se chamará feature-1
Caso você não tenha o projeto sob seu usuário, é necessário forkar o projeto. Esse procedimento também pode ser feito pelo próprio GitHub, basta acessar o repositório oficial e clicar no botão Fork (lado direito superior da tela).
Dado que você tem o fork do projeto sob seu usuário, você deve clonar o repositório
É necessário também adicionar também uma referência para o repositório oficial, usaremos esse apontamento para receber alterações do projeto oficial, temos que sempre ter isso sempre como mindset, sempre vamos se atualizar com o repositório oficial. Pode ser que alguma outra funcionalidade foi integrada ao projeto principal ou pode ser que alguma correção (hotfix) tenha sido encontrado e solucionado.
Nosso repositório terá dois apontamentos
Alias | Descrição |
---|---|
origin | nome padrão, aponta para o repositório padrão (no caso, o sob o seu usuário) |
official | aponta para o repositório oficial do projeto |
Agora você tem todo repositório pronto, hora de começar a escrever lindas linhas de código, certo?
Você deve criar uma branch a partir da branch da funcionalidade (no nosso caso, feature-1). Vamos supor que uma das tasks para entregar a feature-1 é criar uma modelagem de classes.
Você pode criar a branch feature-1-modelo-de-classes
Nesse momento nossas branchs estão com o ponteiro para o mesmo commit, teremos a seguinte árvore:
Vamos dizer que você trabalhou no modelo de classes da feature-1 e após (dois) commits, você já pode "contribuir" para a funcionalidade feature-1.
Dado uma pequena contribuição "pronta", já é possível criar um pull request para o repositório oficial. Para fazer isso é necessário empurrar suas alterações
É uma boa prática sempre atualizar seu repositório antes de enviar uma contribuição, pode ser que algum pull request foi integrado em produção ou na branch feature.
Automaticamente depois do git push, quando acessar o repositório do oficial projeto você verá um botão verde Compare & pull request
Importante lembrar que você deve selecionar como base fork a branch feature, no caso feature-1*
Pull request criado, será avaliado pelo time.
Caso seja rejeitado, é necessário fechar o pull request, basicamente o que você tem que fazer é implementar as correções e criar outro pull request posteriormente.
Time deve avaliar questões de design, coding conventions/standards, testes de unidade entre outros..
Ao aceitar um pull request pode se aproveitar e deletar a branch remota com a alteração, isso é feito pelo botão Delete branch.
Atualizar sempre o repositório é uma boa prática. Sempre que possível e obrigatoriamente após ter um pull request integrado deve se atualizar suas branchs interessadas.
Continuando na feature-1, temos a seguinte árvore quando fizemos nosso pull request
Após a atualização das branchs interessadas, teremos a seguinte árvore:
Você também pode/deve limpar localmente as branchs que você já integrou.
Vamos dizer que tivemos duas contribuições na feature-1. Novas contribuições/pull requests serão feitos assim como o anterior, gerando uma árvore parecida com a seguinte:
Dado que a feature-1 já está pronta para ser coloca em produção, criaremos um pull request no próprio repositório oficial. Podemos fazer isso pelo GitHub
Depois que o pull request da funcionalidade completa (feature-1) para a master e o merge, precisamos atualizar a nosso repositório com a versão master atual, esse procedimento é bem parecido com o anterior
Teremos um grafo parecido com esse:
E podemos limpar nossas branchs localmente e remotamente
No final da limpeza teremos uma árvore parecida com a seguinte:
Note que o ponteiro da origin/master está desatualizado. Na verdade, não usamos a origin/master para nada. Podemos sincronizar sua master sob seu usuário :)
E finalmente, a árvore:
TA-DA 🎉
Abra um issue com dúvidas ou sugestões ou envie um pull request