Olá
Faz um tempo que pretendo migrar os projetos da empresa do SVN para o Git.
O modelo distribuído, velocidade nas operações, branches leves e merges (sem conflitos) automatizados são as vantagens óbvias.
Fiz alguns testes em projetos pequenos em 2010 mas o plugin do eclipse na época era impraticável. E a equipe não se adaptou muito bem na linha de comando. Principalmente na hora do diff tool que teria que fazer por fora do eclipse.
O que me motivou (ou obrigou) a tentar de novo foi o Attlassian On Demand migrar a hospedagem do código para o Git. E daqui alguns meses se quisermos continuar no ótimo On Demand seremos obrigados a migrar para o Git.
Instalei o Eclipse Juno (4.2) e agora parece que o EGit está estável suficiente e fui tentar migrar um projeto bem pequeno como piloto do Git.
Primeiro tentei um modelo parecido com o SVN:
As duas pessoas envolvidas trabalharam na branch master (ligada na remota).
Cada commit ja fazia push pro repositório remoto central (o plugin agora tem um botão “commit and push”)
Cada programador antes de commitar (e push) faz um Team > Synchronize no projeto, que basicamente é um “git fetch” mostrando as alterações. Com isso o programador pode ver se tem coisas pra baixar… caso esteja tudo certo, faz o Team > Pull e depois commit (e push).
Os problemas dessa abordagem:
- não é possível dar push se eu não estiver 100% sincronizado com a branch remota (ter dado pull antes)
- ser obrigado dar pull antes vai te obrigar a usar uma versão que talvez o programador não queria usar - algumas vezes só precisamos baixar um único arquivo de um outro programador pra continuar nosso trabalho, mas não queremos ainda baixar tudo.
- esse modelo de todos trabalhando na branch remota gera mais conflitos
Ok. De fato é ruim esse modelo.
A segunda opção foi cada programador ter sua própria branch (algo como “desenvolvimento” originada da master local).
Cada programador faz commits locais (e se desejar push na sua branch remota) e de tempos em tempos ou quando precisar envia as alterações para a branch master remota.
Os problemas dessa abordagem:
-
o processo fica muito burocrático para uma coisa simples. Por exemplo:
O programador “A” precisa de uma única alteração do programador “B”. O programador B então faz:
a) commit na branch local
b) checkout para a master local
c) merge com squash (sem commit automático na master local)
d) commit local só do arquivo desejado
e) push
f) checkout de volta na sua branch local de desenvolvimentoO programador “A” para baixar esta única alteração faz:
a) checkout na master
b) pull (pode acabar pegando mais alterações de outros programadores)
c) checkout na branch local
d) merge com a master local (sem commit automático das possíveis outras alterações não desejada no momento)
e) commit local só das alterações que quis baixar do repo remoto
são 6 passos do programador “A” e 5 do programador “B”. 11 no total… achei muito. Além disso pode sobrar uns arquivos no estado de stage.
Comparando com SVN:
Programador B:
a) commit só do arquivo necessário
Programador A:
a) update só do arquivo necessário
Existe algum modelo de usar git sem aumentar e muito a burocracia para coisas simples?
Obrigado e desculpe o texto enorme! 