Вы находитесь на странице: 1из 15

As diferenas entre Git e SVN - Revista Java Magazine 116

1 de 15

http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=28079

www.devmedia.com.br
[verso para impresso]
Link original: http://www.devmedia.com.br/articles
/viewcomp.asp?comp=28079

Este artigo apresenta as principais diferenas


nas abordagens de controle de verso dos
sistemas Subversion e Git. O Subversion um
sistema de controle de verso centralizado
utilizado tradicionalmente em projetos Java.
Artigo do tipo Terico
Recursos especiais neste artigo:
Contm nota Quickupdate, Contedo sobre boas prticas.
De SVN para Git
Este artigo apresenta as principais diferenas nas abordagens de
controle de verso dos sistemas Subversion e Git. O Subversion um
sistema de controle de verso centralizado utilizado tradicionalmente
em projetos Java. O Git um sistema de controle de verso

02/08/2016 14:13

As diferenas entre Git e SVN - Revista Java Magazine 116

2 de 15

http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=28079

distribudo que apresenta crescente adoo na comunidade de


desenvolvimento de software em geral, especialmente aps sua
popularizao atravs do servio de hospedagem de cdigos GitHub.
Em que situao o tema til
Este tema til para desenvolvedores que buscam informaes e
alternativas de sistemas open source de controle de verso de
software, e para usurios de Subversion que buscam avaliar as
diferenas e impactos de uma migrao para um sistema de controle
de verso distribudo.

Este artigo tem como objetivo apresentar um comparativo entre os


sistemas de controle de verso mais comuns no ecossistema Java: o
Subversion (SVN), como representante do modelo centralizado de
controle de verso, e o Git, como representante do modelo distribudo
(ou DVCS Distributed Version Control System). Assume-se que o
leitor j possua familiaridade com algum sistema de versionamento de
cdigo e os conceitos de revises, branches e tags, alm do uso de
ferramentas em linhas de comando. Ao final do artigo ser
apresentada uma breve introduo a ferramentas de integrao do Git
com outros sistemas, como IDEs Java, e ao processo de build, atravs
da ferramenta Maven.
Na medida em que projetos de software tornam-se mais complexos,
aumenta-se a demanda por respostas rpidas a mudanas e a
necessidade de integrao entre sistemas. Neste cenrio, sistemas de
controle de verso distribudos deixaram de ser uma tendncia
tecnolgica para se tornarem componentes essenciais no arsenal para
o desenvolvimento de software, com demanda crescente no mundo
corporativo. Entre as empresas que anunciaram o uso do Git em seus
projetos temos o Google, que adaptou o Git para uso em seu projeto
Android, e a Microsoft, que incluiu o suporte ao Git ao disponibilizar o
cdigo-fonte do framework ASP.NET MVC no Codeplex.

02/08/2016 14:13

As diferenas entre Git e SVN - Revista Java Magazine 116

3 de 15

http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=28079

Esse movimento de adoo de sistemas de controle de verso


distribudos surgiu da necessidade de um modelo de gerenciamento de
cdigo onde o foco deixa de ser o simples backup do cdigo-fonte e
passa a ser o do compartilhamento e colaborao de cdigo entre
equipes de desenvolvimento diversificadas, desde equipes em setores
diferentes de uma mesma empresa a projetos internacionais. Alm da
questo colaborativa, as ferramentas de controle de verso distribudo
trazem novas abordagens para a soluo de problemas de
versionamento, com o propsito de aumentar a produtividade no
processo de desenvolvimento de software.

Histrico
O Subversion um sistema de controle de verso centralizado que
consiste em um cliente (o SVN) e um servidor central, acessado por
meio de TCP/IP, geralmente via SSH ou HTTP/WebDAV. Desenvolvido
inicialmente pela CollabNet no final de 2000, e integrante do projeto
Apache desde 2010, o SVN foi adotado em muitos projetos da
comunidade Java devido sua integrao com as ferramentas de
desenvolvimento, alm de resolver problemas do seu antecessor o
CVS ao incluir o suporte transacional e melhorias de performance na
comunicao entre cliente e servidor.
O Git, por sua vez, foi desenvolvido inicialmente para atender s
demandas de controle de verso do kernel do sistema operacional
Linux. O desenvolvimento do Linux por sua prpria natureza
necessitava de um modelo distribudo de versionamento, onde
commits encontram-se espalhados em inmeras linhas de
desenvolvimento paralelas (branches) e devem passar por um
processo de aprovao. Essa necessidade levou ao desenvolvimento do
Git, pelo lder do projeto Linux, Linus Torvalds. Aps o lanamento da
primeira verso, em 2005, o Git passou a ser mantido por Junio
Hamano, engenheiro de software do Google.

