QConSP 2010, eu fui!

Posted by Alberto Leal on September 15th, 2010

qcon

Não sei nem por onde começar.. =P

Sem dúvidas o melhor evento o qual já participei! Superou completamente as minhas espectativas. O evento foi dividido em dois dias, sendo que os keynotes foram apresentados durante toda a manhã e o período da tarde foi dividido em três tracks. Haviam momentos em que era praticamente impossível escolher entre uma track e outra.

Organização?! Nota 10! Evento muito bem trabalhado, muito bem conduzido. Parabéns a Caelum e toda a equipe que estava de alguma forma envolvida com o andamento do evento.

Coffe break?! Não tem como deixar de comentar: O coffee break foi animal!! Toda vez que você saia da sala a mesa estava lá, sempre cheia de comida e bebida. Teve coffee break o tempo inteiro!!

Networking?! Foi muito bacana poder conhecer pessoas que só conhecia pela internet, além de re-encontrar velhos amigos.

Happy Hour?! O local escolhido para o happy hour foi um barzinho localizado próximo ao evento. O problema aqui foi que tinha tanta gente que, foi impossível colocar todo mundo “junto”. Uma galera ficou no último andar do bar, enquanto que outra parte ficou no primeiro andar. Mas isso nem atrapalhou muito, deu para rir bastante, trocar altas idéias…

Lightning Talk?! Até eu fiz uma apresentação no QConSP. Foi no final do primeiro dia. Contei um pouco sobre a forma como minha equipe utiliza o Git: “Utilizando Git em Projetos com Repositório Centralizado”. Mostrei uma pequena aplicação que utilizamos para ajudar a fazer a entrega em um repositório centralizado (qualquer dia eu blogo sobre isso em detalhes)

beto

Obrigado pela foto, @Loiane!

Projeto no Github: http://github.com/albertoleal/Git-To-Central-Repository

Quem saca bastante de SVN, CVS, fique a vontade para fazer um fork. Aliás, seria bem interessante poder ter esta aplicação voltada para outros SCM. =)

#CaravanaJavaCE?! Demais!! Muito legal pode re-encontrar a galera e conhecer outros membros da comunidade Cearense!

qconsp2010_loiane-48

