Tutorial: Pull Request através de branches distintos num mesmo repositório
Pessoal,
terminei de implementar a funcionalidade que escolhi (Autenticação com Facebook) e vou aproveitar minhas modificações para dar um exemplo de como é aquele fluxo de criação de novo branch e pull request usando o git e o Github. Segui o algoritmo e, no momento, eu deveria estar no passo 6 (abra a imagem em uma nova aba ou janela para ver em seu tamanho original)
Acontece que eu esqueci de executar o passo 4 (afinal, estava com muito sono), o que não é de todo ruim por que serve para mostrar o que fazer no caso de acontecer o mesmo com algum de vocês.
Mas atenção: se você fez o que o passo 4 diz (criou e utilizou um novo branch para a inclusão das modificações), pode pular isso que vou fazer agora e passar direto para a etapa de criação do commit. Executando um simples
$ git status
é isso que obtenho como resultado:
Passando as Modificações para o Branch Correto
Observem que estou no branch master e tenho vários arquivos modificados e untracked. Não era bem isso que eu queria. Queria ter todos esses arquivos modificados e untracked em outro branch para que eu pudesse, então, usar ‘git add’ e criar um commit com todas essas modificações. Como resolver essa bronca? Bem.. há algumas maneiras diferentes de se fazer isso e eu optei por uma que considero bastante simples: ‘git stash’.
Antes usar o comando stash do git, preciso adicionar tudo como se fosse criar um commit. O stash é mais ou menos um commit que não vai pra lugar nenhum. Adicionando todas as minhas modificações:
$ git add .
Chamando ‘git status’ novamente, vejo os arquivos que foram adicionados ao index e estão prontos para entrar num novo commit:
O status mostra que há um arquivo no status ‘deleted’. Para efetivar essa modificação no git é necessário executar
$ git rm spec/controllers/games_controller_controller_spec.rb
Depois disso, executando ‘git status’ novamente, vejo que todas as modificações (inclusive novos arquivos e arquivos removidos) foram inseridas ao index e estão prontas para ser commitadas (aparecem em verde). Agora, pra fazer o stash entrar em ação:
$ git stash
O comando dá como saída uma mensagem informando que as modificações foram salvas no stash e que o HEAD agora está no último commit. O stash funciona em regime de pilha. Se eu continuasse fazendo modificações, adicionasse com ‘git add’ e chamasse ‘git stash’ de novo, essas novas modificações seriam empilhadas sobre o último stash. O comando para listar tudo o que há na pilha de stash é
$ git stash list
Depois de salvar as modificações no stash, o ‘git status’ fica limpo novamente (sem aquele monte de arquivos modificados e untrackeds resultantes da minha implementação).
Percebam que o arquivo ‘.rvmrc’ está na seção untracked (o que não acontecia antes) por que o arquivo .gitignore que informava ao git para ignorar o .rvmrc foi mandado pro stash. De qualquer maneira, não há problemas em que ele permaneça aí por que a seção untracked (como já deve ser sabido) exibe arquivos que não estão sendo versionados com o git.
Beleza. Agora que já tenho todas as minha modificações em um lugar que posso recuperar depois e meu branch master voltou a ser o que era antes de eu começar a implementação, meu próximo passo é criar meu novo branch e dar um checkout pra ele (isto é, informar ao git que quero trabalhar nesse branch). Para criar um novo branch a partir do branch em que estou atualmente (no caso, estou no branch master), basta executar
$ git branch fb-connect
em que ‘fb-connect’ é o nome do meu branch (escolhido arbitrariamente por mim). Isso cria o branch mas não o seleciona. Para mudar para o branch:
$ git checkout fb-connect
Agora, sim, estamos trabalhando no branch recém-criado. Git oferece uma maneira de encurtar o caminho para criar um novo branch e dar checkout nele com um comando só, que é o seguinte:
$ git checkout -b fb-connect
O argumento ‘-b’ informa que o branch para o qual se está dando checkout é um novo branch. Para confirmar que de fato estamos trabalhando num novo branch podemos rodar o popular ‘git status’ ou
$ git branch
que lista todos os branches no repositório local ou
$ git branch -a
que lista todos os branches – tanto no repositório local quanto nos remotos (a stands for all).
Estamos preparados para remover aquelas modificações colocadas no stash e aplicá-las no novo branch! Para fazer isso:
$ git stash pop
Isso aplica as mudanças, já adicionando os novos arquivos ao stage – isto é, prontos para ser commitados. Arquivos modificados e removidos vão para a seção de not staged, de acordo com a comparação com o último commit da árvore de commits do branch (que é onde o HEAD se encontra).
Criando e Enviando o Novo Commit ao Repositório Remoto
Para adicionar tudo ao commit que iremos criar, já sabe, né? ‘git add .’ e ‘git rm <caminho/para/o/nome do arquivo a ser removido>…’. Depois de fazer isso, todas as modificações aparecem em verde ao dar um novo ‘git status’ – o que significa que serão adicionadas ao novo commit, que criaremos com:
$ git commit -m "Introduz funcionalidade de login com conta do Facebook"
Se dermos um ‘git status’ novamente, veremos que nosso diretório de trabalho está limpo (nada pra commitar) e executando
$ git log
podemos listar todos os commits.
Atente para o fato de que o último commit (“Introduz funcionalidade[…]”) só existe no branch em que estamos atualmente! Se dermos ‘git checkout master’ e ‘git log’ ele não ira aparecer. O commit também não existe no repositório remoto. Na verdade, o branch que criamos ainda não existe no remoto também. Para subir nosso código para o repositório remoto (hosteado pelo Github), precisamos rodar o comando
$ git push origin fb-connect
em que origin é o nome do remoto (você pode ver os nomes e os endereços dos remotos cadastrados no seu repositório local através de ‘git remote -v’) e fb-connect é o nome do branch para o qual o push será feito.
Criando o Pull Request
Agora o nosso novo branch (com o commit que possui as modificações) já está no repositório remoto e pode ser visualizado através da interface web do Github (https://github.com/embs/gaming/tree/fb-connect). É justamente de lá que iremos realizar o pull request para solicitar que o código adicionado e modificado seja integrado ao branch principal (master). Isso é bem fácil de fazer (nem precisa de linha de comando – pra ser sincero, não sei como fazer por linha de comando nem se há como fazer por linha de comando): basta clicar no botão bonito (Pull Request) do Github. :)
Depois aparece um formulário em que você pode dar mais detalhes (além do texto da mensagem do último commit) sobre o que você fez nesse novo branch. Ah! outra coisa importante nessa tela é a informação de qual pra qual branch o pull request está sendo feito. Nesse caso, estou solicitando para que o código do fb-connect vá para o master.
E aí é só “Send pull request”.
E correr pro abraço! Ou melhor… ir para o passo 7 do passo-a-passo. :/