Git além do push e pull: Dicas pra você que chegou na semana passada

em Artigos, Desenvolvimento, Git.

Quem trabalha profissionalmente com desenvolvimento de software já deve saber que o GIT é uma ferramenta indispensável para organizar, versionar e até para ser usada como backup. Com o GIT criamos um histórico de modificações que pode sempre ser consultado e ainda revertido de acordo com as necessidades no momento, isso reduz os riscos ao “experimentar” coisas novas em um código.

Aqui na Locaweb todos os times de Engenharia de Produtos fazem uso dessa ferramenta poderosa, então já estamos mais do que acostumados com os comandos. Mas você que está começando agora a utilizar o GIT pode enfrentar algumas dificuldades no começo, por isso selecionei algumas dicas que podem te salvar no meio do processo de desenvolvimento ou melhorar os seus commits!

Modificando seu último commit

Quando estamos trabalhando com controle de versão, é muito comum querer modificar uma coisa pequena no último commit. é aí que entra o comando –amend do GIT.

$ git commit --amend

Na prática, existem diversos cenários que podem ser tratados com esse comando de forma muito simples. Vamos imaginar um cenário onde você está trabalhando no seu projeto e commitou uma parte de uma nova feature.

$ git add view.php controller.php model.php
$ git commit -m “Página de visualização da lista”

Nesse momento, você verifica que a mensagem do commit poderia ter sido melhor. Sem o comando –amend você deixaria passar, mas agora você pode editar a mensagem da seguinte forma:

$ git commit --amend

Será aberto um editor de texto contendo a mensagem do último commit, então é só modificar o texto e salvar. Viu como é fácil? O mesmo também pode ser feito para modificar, remover e adicionar arquivos ao commit. Pensando no mesmo cenário anterior, você realizou o seguinte commit:

$ git add view.php model.php
$ git commit -m “MVC da página de listagem”

Ops! esquecemos de inserir o controller no nosso commit. Vamos corrigir isso assim:

$ git add controller.php
$ git commit --amend

Perceba que você tem a oportunidade de trocar a mensagem de commit também! Caso queira modificar um arquivo ou removê-lo, o procedimento é o mesmo. Só lembre-se de utilizar o comando $ git commit –amend ao invés do commit tradicional.

Nota importante: O comando –amend só funciona no seu branch local. Portanto, modificações enviadas ao branch remoto não serão afetadas pelo –amend.

Guardando as modificações pra depois

Algumas vezes se faz necessário mudar de branch no meio do processo de desenvolvimento para priorizar outras atividades. Por outras vezes é necessário criar um branch a partir de um trecho de código em desenvolvimento. Essas duas situações são facilmente tratadas com o stash do Git. O stash nada mais é do que uma pilha que guarda modificações em arquivos versionados que podem ser recuperadas a qualquer momento.

Você está trabalhando em um determinado branch, mas surgiu uma outra atividade mais importante que necessita mudar de branch. Você não pode dar um checkout nos arquivos editados, pois isso vai desfazer todo o trabalho que estava em andamento. Simplesmente mudar de branch vai aplicar modificações indesejadas. A solução está então em fazer um commit de wip (work in process) e salvá-lo no stash.

$ git status
  On branch new_feature
  Changes to be committed:
     (use "git reset HEAD <file>..." to unstage)
  new file:   view.php

Um simples comando vai gravar todas as modificações do arquivo view.php na pilha:

$ git stash

Agora você pode mudar de branch, fazer o que deve ser feito e retornar ao branch anterior para continuar o trabalho. Vou apresentar duas maneiras para você recuperar as informações do stash. Mas antes, vamos consultar o que está salvo atualmente nessa pilha:

$ git stash list
  stash@{0}: WIP on feature: 15cf360 README edition
  stash@{1}: WIP on master: ac93d93 Created index file

A pilha possui dois itens, um salvo no master e outro no branch feature. Digamos que você voltou a trabalhar diretamente no master e quer aplicar o stash da segunda linha. Para tal, você pode fazer o seguinte:

$ git stash apply stash@{1}

Isso vai manter o conteúdo na pilha e irá aplicar as modificações no seu branch. Caso queira aplicar as mudanças e remover da pilha, podemos fazer o seguinte:

$ git stash pop stash@{1}

Se você só tiver um item no stash, não é necessário informar o último parâmetro do comando. Pode fazer diretamente:

$ git stash apply

ou

$ git stash pop

Se sua intenção é criar um novo branch com a última informação grava no stash, faça o seguinte:

$ git stash branch NOME_DO_BRANCH

Resetei um commit sem querer e perdi todo o trabalho, o que eu faço?

Talvez você esteja apenas começando com o GIT e ainda não fez nada de errado, mas eventualmente você vai resetar seu branch local e perder todos os commits não enviados ao branch remoto. Se você é daqueles que só faz push no final do dia de trabalho, você vai ficar muito bravo em perder tudo o que trabalhou. Mas FIQUE CALMO! O GIT te salva também!

O reflog vai ser muito útil nesses momentos, ele mostra todo o histórico do seu repositório local (com exceção dos pushes, fetches e clones). Vamos testar?

$ git reflog
  ac93d93 HEAD@{0}: reset: moving to ac93d9375a6fbaf9ddf8e331e69be64dd0fcc27f
  15cf360 HEAD@{1}: checkout: moving from feature to branch_stash
  15cf360 HEAD@{2}: commit: README edition
  ac93d93 HEAD@{3}: checkout: moving from master to feature
  ac93d93 HEAD@{4}: commit (amend): Created index file
  2659864 HEAD@{5}: commit: Added index file
  0286ad5 HEAD@{6}: reset: moving to 0286ad55e7861bb2f1eafcf66a1850794b09d278
  60d7c7b HEAD@{7}: commit: created index file
  0286ad5 HEAD@{8}: commit (initial): Initial commit

Digamos que o segundo item dessa lista (15cf360 HEAD@{2}: commit: README edition) representa uma grande modificação no README do projeto que foi resetada sem querer e não estava no branch remoto. Foram vários passos de instalação, configuração e uso de sua aplicação perdidos. A recuperação dessas informações é bem simples também. Não tem mistério: use o cherry-pick! Você só precisará copiar o hash de referência exibido no reflog, no nosso caso é “15cf360” e passar para o cherry-pick:

$ git cherry-pick 15cf360
[branch_stash 64aad11] README edition
1 file changed, 2 insertions(+)

Simples assim. Agora corra e dê um push ;)

Essas foram algumas dicas que me ajudaram muito no meu processo de desenvolvimento de software. Fizeram minha vida ser mais fácil com o GIT. Em breve, mais dicas sobre GIT!

 

Saiba mais, acesse : Git – Desenvolvimento Ágil Distribuído