Alguns posts atrás falei um pouco sobre Git e GitHub mostrando alguns conceitos básicos e um fluxo de trabalho para projetos simples e, geralmente, individuais.

Neste post pretendo apresentar um fluxo de trabalho mais voltado para projetos envolvendo várias pessoas.

Branches

Antes de falar sobre este tópico é importante falar uma funcionalidade do Git (e de outros sistemas de controle de versão): branch. Uma branch é uma cópia do repositório que permitem que modificaçẽs sejam feitas em paralelo na branch original e na nova gerada. Por padrão repositórios Git trabalham na branch master. Esta branch é geralmente usada para manter uma versão mais estável do projeto, sem funcionalidades instáveis ou em fase experimental.

O comando git usando para manipular branches é, como esperado, git branch. Sem nenhuma opção ele lista todas as branches existentes e destaca a branch em uso. Por exemplo, num repositório com as branches master e pelican com a segunda em uso, o comando git branch exibiria:

exmeplo: git branch

Para criar uma branch usamos git branch nome-da-nova-branch, para mudar de branch em uso git checkout. Uma tarefa bem comum é criar uma nova branch, geralmente para algum tipo de experimento ou correção, e defini-la como corrente. Isto pode ser feito da seguinte forma:

git branch nova-branch
git checkout nova-branch

Como esta é uma tarefa bastante comum, há um atalho para isso.

git checkout -b nova-branch

É possível, e em alguns casos muito útil, fazer o checkout de apenas alguns arquivos de uma determinada branch. A sintaxe para isto é:

git checkout uma-branch-qualquer -- arquivo

Colaboração com branches

Uma forma bastante interessante de melhorar a colaboração num projeto é usando branches. É possível usar apenas um repositório central (no GitHub) e, ainda assim, manter a organização.

A estatégia é: * Usar uma branch nova para cada funcionalidade ou correção * Fazer push desta branch para o respositório no GitHub * Abrir um Pull Request desta branch para master.

Imaginando que queremos implementar uma funcionalidade X, podemos fazer (localmente):

git checkout -b X
# Fazer as alterações
git add arquivos
git commit -m "Implementada funcionalidade X"
git push -u origin X

A última linha criará a branch no GitHub, se não existir, e enviará as alterações feitas localmente a esta branch remota. Feito isto é possível abrir um Pull Request no GitHub, possibiliando discutir o código antes do merge com a master.

Se necessário adicionar mais modificações ao mesmo pull request basta fazer mais pushes na branch e eles serão adicionados automagicamente.