02/08/2016 14:13

As diferenas entre Git e SVN - Revista Java Magazine 116

4 de 15

http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=28079

Em pouco tempo aps o lanamento do Git, outros projetos open


source de grande porte passaram a adot-lo como sistema de controle
de verso, entre eles o Perl, PostgreSQL e o Android, alavancando sua
popularidade entre a comunidade de desenvolvimento de software.
Atualmente, os principais projetos da comunidade Java JBoss,
Spring, Apache e Eclipse encontram-se em processo de migrao do
SVN para o Git. O projeto Eclipse, inclusive, desenvolveu uma verso
100% Java do Git, o JGit.
Em paralelo, surge o GitHub, um site de compartilhamento de cdigo
com base no Git que levou o conceito do ento concorrente
SourceForge ao encontro das redes sociais: o chamado Social Coding.
Uma de suas principais caractersticas est na simplicidade da criao
de trabalhos derivativos ou forks graas ao recurso de
sincronizao de cdigo entre mltiplos repositrios remotos do
sistema de controle de verso distribudo. Ao criar um fork, o
repositrio do usurio passa a ser uma cpia de outro repositrio do
Github. Dessa forma, possvel sincronizar as alteraes do repositrio
original com o repositrio do usurio, e assim alterar e gerar novas
verses de qualquer projeto disponibilizado na rede do Github. Isto
possibilita a divulgao de contribuies ao projeto original atravs de
pull requests, outro recurso de sistemas de controle de verso
distribudos que ser visto com mais detalhes adiante.

Conceitos
O modelo distribudo de controle de verso parte de conceitos que vo
alm do simples fato de eliminar um ponto nico de falha do modelo
centralizado, mas que esto relacionados ao aspecto colaborativo no
processo de desenvolvimento de software. O sistema distribudo possui
a flexibilidade para atender os mais diversos fluxos de trabalho
(workflows). A descentralizao permite a qualquer desenvolvedor
contribuir com um projeto sem a necessidade de permisso de escrita

02/08/2016 14:13

As diferenas entre Git e SVN - Revista Java Magazine 116

5 de 15

http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=28079

em um repositrio central, mas tambm possvel trabalhar com um


repositrio eleito como central de forma similar ao modelo
centralizado. A seguir, listamos alguns dos fluxos de trabalho mais
comuns do modelo distribudo:
Modelo de repositrio compartilhado: neste fluxo, as alteraes so
consolidadas em um repositrio central. Este repositrio pode ser
mediado por um sistema de aprovao, como o caso do Gerrit,
utilizado no projeto Android, onde todo commit passa por um processo
de reviso de cdigo;
Modelo de pull requests: neste fluxo, as alteraes so obtidas sob
demanda. O desenvolvedor trabalha somente em seu repositrio
pessoal, comunicando aos interessados para que recuperem as
mudanas diretamente de seu repositrio. Esse o modelo utilizado
pelo GitHub.
Mesmo com a utilizao de um repositrio comum, o uso do sistema
de controle de verso distribudo implica em uma mudana de
paradigma em relao ao modelo centralizado (observe a Figura 1).
No modelo distribudo, cada desenvolvedor possui um repositrio local
gerado a partir da cpia integral (clone) do repositrio de origem (na
Figura 2, representado como um repositrio na nuvem).

02/08/2016 14:13

As diferenas entre Git e SVN - Revista Java Magazine 116

6 de 15

http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=28079

Figura 1. Modelo centralizado.

02/08/2016 14:13

As diferenas entre Git e SVN - Revista Java Magazine 116

7 de 15

http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=28079

Figura 2. Modelo distribudo.


