Começamos um novo projeto na Agence esta semana e decidimos usar o Git na máquina de desenvolvedor e SVN como repositório central. A idéia é facilitar o desenvolvimento local usando branches para cada funcionalidade desenvolvida e enviar para o repositório central (SVN) ao término do seu trabalho. Temos também a vantagem de poder compartilhar repositórios locais como já comentado aqui.
Para que isso seja possível, você usará o comando git-svn, que já vem na instalação do git para MacOSX mas, não está no PATH do seu sistema. Para usá-lo você deve incluir o diretório /usr/local/git/libexec/git-core/ no PATH. Para fazer isso, coloque a linha abaixo no final do seu arquivo ~/.bash_profile:
export PATH=$PATH:/usr/local/git/libexec/git-core/
Se você usa linux, o apt-get (debians like) ou yum (red hat like) tem os pacotes para instalação.
Para começar, faça o clone do seu repositório do SVN usando o comando:
$ git-svn clone {endereço do repositório SVN}
Se seu repositório for autenticado ele vai pedir usuário e senha sem grandes complicações. Após isso, basta seguir a sequência básica de uso:
1. Crie um branch para trabalhar em sua funcionalidade:
$ git checkout -b {nome da sua funcionalidade/estória/caso de uso/ticket/etc...}
2. Escreva seu código e faça commit no seu repositório local (você pode fazer o commit várias vezes antes de terminar o trabalho, inclusive, recomendo que você faça isso):
$ git commit -am "sua mensagem do commit"
3. Quanto terminar o desenvolvimento (não esqueça de comitar), faça checkout no branch master:
$ git checkout master
4. Faça o merge do seu branch com o master (o parâmetro –squash transforma todos os commits do seu branch em apenas um commit, bem legal):
$ git merge --squash {nome da sua funcionalidade/estória/caso de uso/ticket/etc...}
5. Comite no branch master:
$ git commit -am "sua mensagem do commit"
6. Envie para o SVN:
$ git-svn dcommit
Para manter sua cópia de trabalho atualizada use o comando:
$ git-svn rebase
Não tive problemas até o momento com essa abordagem. Algumas pessoas questionaram o motivo de criar um branch para cada funcionalidade. Eu considero isso muito importante quando você volta e meia tem que fazer algum ajuste em outra coisa no sistema bem no meio do desenvolvimento. Com isso, basta você criar outro branch, fazer suas alterações e comitar no SVN, não influenciando no trabalho que você ainda está fazendo. Pra mim, no dia-a-dia essa é a maior vantagem do uso do git.
Este artigo foi inspirado/baseado nas referências abaixo: