domingo, 8 de janeiro de 2017

Uso do Github para colaboração

Este é o segundo de dois posts sobre o uso de Git e Github baseando nas aprendizagens do curso da Udacity, How to Use Git and GitHub. O primeiro post é o "Comandos para o Git e como funciona" e o conhecimento dele é importante para entender o post abaixo.

Github é uma plataforma de compartilhamento e colaboração de código (como uma rede social de código). É possível de forma gratuita manter repositórios públicos e pagando manter repositórios privados. Há outros sites de git também, como o gitlab ("GitLab unifies issues, code review, CI and CD into a single UI ") - que tem o diferencial de permitir repositórios privados também.

Cache da senha do Github no git

O artigo "Caching your GitHub password in Git"  ensina como fazer o cache da senha do github em sua máquina, para não ter que digitar usuário e desenha a todo momento que fizer uma ação no Github.

Sincronismo de repositório local e o remoto(Github)

O não acontece automaticamente, é necessário executar comandos este sincronismo.

Alguns comandos para trabalhar com repositórios remotos:

git remote -v
Para definir ver repositórios remotos. O argumento "-v" significa verboso e traz mais detalhes sobre os repositórios remotos.

git remote add [aliasRemoto] [url]
Para adicionar o repositório local em um repositório remoto
[aliasRemoto] é o apelido local do repositório remoto, é padrão chamar origin se for o primeiro ou único repositório remoto.

git push [aliasRemoto] [localBranch]
Sobe os arquivos do branch local definido para o alias remoto definido
Exemplo de comando : git push origin master

git pull [aliasRemoto] [remoteBranch]
Atualiza o repositório e branch local pelos arquivos remotos

Conceito Fork de repositório

Para facilitar e manter ligações de colaboração de repositórios o Github oferece um conceito específico que é o Fork de repositório. Com ele é possível iniciar seu próprio repositório baseando em outro existente (E podendo dar os devidos créditos). Outra vantagem é que facilita a proposição de evoluções(commits) no branch raiz. Funciona como o clone, mas acontece internamente no servidor do github.

Diferença em Branch, Clone, Fork 

Branch é fazer uma versão do repositório, o que permite você evoluir o repositório para uma nova funcionalidade por exemplo
Clone permite uma cópia total do repositório, incluindo todos os Branches existem ali
Fork é uma espécie de clone do GitHub, que ajuda a manter vínculo com o repositório original

Baixando um branch remoto

Para baixar um branch remoto o comando deve ser suficiente o abaixo:
git checkout [nomeBranc]

Se não for, consulte a resposta da pergunta Git fetch remote branch.

 Resolvendo conflitos de repositórios locais e remotos

É possível manter o branch local e remoto atualizados utilizando os comandos push e pull. Mas quando há mais de uma pessoa trabalhando no mesmo branch, ou mesmo quando um único desenvolvedor está trabalhando em duas máquinas, é possível acontecer conflito de alteração em um mesmo arquivo.

Para resolver estes conflitos é necessário seguir as seguintes etapas:

Primeiro, executar o comando abaixo, para criar/atualizar  um branch local com as alterações remotas:

git fetch [aliasRemoto]

Fazer o merge entre o branch do que está no github com o branch local:
git merge [branchlocal] [aliasRemoto/branch]

Editar o arquivo em conflito e adicioná-lo para posterior commit:
git add [arquivo]

Fazer o commit do conflito resolvido no repositório local
git commit

Fazer push das alterações no repositório remoto:
git push [aliasRemoto] [branchLocal]

Agora que sabemos o que faz o git fetch, é bom saber que o git pull é a mesma coisa que executar o comando git fetch seguido do comando git merge.

Fazendo um pedido de alteração num repositório do GitHub

Quando se trabalha com um repositório que precisa de pedir autorização para uma alteração no repositório, ou seja, quando há um revisor de código que irá validar suas alterações, o processo de fazer a alteração precisa ser feita da seguinte maneira:

Crie um branch local:
git branch [nome branch]

Faça checkout do branch local, para definir que irá trabalhar nele:
git checkout [nome branch]

Faça a alteração dos arquivos necessário, os salve e adicione na staging area:
git add [arquivo]

Faça o commit no repositório local:
git commit

Faça a atualizando do repositório remoto (github), adicionando o branch:
git push [aliasRemoto] [localBranch]

Faça o pull request visualmente no GitHub. Acesso o repositório remoto no github e clique no botão "new pull request":
 

Selecione os branches que deseja fazer o merge e clique no botão "Create pull request":






Na tela do pull request, preencha a mensagem do commit e algum comentário para justifica-lo (se necessário), após isso clique no botão Create pull request:


Após a conclusão o pull request é criado e os responsáveis são notificados de sua existência. Eles poderão solicitar ajuste ou aceitar a alteração

Mantendo um Fork atualizado


Para manter o fork atualizado com o repositório original, siga estes passos:
1) adicione o repositório original como remoto no seu repositório local
git remote add [aliasRemoto] [url]

O nome comum desde alias remoto é upstream

1.1) Você pode confirmar que o alias remoto foi criado com o comando:
git remote -v
 2) Faça o checkout do branch master local (Ou o branch que deseja atualizar):
git checkout master

3) Atualiza os arquivos locais pelo repositório remoto raiz

git pull [aliasRemoto] [branchlocal]

4) Faça o merge de um branch com alteração de código com o branch merge
git merge [branch] [branchComAlteracao]

5) Resolva conflitos de merge, adicione eventuais arquivos alterados (git add) e façar o commit

6) Finalmente suba as alterações
git push [aliasRemoto] [localBranch]




Mapa conceitual do Git e Gibhub, criado pelo curso da Udacity

Outras fontes de consulta para Git e Github

Git-it é um aplicativo desktop (Mac, Windows e Linux) app que ensina como usar Git and GitHub na linhade comando.

Guia para orientar passao a passo o usodo Git e Github