Como o desenvolvedor trabalha em sua cpia local, as alteraes de
cdigo so feitas sem latncia de rede (offline). A sincronizao entre
o repositrio local e o repositrio remoto pode ser feita em lotes, ao
invs de transferir commits um a um pela rede, como ocorre no
modelo centralizado. No sistema de controle de verso distribudo, o
envio de commits a outro repositrio a operao denominada push e
o recebimento de commits a operao denominada pull.
Um sistema de controle de verso distribudo capaz de detectar
automaticamente e de forma transparente qualquer movimentao
e/ou renomeao de arquivos, possibilitando o merge do cdigo entre
repositrios mesmo em arquivos de nomes e/ou localizaes
diferentes. Essa operao conhecida como merge-through-rename.

02/08/2016 14:13

As diferenas entre Git e SVN - Revista Java Magazine 116

8 de 15

http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=28079

No Git, em especial, isso possibilitado pelo fato de versionar o


contedo (snapshots) de cada arquivo, e no simplesmente o prprio
arquivo e seus deltas, como ocorre no SVN. Mais detalhes a respeito
das diferenas entre as representaes do SVN e Git sero
apresentados a seguir.

Comparativo
No SVN, um fluxo comum de trabalho consiste na transferncia
(checkout) de um determinado diretrio ou branch do servidor para
uma cpia local na rea de trabalho. Com isso, o desenvolvimento
feito somente com base nos arquivos encontrados nesta estrutura de
diretrios, que representa a rea de trabalho do desenvolvedor. No
Git, como o repositrio do desenvolvedor consiste em uma cpia
integral do repositrio remoto, particion-lo em subdiretrios no tem
o mesmo significado, j que o checkout ocorre aps o clone, portanto
todos os arquivos encontram-se presentes no sistema de arquivos do
cliente.
A rea de trabalho do desenvolvedor gerada aps o checkout de um
determinado branch. Aps o clone, o Git efetua o checkout de um
branch inicial, denominado master, semelhante ao trunk no
Subversion. Branches e merges tm papel fundamental no modelo
distribudo. Cada desenvolvedor trabalha em um branch local que, por
sua vez, associado a um branch remoto, ou tracking branch. Ao
sincronizar os repositrios atravs da operao de pull, se houve
qualquer alterao no branch remoto, um merge commit ser gerado
entre o branch local e o branch remoto. Caso contrrio, as alteraes
locais sero aplicadas no branch remoto sequencialmente (fastforward). No Git, os merges so representados por pontos de
convergncia no histrico de verses, ilustrado na primeira coluna da
Figura 3.

02/08/2016 14:13

As diferenas entre Git e SVN - Revista Java Magazine 116

9 de 15

http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=28079

abrir imagem em nova janela


Figura 3. Representao grfica do histrico de verso.
Ao contrrio do SVN, que mantm um nmero sequencial de revises,
no Git as revises encontram-se distribudas em mltiplos repositrios,
identificadas unicamente por um hash. Um commit de um
desenvolvedor deve gerar um hash distinto do commit de outro
desenvolvedor, j que a coliso levaria o sistema a considerar os
commits como idnticos. O Git gera o hash com 40 caracteres
(SHA-1), mas em geral bastam os primeiros caracteres desse hash
para identificar um commit (ilustrado na terceira coluna da Figura 3).
Enquanto o SVN representa branches e tags como diretrios, no Git
eles so representados por ponteiros. Um commit consiste em um
ponteiro para o commit-pai (ou pais, no caso de merges) e um
conjunto de metadados, como autor, data e comentrio. Ao associar
um novo commit a um branch, este passa ento a apontar para esse
commit. A tag, por sua vez, um ponteiro esttico para um
determinado commit. O Git permite a criao de tags anotadas, isto ,
uma tag com metadados associados, com a mesma semntica de um
commit.
No SVN, todos os commits so registrados permanentemente no
histrico de verses, sendo possvel recuperar ou reverter qualquer
commit que tenha sido efetuado no passado. J no GIT, um commit
pode desaparecer do sistema de controle de verso caso todas as
referncias de branches ou tags para este commit forem removidas.
Isto ocorre porque objetos (commits) sem referncias (no caso,
branches ou tags) so eleitos para serem coletados pelo garbage
collector (git gc). Apesar disto, toda alterao de ponteiros

02/08/2016 14:13

As diferenas entre Git e SVN - Revista Java Magazine 116

10 de 15

http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=28079

registrada (reflog), sendo possvel mover um branch para apontar


para um commit em um ponto anterior do histrico de revises (caso o
commit ainda no tenha sido removido pelo coletor). A Figura 4
apresenta um branch master, sua associao a commits e rvore
de arquivos.

Figura 4. Representao simplificada de um snapshot do Git.


Outra diferena est na configurao de um repositrio compartilhado.
No SVN, ela envolve a criao de um repositrio em um local distinto
da rea de trabalho do cliente. No Git, o prprio repositrio local do
desenvolvedor pode ser compartilhado para leitura, porm para o
compartilhamento para escrita deve-se gerar um novo clone sem
incluir a rea de trabalho, atravs da opo bare (ver Nota do
DevMan 1):
git clone --bare <REPOSITORIO>/ ../<REPOSITORIO>.git

Nota do DevMan 1. Repositrio Bare


Repositrio habilitado a aceitar requisies de push, contendo so
mente os arquivos de sistema do Git, sem a rvore de trabalho. Id

02/08/2016 14:13

As diferenas entre Git e SVN - Revista Java Magazine 116

11 de 15

http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=28079

entificado, por conveno, pelo sufixo .git.

O repositrio Git, assim como o SVN, pode ser acessado via HTTP. O
Git utiliza o Smart HTTP (ver Nota do DevMan 2) para esse
propsito, com as permisses de usurios configuradas em um
servidor Apache, por exemplo, via LDAP. Para acesso a leitura, o
comando git instaweb disponibiliza o repositrio para visualizao a
partir dos servidores lighthttpd (Linux) e webrick (Mac).

Nota do DevMan 2. Smart HTTP


Protocolo RPC para acesso interativo ao Git. Disponvel desde a ve
rso 1.6.6, permite as operaes de clone, push e pull de um repo
sitrio remoto via HTTP/HTTPS, atravs de um script CGI como alt
ernativa ao WebDAV.

Assim como o protocolo svn://, o repositrio Git pode ser


disponibilizado para acesso TCP/IP via protocolo git://. Para o acesso
via SSH, o Git acompanha o git shell para restringir o acesso somente
a comandos pr-definidos no servidor. Para um controle de permisso
de usurios mais refinado, h ferramentas de terceiros, como o
Gitorious, Gitolite ou o Gerrit [1].
Alguns prs e contras podem ser observados na migrao ao modelo
de controle de verso distribudo do Git. Entre as desvantagens do Git
temos a maior curva de aprendizado, decorrente da mudana de
paradigma e da prpria flexibilidade trazida pelo modelo distribudo.
As revises deixam de ser sequenciais e deve-se adaptar o fluxo de
trabalho a cada projeto. Outro fator o aumento do uso de espao em
disco do lado do cliente, decorrente do clone do repositrio remoto, o
que no ideal para arquivos binrios que no se beneficiam das
ferramentas de compactao de cdigo-fonte includas no Git.

02/08/2016 14:13

As diferenas entre Git e SVN - Revista Java Magazine 116

12 de 15

http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=28079

Por outro lado, entre as vantagens do Git destaca-se a flexibilidade de


workflows para atender as mais diversas equipes de desenvolvimento.
O trabalho offline promove agilidade ao eliminar a latncia de rede, e
permite a qualquer desenvolvedor contribuir com o projeto
indiretamente a partir de pull requests ou mesmo com a simples
criao de branches locais. Outro aspecto positivo o fluxo natural de
trabalho com branches e merges no Git, j que toda interao no
sistema de controle distribudo envolve o merge entre um branch local
e outro remoto. E mesmo quando h merges entre branches distintos,
o processo semelhante ao do dia a dia do desenvolvedor, muitas
vezes ocorrendo de forma transparente.
Por ltimo, h comandos disponveis no Git para praticamente
qualquer operao no histrico de verses. Isso inclui desde a
possibilidade de voltar a uma verso de minutos atrs (git checkout
"@{10 minutes ago}"), a buscar comentrios usando expresses
regulares (git show :/^JIRA). A referncia completa encontra-se no
manual que acompanha a instalao do Git, em duas categorias:
comandos de baixo-nvel (plumbing) e comandos de alto-nvel
(porcelain, como os citados neste artigo).
Apesar das diferenas, muitos comandos do Git so correlacionados
aos comandos do SVN, como o git status, git blame, git add e git
commit. Porm, o git revert e o git checkout tm comportamentos
distintos de seus correlatos. Observe a Tabela 1.