Pontos Negativos?! Foram distribuídos fones de ouvido para que as pessoas que não tem o domínio da língua inglesa pudessem acompanhar a tradução  simultânea feita pelo Paulo e Guilherme. Só que a galera colocava este fone no último volume. Com isso, acabava atrapalhando outras pessoas que não precisavam do fone. E não dava para fugir, pois sempre tinha um fone alto em algum lugar =( Isto foi uma coisa que atrapalhou, mas que ao meu ver não estava no controle da organização do evento. Outro ponto que acho que poderia mudar é: Divulgar o nível da palestra no site. Por exemplo: Deixei de assistir uma palestra para assistir outra, achando que ia aprofundar no assunto, mas não aconteceu. Isto me deixou um pouco “frustado”. Outra sugestão é: Achei que faltou um “lounge”. Seria legal ter um no próximo, para que as pessoas possam usufruir do espaço: descansando, batendo papo..

Então, é isso! Espero poder participar do próximo. Com certeza estarei presente =D

(E ainda tem gente falando que o evento foi caro.. tsc tsc)

Screencast: Como criar um branch vazio no Git

Posted by Alberto Leal on March 22nd, 2010

Olá Pessoal,

Neste último final de semana eu gravei um screencast de como criar um branch vazio no Git.

Espero que vocês gostem:

Creating an empty branch on Git from Alberto Leal on Vimeo.

Abraços.

Git: Localizando a origem de um bug através de busca binária entre os commits

Posted by Alberto Leal on January 5th, 2010

No artigo de hoje, vamos abordar uma funcionalidade muito interessante do Git, a qual nos permite fazer uma busca binária no projeto procurando o commit exato onde o bug foi introduzido no projeto.

Cenário: Você não é o único desenvolvedor que trabalha no projeto. Enquanto você trabalha em um branch, outras pessoas trabalham em outros branches, e no final todos fazem o merge no branch master. O merge é feito várias vezes por semana. Em um belo dia, uma funcionalidade que antes funcionava perfeitamente para de funcionar, mas ninguém sabe dizer quem foi o responsável por quebrar aquela parte da aplicação, e como não existia uma suíte de testes cobrindo tal funcionalidade, o bug foi commitado.

Problema: Onde o erro foi commitado?
Solução: Utilizar o comando git bisect.

O projeto possui os seguintes commits:

commit 5c370fe0c059566a88e41699bfb7fea0abf4da0c
Author: Alberto Leal <albertonb@gmail.com>
Date:   Sat Dec 12 11:05:04 2009 -0200
 
    CBR 98575 - Cert verification
 
commit bd9e83fe1def11a38436d159b1ce721920fb9565
Author: Alberto Leal <albertonb@gmail.com>
Date:   Sat Dec 12 11:04:25 2009 -0200
 
    CBR 26345 - Regression
 
commit 61de4d21518855196426986ee0798c1e69f05ae0
Author: Alberto Leal <albertonb@gmail.com>
Date:   Sat Dec 12 11:03:37 2009 -0200
 
    bug 123 fixed
 
commit 32c8ce277a7db30aea67f7397a06596b1fc8bfdf
Author: Alberto Leal <albertonb@gmail.com>
Date:   Sat Dec 12 11:02:58 2009 -0200
 
    sessionTimeout features added
 
commit 1973d569ac052697c6e35e7e26b4e7b03ba09616
Author: Alberto Leal <albertonb@gmail.com>
Date:   Sat Dec 12 11:01:58 2009 -0200
 
    slogan on the header
 
commit 294d5cac2d9b400b7d244d71c6db5849f61fad6a
Author: Alberto Leal <albertonb@gmail.com>
Date:   Sat Dec 12 11:01:01 2009 -0200
 
    initial commit

**Para efeito de didática, já sabemos que o bug está no commit:
bd9e83fe1def11a38436d159b1ce721920fb9565

Antes de iniciar a busca binária, deve-se saber pelo menos um commit onde não existia o bug. Neste caso, sabemos que até o segundo commit tudo funcionava perfeitamente. Mas, para ter certeza disso, execute o comando abaixo, rode a aplicação e teste:

git checkout 1973d569ac052697c6e35e7e26b4e7b03ba09616

Observação: Estamos utilizando poucos commits, mas no “mundo real” os commits são muitos.

Após constatar que não existe o bug no segundo commit, volte para o último commit da mesma maneira:

git checkout 5c370fe0c059566a88e41699bfb7fea0abf4da0c

Agora chegou a vez de utilizar o comando git bisect. A idéia é marcar os commits como bad(ruim) e good(bom), e deixar que o Git faça uma busca binária entre os commits.

Alberto:repo Alberto$ git bisect start
Alberto:repo Alberto$ git bisect bad
Alberto:repo Alberto$ git bisect good 1973d569ac052697c6e35e7e26b4e7b03ba09616
Bisecting: 1 revisions left to test after this (roughly 1 steps)
[61de4d21518855196426986ee0798c1e69f05ae0] bug 123 fixed

Antes de mais nada, é necessário informar ao Git que vamos iniciar uma busca binária, para isso execute git bisect start. Repare que após iniciar o bisect, marcamos o último commit como bad e o segundo commit como good.

Em seguida o Git fez uma busca binária e encontrou o commit “bug 123 fixed”. Neste momento você deve executar a sua aplicação para ver se o bug está lá.

Não, o bug não está lá, portanto, marcamos o commit como good:

Alberto:repo Alberto$ git bisect good
Bisecting: 0 revisions left to test after this (roughly 0 steps)
[bd9e83fe1def11a38436d159b1ce721920fb9565] CBR 26345 - Regression

Novamente, o Git faz uma busca binária e encontra mais um commit para ser analisado. Após rodar a aplicação, constata-se que o erro está no commit atual que o bisect encontrou “CBR 26345 - Regression”:

Alberto:repo Alberto$ git bisect bad
bd9e83fe1def11a38436d159b1ce721920fb9565 is first bad commit
commit bd9e83fe1def11a38436d159b1ce721920fb9565
Author: Alberto Leal <albertonb@gmail.com>
Date:   Sat Dec 12 11:04:25 2009 -0200
 
    CBR 26345 - Regression
 
:100644 100644 9309150acfad8f21cb460ee17663fcbeaf212aa0 172b5ae1734b7bd1e1ac46b5cade3e61cbfddff1 M	imasters.txt

Pronto! Agora já sabemos em qual commit o bug foi introduzido. E, para finalizar, da mesma forma que informamos ao Git que desejávamos fazer uma busca binária, devemos informá-lo que já terminamos, executando o comando abaixo:

Alberto:repo Alberto$ git bisect reset
Previous HEAD position was bd9e83f... CBR 26345 - Regression
Switched to branch 'master'

Muita gente acha que quando se está trabalhando sozinho em um projeto de software não é necessário utilizar um sistema de controle de versões. O que é um falácia. Utilizar um SCM é indispensável e indiferente à quantidade de desenvolvedores que está trabalhando no projeto.

Git: Recuperando arquivo em commits antigos

Posted by Alberto Leal on July 1st, 2009

Hoje vou dar uma dica rápida de como recuperar um arquivo em commits anteriores.
Cenário: Você está trabalhando em um arquivo e adicionou ele em alguns commit. Mas, depois de alguns minutos, você percebe que as mudanças que você está fazendo estão incorretas, e necessita recuperar a versão que você havia adicionado no commit anterior. Como fazer isso? Vamos ver:

1
2
3
4
5
6
7
8
9
$ touch abc.txt
$ vim abc.txt
$ git add abc.txt
$ git commmit -m 'Abc file'
$ vim abc.txt
$ git add abc.txt
$ git commmit -m 'Some changes'
$ cat abc.txt
$ git checkout HEAD^1 -- abc.txt

O comando é ‘git checkout HEAD^1 — abc.txt’,  onde o número 1 representa a quantidade de commits abaixo, a partir do HEAD, e abc.txt representa o nome do arquivo que você deseja recuperar.

Simples e bastante útil!

Git: Quem fez merda no meu código?

Posted by Alberto Leal on June 19th, 2009

Cenário: Você está em uma reunião participando de um code review, quando algum desenvolvedor vira e fala: “Quem comentou a linha 12? Eu fiz esse código e aquele fragmento era importante!”. Pergunta: O culpado aparece rápido? Pode ser que sim. Mas, caso não apareça  ninguém para assumir a culpa, utilize o comando ‘git blame’ para descobrir quem fez cada modificação.

Exemplo:

$ git blame workspace/ProjectXPTO/WebContent/file.jsp -L 10,18
73e51f4f (Desenvolvedor A 2009-03-10 09:07:53 -0400 10)
73e51f4f (Desenvolvedor A 2009-03-10 09:07:53 -0400 11)  &lt;script&gt;
73e51f4f (Desenvolvedor A 2009-03-10 09:07:53 -0400 12)         // var windowName;
7ue8d049 (Desenvolvedor B 2009-06-18 16:42:48 -0400 13)
7ue8d049 (Desenvolvedor B 2009-06-18 16:42:48 -0400 14) function cleanUpVariable(variable){
7ue8d049 (Desenvolvedor B 2009-06-18 16:42:48 -0400 15)  var = j;
7ue8d049 (Desenvolvedor B 2009-06-18 16:42:48 -0400 16)  j = variable.replace(/[^0-9A-Za-z]+/g, "");
7ue8d049 (Desenvolvedor B 2009-06-18 16:42:48 -0400 17)  return j;
7ue8d049 (Desenvolvedor B 2009-06-18 16:42:48 -0400 18) }

Se você não passar o parâmetro -L serão exibidas todas as linhas do seu arquivo.  No caso acima deu para perceber que o responsável por comentar a variável “windowName” foi o “Desenvolvedor A”.

Agora você já sabe como descobrir quem faz cada besteira nos seus arquivos.

Git requer estudo, sim

Posted by Alberto Leal on June 19th, 2009

Acredito que o título desse post diz muito por si só. Mas, vou tentar expandí-lo um pouco mais. Só para constar, fui impulsionado a escrever esse post devido a algumas mensagens que acompanhei pelo twitter.

Existem diversos controladores de versão no mercado, tais como: Harvest, CVS, SVN, Clear Quest e por aí vai. Porém, o Git possui uma idéia, filosofia diferente destes que acabei de citar. Git é um SCM distribuído. Não vou entrar em detalhes sobre as diferenças agora, vamos deixar para uma outra ocasião.

A mensagem que quero passar é a seguinte:
Git é difícil?  Não.
Uso SVN/CVS na minha empresa há muitos anos, posso mudar tudo de uma vez para o GIT - já que Git não é difícil? Não aconselho.

Usar um controlador de versão não envolve apenas adicionar arquivos e comitá-los. Existem diversas tarefas que, às vezes, temos que fazer, como por exemplo: Quebrando um commit e cancelando algumas alterações. Pode ser que você já saiba fazê-lo no outro SCM que você vem utilizando, mas ainda não sabe fazê-lo no Git.

Se você, simplesmente, mudar de SCM de uma hora para a outra fatalmente terá problemas e terá que recorrer ao grande amigo Google. Alguns problemas triviais não lhe tomará muito tempo, por outro lado, outros não serão tão triviais quanto possam parecer e tomarão mais tempo do que você gostaria.

Minha sugestão é a seguinte, comece utilizando Git em um projeto antes de migrar todos os outros. Desse jeito você perceberá como o Git trabalha e como tirar o maior proveito dele. Além de se deparar com os mais diversos tipos de problemas.

Até a próxima!

Git: Quando usar cherry-pick ou am/apply

Posted by Alberto Leal on June 18th, 2009

Você sabe quando usar o cherry-pick ou am/apply?

Algumas vezes eu ficava confuso em qual comando usar. Se você se confunde, aí vai a dica:

Uma utilização para esses comandos é quando você desejar fazer o rebase/merge entre branches que estão em árvores diferentes, ou seja, vamos imaginar que você tem um branch, chamado A, que foi criado à partir do branch Release0615, e tem outro branch, chamado B, que foi criado à partir do branch Release0630.

O seu branch A atrasou e suas alterações não entrarão mais na release 0615 (release do dia 15/06/2009), então você deve fazer o seu rebase/merge com o release 0630. Mas eles estão em árvores diferentes, com isso você pode ter uma série, digo novamente, uma série de problemas. Uma solução é levar apenas as suas modificações feitas no branch A para o branch B, removendo com isso os conflitos de arquivos que você sequer mexeu!

Agora, qual comando usar ‘git cherry-pick’ ou ‘git format-patch’ seguido de ‘git am -3′ ou ‘git apply’?

Se o branch estiver em ambiente local utilize ‘git cherry-pick’. Ele tentará fazer um auto-merge para você e se não existir conflito tudo estará pronto. Agora, por outro lado, se os commits não estiver no ambiente local, ou se alguém lhe enviou os arquivos .patch por email, você deve usar o comando ‘git am -3′ ou ‘git apply’. Prefira utilizar ‘git am -3′, pois com ele o git já vai saber que são commits de outra árvore e fará de tudo para não ter problema no merge.

Desfazer commit no git

Posted by Alberto Leal on June 9th, 2009

Tenho percebido que algumas pessoas estão caindo no meu blog procurando por “como desfazer commit no git”.

Aí vai uma dica rápida para aqueles que estão à procura de uma solução.

Sempre que for desejável desfazer um commit no git, basta você revertê-lo. Para isso, utilize o seguinte comando:

1
git revert nome_do_commit

Se você executar o comando acima por acidente, você consegue revertê-lo também. Fazendo o revert do revert você estará voltando para o estado inicial do seu commit.

Espero que ajude!


Copyright © 2007 Alberto Leal. All rights reserved.