02/08/2016 14:13

As diferenas entre Git e SVN - Revista Java Magazine 116

13 de 15

http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=28079

Tabela 1. Comparativo entre comandos do Git e Svn.


Alm das ferramentas de linha de comando, o Git inclui as ferramentas
grficas gitk e git-gui, para navegar no histrico de verses e interagir
com o repositrio, respectivamente. Caso o desenvolvedor tenha
familiaridade com o TortoiseSVN, a mesma ferramenta est disponvel
para o Git o TortoiseGit que pode ser til para reduzir a curva de
aprendizado, alm de incluir uma verso integrada do manual do Git e
do livro Pro Git [3].

Integrao com o SVN


O Git possui interoperabilidade com o prprio SVN por meio da suite
de comandos git svn. O comando a seguir efetua a operao de clone
de um repositrio remoto SVN:
git svn clone http://my-project.googlecode.com/svn
O clone gerado pelo git svn pode ser utilizado tambm para a
migrao do repositrio remoto ao Git. Como o histrico de verses do
SVN preservado, basta fazer o push dos arquivos para um
repositrio bare do Git.
Em um ambiente corporativo, o procedimento para esse tipo de
migrao envolve consideraes como a migrao da base de usurios
do SVN ao Git [2] que fogem ao escopo desse artigo. Porm,
importante ressaltar que h diferenas fundamentais entre o Git e o
SVN. O Git otimizado para gerenciar cdigo-fonte, e no arquivos
binrios, e por sua natureza distribuda o repositrio ser replicado
integralmente entre os desenvolvedores pode ser necessrio
subdividir o repositrio SVN em vrios repositrios Git.
O Git tambm se integra ferramenta de build Maven, por meio do
maven-scm-plugin. Para isto, basta indicar o repositrio remoto
fazendo uso do prefixo scm:git, conforme indica a Listagem 1.

02/08/2016 14:13

As diferenas entre Git e SVN - Revista Java Magazine 116

14 de 15

http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=28079

Listagem 1. Linha do pom.xml com configurao do SCM para


repositrios de leitura (fetch) e escrita (push).
<scm>
<developerConnection>scm:git:[fetch=]ssh://git@dev1/~/sample.git
[push=]ssh://git@dev2/~/sample.git</developerConnection>
</scm>

Por fim, vale ressaltar que as IDEs NetBeans e IntelliJ possuem


suporte nativo ao Git, e o Eclipse disponibiliza o plugin EGit desde a
verso 3.6. J a distribuio STS (Spring Tool Suite) do Eclipse inclui
este plugin em sua instalao padro (Figura 5).

Figura 5. EGit: plugin do Eclipse para Git.

Concluses
Assim como toda mudana de paradigma, migrar de um sistema como
o SVN para o Git passa de uma fase inicial de negao (Por que
migrar se o sistema atual funciona bem?) para a fase de aceitao
(Como era possvel trabalhar sem o DVCS?) a partir do
aprimoramento no processo de desenvolvimento de software.
Os sistemas de controle de verso distribudos propem-se a resolver
problemas de controle de verso com uma abordagem inovadora, com
formas aprimoradas de se interagir e compartilhar cdigos-fonte. O

02/08/2016 14:13

As diferenas entre Git e SVN - Revista Java Magazine 116

15 de 15

http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=28079

artigo procurou enfatizar diferenas conceituais entre os sistemas Git e


SVN com o objetivo de minimizar o impacto inicial em um processo de
adoo do DVCS, que ter mais chances de ser bem sucedido com a
assimilao dos conceitos que embasam o modelo distribudo
combinado experincia prtica em sua adoo para a soluo de
problemas do mundo real.

Links
Wiki oficial do Git.
[1] git.wiki.kernel.org
Case de migrao de SVN para Git.
[2] drdobbs.com/240009175
Livros
[3] Pro Git, Scott Chacon, Editora Apress, 2009
Livro disponvel no site oficial do Git.

por Camila Sanches


Expert em Java e programao Web

02/08/2016 14:13

Вам также может понравиться