Por que Git é melhor que Subversion?


393

Uso o Subversion há alguns anos e, depois de usar o SourceSafe , adoro o Subversion. Combinado com o TortoiseSVN , não consigo imaginar como poderia ser melhor.

No entanto, há um número crescente de desenvolvedores alegando que o Subversion tem problemas e que devemos mudar para a nova geração de sistemas de controle de versão distribuídos, como o Git .

Como o Git melhora o Subversion?

Respostas:


548

Git não é melhor que Subversion. Mas também não é pior. É diferente.

A principal diferença é que ele é descentralizado. Imagine que você é um desenvolvedor em trânsito, desenvolve no seu laptop e deseja ter controle de origem para poder voltar por 3 horas.

Com o Subversion, você tem um Problema: O Repositório SVN pode estar em um local que você não pode alcançar (na sua empresa, e você não tem Internet no momento), não pode confirmar. Se você deseja fazer uma cópia do seu código, você deve literalmente copiar / colar.

Com o Git, você não tem esse problema. Sua cópia local é um repositório, e você pode se comprometer com ela e obter todos os benefícios do controle de origem. Ao recuperar a conectividade com o repositório principal, você pode se comprometer com ele.

Isso parece bom no começo, mas lembre-se da complexidade adicional dessa abordagem.

Git parece ser a coisa "nova, brilhante, legal". Não é nada ruim (afinal, existe uma razão pela qual Linus o escreveu para o desenvolvimento do Linux Kernel), mas sinto que muitas pessoas pulam no trem "Distributed Source Control" apenas porque é novo e foi escrito por Linus Torvalds, sem realmente saber porque / se é melhor.

O Subversion tem problemas, mas o Git, Mercurial, CVS, TFS ou o que quer.

Edit: Então, esta resposta agora tem um ano e ainda gera muitos votos, então pensei em adicionar mais algumas explicações. No ano passado, desde que escrevemos isso, o Git ganhou muito ímpeto e suporte, principalmente desde que sites como o GitHub realmente decolaram. Atualmente, estou usando o Git e o Subversion e gostaria de compartilhar algumas informações pessoais.

Primeiro de tudo, o Git pode ser realmente confuso a princípio quando se trabalha descentralizado. O que é um controle remoto? e Como configurar corretamente o repositório inicial? Existem duas perguntas que surgem no início, especialmente quando comparadas com o simples "svnadmin create" do SVN, o "git init" do Git pode usar os parâmetros --bare e --shared, que parecem ser a maneira "adequada" de configurar uma centralizada repositório. Existem razões para isso, mas adiciona complexidade. A documentação do comando "checkout" é muito confusa para as pessoas que estão mudando - a maneira "correta" parece ser "git clone", enquanto "git checkout" parece mudar de ramificação.

Git REALMENTE brilha quando você é descentralizado. Eu tenho um servidor em casa e um laptop na estrada, e o SVN simplesmente não funciona bem aqui. Com o SVN, não posso ter controle de fonte local se não estiver conectado ao repositório (Sim, eu sei sobre o SVK ou sobre maneiras de copiar o repositório). Com o Git, esse é o modo padrão de qualquer maneira. Porém, é um comando extra (o git commit confirma localmente, enquanto o git push origin master envia a ramificação master para o controle remoto chamado "origin").

Como dito acima: Git adiciona complexidade. Dois modos de criação de repositórios: checkout x clone, commit x push ... Você precisa saber quais comandos funcionam localmente e quais funcionam com "o servidor" (presumo que a maioria das pessoas ainda goste de um "repositório principal" central )

Além disso, as ferramentas ainda são insuficientes, pelo menos no Windows. Sim, existe um suplemento do Visual Studio, mas ainda uso o git bash com o msysgit.

O SVN tem a vantagem de ser MUITO mais simples de aprender: existe o seu repositório, todas as alterações em relação a ele, se você sabe como criar, confirmar e finalizar a compra e está pronto para começar e pode pegar coisas como ramificação, atualização etc. em.

O Git tem a vantagem de ser MUITO melhor se alguns desenvolvedores nem sempre estiverem conectados ao repositório principal. Além disso, é muito mais rápido que o SVN. Pelo que ouvi, ramificar e mesclar o suporte é muito melhor (o que é esperado, pois esses são os principais motivos pelos quais ele foi escrito).

Isso também explica por que ganha tanto burburinho na Internet, pois o Git é perfeitamente adequado para projetos de código aberto: Just Fork, comprometa suas alterações no seu próprio Fork e peça ao mantenedor do projeto original para fazer suas alterações. Com o Git, isso simplesmente funciona. Realmente, tente no Github, é mágico.

O que eu também vejo são as pontes Git-SVN: O repositório central é um repositório do Subversion, mas os desenvolvedores trabalham localmente com o Git e a ponte envia suas alterações ao SVN.

Mas, mesmo com essa longa adição, ainda mantenho minha mensagem principal: o Git não é melhor ou pior, é apenas diferente. Se você precisa do "Controle de fonte offline" e está disposto a gastar um tempo extra aprendendo, é fantástico. Mas se você tem um controle de fonte estritamente centralizado e / ou está lutando para introduzir o controle de origem em primeiro lugar porque seus colegas de trabalho não estão interessados, a simplicidade e as excelentes ferramentas (pelo menos no Windows) do SVN brilham.


70
Uma Ferrari não é melhor que uma Hyundai. Mas também não é pior. É diferente. (? Que Não olhe-me desta maneira ... Eu disse algo errado?)
FDCastel

219
Não, você não fez. Uma Ferrari é impraticável, cara, sedenta e não melhora de A para B se você mora em uma cidade como Nova York ou Paris - eu prefiro um Hyundai para muitos lugares, também porque um arranhão é muito menos grave. Mas cada um na sua - uma Ferrari também tem (muito poucas) vantagens ...
Michael Stum

50
Distribuição não é a única diferença entre Subversion e Git. Também não adiciona nenhuma complexidade, a menos que você use vários repositórios. Existem muitas vantagens em usar o Git em vez do Subversion, mas apenas algumas (principalmente insignificantes) desvantagens. O Git é usado porque é bom, não brilhante.
11139 sebnow

6
Minhas experiências com o git não são exatamente uma "revelação que muda a vida". Considero uma ótima ferramenta quando funciona, quando não funciona, parece um pouco polido. Não fiquei muito impressionado com coisas de depuração como a Pergunta 1052882, e mesmo que isso seja claramente um problema de RTFM: considero o git (e quaisquer outros vcs distribuídos) mais complicado que os centralizados, e considero usá-lo em ambientes centralizados . Mas, novamente, sou principalmente desenvolvedor de Windows e as ferramentas ainda são imaturas no Windows, em comparação com o SVN.
Michael Stum

5
Você analisa apenas o aspecto da distribuição na comparação. Eu vou te dizer o porquê. Porque você deseja apenas compartilhar código. Git e SVN são mais do que isso: você já marcou, ramificou, mesclou, resolveu conflitos, copiou patches entre ramificações? Eu acho que sua análise é falha. Nesses aspectos, o git é uma ferramenta MUITO poderosa. Sem mencionar as coisas que o git pode, e o SVN não pode, como esmagar, dissecar, alterar, refazer, refazer, escolher a cereja e muito mais.
mschonaker

145

Com o Git, você pode fazer praticamente qualquer coisa offline, porque todo mundo tem seu próprio repositório.

Fazer filiais e mesclar filiais é realmente fácil.

Mesmo se você não tiver direitos de confirmação para um projeto, ainda poderá ter seu próprio repositório online e publicar "solicitações push" para seus patches. Qualquer pessoa que goste dos seus patches pode inseri-los em seu projeto, incluindo os mantenedores oficiais.

É trivial bifurcar um projeto, modificá-lo e ainda continuar se mesclando nas correções de erros do ramo HEAD.

O Git funciona para os desenvolvedores do kernel do Linux. Isso significa que é realmente rápido (tem que ser) e é escalável para milhares de colaboradores. O Git também usa menos espaço (até 30 vezes menos espaço para o repositório Mozilla).

O Git é muito flexível, muito TIMTOWTDI (existe mais de uma maneira de fazer isso). Você pode usar o fluxo de trabalho que desejar e o Git o apoiará.

Por fim, existe o GitHub , um ótimo site para hospedar seus repositórios Git.

Desvantagens do Git:

  • é muito mais difícil aprender, porque o Git tem mais conceitos e mais comandos.
  • revisões não têm números de versão como no subversion
  • muitos comandos Git são enigmáticos e as mensagens de erro são muito hostis ao usuário
  • falta uma boa interface gráfica (como o grande TortoiseSVN )

31
Embora aprender tudo sobre o Git seja muito mais difícil, o básico é quase idêntico. O escopo de aprendizado não é tão acentuado até você entrar no material mais avançado, do qual o SVN simplesmente não é capaz.
sebnow 12/02/09

10
+1 para mim. Eu acho que muitos desenvolvedores esquecem que o git está faltando algo como o TortoiseSVN, e que não apenas os desenvolvedores usam o controle de versão. Estremeço ao pensar em ter que explicar (e dar suporte) ao controle de versão distribuído para nossos não desenvolvedores usando o SVN | TortoiseSVN!
236 de si618

7
Outra desvantagem - você tem que ter uma cópia completa do repositório, você não pode trabalhar em parciais (que importa se você tem aqueles enormes, como um monte de empresas)
gbjbaanb

3
Eu amo o git, mas levei cerca de seis meses de uso diário para realmente usá-lo efetivamente. Dito isto, eu uso uma combinação do shell git (prompt de comando) do msysgit, git gui e gitk do msysgit e TortoiseGit. Eu acho que o TortoiseGit é ótimo, mas não entendo por que mais pessoas não o usam. Eu sei que os mantenedores do msysgit detestam o TortoiseGit por vários motivos, alguns deles ideológicos, e que podem ter algo a ver com isso. TortoiseGit é um segredo bem guardado!
Jim Raden

2
Concordo. Eu uso o SVN e o GIT (há cerca de 6 meses). Eu sinceramente amo o git muito mais do que nunca o SVN. Leva apenas tempo para aprender. O maior salto para mim (no momento em que vi a luz: P) foi quando finalmente percebi que tinha que parar de tentar usar o GIT da maneira como o SVN funcionava. Então tudo se
encaixou

110

Outras respostas fizeram um bom trabalho ao explicar os principais recursos do Git (que são ótimos). Mas há também muitas pequenas maneiras que Git se comporta melhor e ajuda a manter minha vida mais sã. Aqui estão algumas das pequenas coisas:

  1. O Git tem um comando 'limpo'. O SVN precisa desesperadamente desse comando, considerando a frequência com que ele irá despejar arquivos extras no seu disco.
  2. Git tem o comando 'bisect'. É legal.
  3. O SVN cria diretórios .svn em todas as pastas (o Git cria apenas um diretório .git). Todo script que você escreve e todo grep que você faz, precisam ser escritos para ignorar esses diretórios .svn. Você também precisa de um comando inteiro ("svn export") apenas para obter uma cópia sã de seus arquivos.
  4. No SVN, cada arquivo e pasta pode vir de uma revisão ou ramificação diferente. A princípio, parece bom ter essa liberdade. Mas o que isso realmente significa é que existem milhões de maneiras diferentes para que seu checkout local seja completamente estragado. (por exemplo, se "svn switch" falhar na metade ou se você digitar um comando errado). E a pior parte é: se você entrar em uma situação em que alguns de seus arquivos vêm de um lugar e outros de outro, o "svn status" dirá que tudo está normal. Você precisará fazer "svn info" em cada arquivo / diretório para descobrir como as coisas são estranhas. Se o "status git" diz que as coisas estão normais, você pode confiar que as coisas realmente são normais.
  5. Você precisa informar o SVN sempre que mover ou excluir algo. O Git vai descobrir isso.
  6. Ignorar semântica é mais fácil no Git. Se você ignorar um padrão (como * .pyc), ele será ignorado para todos os subdiretórios. (Mas se você realmente deseja ignorar algo em apenas um diretório, pode). Com o SVN, parece que não há uma maneira fácil de ignorar um padrão em todos os subdiretórios.
  7. Outro item envolvendo ignorar arquivos. O Git possibilita que as configurações de ignição "privadas" (usando o arquivo .git / info / exclude), não afetem ninguém.

2
De Anúncios. 7. Com o git moderno, você também pode ter a configuração "privada" de ignorar por usuário, usando a variável de configuração core.excludesFile no ~ .gitignore (consulte man git-config).
Jakub Narębski 23/02/09

3
Re # 5: Enquanto isso normalmente é verdade, às vezes o Git estraga tudo. Pelo menos no Subversion, os problemas devidos à movimentação ou exclusão são quase invariavelmente um PEBKAC. Embora seja bom ter um rastreamento automático de movimentação / exclusão, ainda assim eu apreciaria a capacidade de declarar explicitamente o que estou fazendo com os arquivos no repositório, mesmo que não precise usá-lo.
Chris Charabaruk

8
@ Chris: Você pode fazê-lo explicitamente: git mve git rm.
R. Martinho Fernandes

2
Eu também gostaria de ver a opção de um único diretório .svn por cópia de trabalho, mas para o registro: Para # 3: A maioria das ferramentas (por padrão) ignorará os diretórios .svn. Para # 6: você pode definir propriedades recursivamente.
si618

6
3: "um único diretório .svn" estará aqui com o SVN 1.7 quando o WC-NG for implementado. 1: Para obter a limpeza do SVN, você 'exporta' pela parte superior do seu WC. 5: não é tão fácil, se você renomear um arquivo, o git o reconhece e mantém o histórico, ou o trata como um add e delete no diretório ?. 6/7: svn possui global-ignora por configuração de cliente do usuário.
Gbjbaanb 15/10/09

56

" Por que o Git é melhor que o X " descreve os vários prós e contras do Git versus outros SCMs.

Resumidamente:

  • O Git rastreia o conteúdo em vez de arquivos
  • Os ramos são leves e a fusão é fácil , e eu quero dizer muito fácil .
  • É distribuído, basicamente todo repositório é um ramo. É muito mais fácil desenvolver simultaneamente e colaborativamente do que com o Subversion, na minha opinião. Também possibilita o desenvolvimento offline .
  • Ele não impõe nenhum fluxo de trabalho , como visto no site vinculado acima , existem muitos fluxos de trabalho possíveis com o Git. Um fluxo de trabalho no estilo do Subversion é facilmente imitado.
  • Os repositórios Git são muito menores em tamanho de arquivo que os repositórios Subversion. Há apenas um diretório ".git", em oposição a dezenas de repositórios ".svn" (note que o Subversion 1.7 e superior agora usa um único diretório como o Git.)
  • A área de preparação é incrível, permite ver as alterações que você confirmará, confirmará alterações parciais e fará várias outras coisas.
  • O armazenamento em cache é inestimável quando você faz um desenvolvimento "caótico" ou simplesmente deseja corrigir um erro enquanto ainda está trabalhando em outra coisa (em um ramo diferente).
  • Você pode reescrever o histórico , o que é ótimo para preparar conjuntos de patches e corrigir seus erros ( antes de publicar as confirmações)
  • ... e muito mais.

Existem algumas desvantagens:

  • Ainda não existem muitas boas GUIs para isso. É novo e o Subversion existe há muito mais tempo, então isso é natural, pois existem algumas interfaces em desenvolvimento. Alguns bons incluem o TortoiseGit e o GitHub para Mac .
  • Checkouts / clones parciais de repositórios não são possíveis no momento (eu li que ele está em desenvolvimento). No entanto, há suporte ao submódulo. O Git 1.7+ suporta checkouts esparsos .
  • Pode ser mais difícil de aprender, mesmo que eu não tenha achado esse o caso (cerca de um ano atrás). O Git melhorou recentemente sua interface e é bastante amigável.

No uso mais simplista, Subversion e Git são praticamente os mesmos. Não há muita diferença entre:

svn checkout svn://foo.com/bar bar
cd bar
# edit
svn commit -m "foo"

e

git clone git@github.com:foo/bar.git
cd bar
# edit
git commit -a -m "foo"
git push

Onde o Git realmente brilha é ramificar e trabalhar com outras pessoas.


8
Você diz que o GIT rastreia o conteúdo em vez de arquivos. Descobri que o SVN também faz isso: fiz apenas alterações em um arquivo e salvei-o. O SVN mostrou o arquivo como vermelho (alterado). Então desfiz no editor e salvei novamente. O SVN atualizou o status para verde (não alterado), mesmo que o arquivo tenha sido alterado (altere a data mais recente), mas o SVN reconheceu que o conteúdo não foi alterado do original.
temor

o svn rastreia alterações entre arquivos?
Seun Osewa

12
@we, isso é chamado de rastreamento de arquivos. tente renomear o arquivo ou mova-o para outro lugar manualmente [mesmo conteúdo, novo arquivo (por causa do novo caminho / nome)]: o SVN saberá que é o mesmo arquivo e manterá as inúmeras revisões anteriores que você fez nele? não, acho que não.
Filip Dupanović


54

Google Tech Talk: Linus Torvalds no git

http://www.youtube.com/watch?v=4XpnKHJAok8

A página de comparação do Git Wiki

http://git.or.cz/gitwiki/GitSvnComparsion


12
A conversa de Linus é divertida de assistir. Ele brutalmente rasga sistemas de controle de versão centralizados como Subversion e CVS. No entanto, a conversa no youtube.com/watch?v=8dhZ9BXQgc4 de Randal Schwartz é mais construtiva, mais informativa e mais convincente.
bendin

2
Este também é muito bom. É de um dos commits do git e ele explica muitos recursos avançados, como dividir grandes commits em menores. youtube.com/watch?v=j45cs5_nY2k
schoetbi

Gosto do vídeo de Linus Torvalds, mas ele implica que o git é distribuído, não centralizado, e isso está errado. Pode ser usado de maneira distribuída, OU de maneira centralizada. Você pode ter um repositório central no qual todos se comprometem, assim como no SVN. Só que você não precisa fazer dessa maneira.
MatrixFrog

@MatrixForog: Eu acho que, neste caso, "descentralizado" não é o oposto de "centralizado", mas realmente um superconjunto. É como "móvel" e "imóvel" - só porque algo é "móvel" não significa que eu não possa ficar parado.
Tikhon Jelvis

26

Bem, é distribuído. Os benchmarks indicam que é consideravelmente mais rápido (dada a sua natureza distribuída, operações como diffs e logs são todos locais, então é claro que é incrivelmente mais rápido nesse caso) e as pastas de trabalho são menores (o que ainda me impressiona).

Quando você está trabalhando no subversion, ou em qualquer outro sistema de controle de revisão de cliente / servidor, você essencialmente cria cópias de trabalho em sua máquina, verificando as revisões. Isso representa uma captura instantânea da aparência do repositório. Você atualiza sua cópia de trabalho por meio de atualizações e o repositório por confirmações.

Com um controle de versão distribuído, você não tem um instantâneo, mas toda a base de código. Quer fazer uma diff com uma versão antiga de 3 meses? Não tem problema, a versão de 3 meses ainda está no seu computador. Isso não significa apenas que as coisas são muito mais rápidas, mas se você estiver desconectado do servidor central, ainda poderá executar muitas das operações com as quais está acostumado. Em outras palavras, você não apenas tem um instantâneo de uma determinada revisão, mas toda a base de código.

Você pensaria que o Git ocuparia muito espaço no seu disco rígido, mas a partir de alguns benchmarks que eu vi, na verdade, leva menos. Não me pergunte como. Quero dizer, foi construído por Linus, ele sabe uma coisa ou duas sobre sistemas de arquivos, eu acho.


11
A causa pela qual o Git pode ocupar menos espaço em disco para o repositório completo do que o Subversion para um simples checkout é que o Subversion armazena "cópia intocada" para fazer o 'svn diff' (comparação com a última versão) funcionar ... e que o repositório git é compactado (e deltaificado )
Jakub Narębski

3
Não estou surpreso que as "pastas de trabalho" do git (ou seja, repositórios) sejam menores que as cópias de trabalho svn porque mesmo os repositórios svn são menores que as cópias de trabalho svn.
R. Martinho Fernandes

22

Os principais pontos que eu gosto sobre o DVCS são:

  1. Você pode cometer coisas quebradas. Não importa, porque outras pessoas não as verão até que você publique. O tempo de publicação é diferente do tempo de confirmação.
  2. Por isso, você pode se comprometer com mais frequência.
  3. Você pode mesclar a funcionalidade completa. Essa funcionalidade terá seu próprio ramo. Todos os commits deste ramo estarão relacionados a esta funcionalidade. Você pode fazer isso com um CVCS, mas com o DVCS é o padrão.
  4. Você pode pesquisar seu histórico (descobrir quando uma função foi alterada)
  5. Você pode desfazer um puxão se alguém estragar o repositório principal, não é necessário corrigir os erros. Apenas limpe a mesclagem.
  6. Quando você precisar de um controle de origem em qualquer diretório, faça: git init. e você pode confirmar, desfazendo alterações, etc ...
  7. É rápido (mesmo no Windows)

A principal razão para um projeto relativamente grande é a comunicação aprimorada criada pelo ponto 3. Outros são bons bônus.


Acho que o ponto 1 pretende dizer "outras pessoas não os verão até que você publique " (ou "empurre").
jackr

+1 "Você pode cometer coisas quebradas." é a principal razão pela qual estou pensando em mudar para o git a partir do svn. Eu sempre odeio quando estou no meio do desenvolvimento de um bloco de código pesado e não tenho a rede de segurança do VCS (simplesmente porque minhas modificações ainda não funcionam, por isso não tenho permissão para confirmar).
András Szepesházi

15

O engraçado é que eu hospedo projetos no Subversion Repos, mas os acesso através do comando Git Clone.

Leia Desenvolver com Git em um projeto de código do Google

Embora o Google Code fale nativamente o Subversion, você pode facilmente usar o Git durante o desenvolvimento. A busca por "git svn" sugere que essa prática é generalizada, e também recomendamos que você experimente.

Usar o Git em um repositório Svn me oferece benefícios:

  1. Eu posso trabalhar distribuído em várias máquinas, comprometendo e puxando de e para elas
  2. Eu tenho um repositório svn central backup/public para outras pessoas verificarem
  3. E eles são livres para usar o Git por conta própria

3
este é tipo de fora da data, google código não mercurial assim não há necessidade para esse truque mais
Sam Saffron

@ Sam, a menos que goste e / ou não goste de mercurial.
MatrixFrog

11

Todas as respostas aqui são as esperadas, centradas no programador. No entanto, o que acontece se a sua empresa usa o controle de revisão fora do código-fonte? Existem muitos documentos que não são código-fonte que se beneficiam do controle de versão e devem estar próximos ao código e não em outro CMS. A maioria dos programadores não trabalha isoladamente - trabalhamos para empresas como parte de uma equipe.

Com isso em mente, compare a facilidade de uso, nas ferramentas e no treinamento do cliente, entre o Subversion e o git. Não vejo um cenário em que qualquer sistema de controle de revisão distribuído seja mais fácil de usar ou explicar a um não programador. Eu adoraria provar que estou errado, porque então eu seria capaz de avaliar o git e realmente ter a esperança de que ele seja aceito por pessoas que precisam de controle de versão que não são programadores.

Mesmo assim, se perguntado pela gerência por que deveríamos mudar de um sistema de controle de revisão centralizado para distribuído, seria difícil dar uma resposta honesta, porque não precisamos dela.

Isenção de responsabilidade: Fiquei interessado no Subversion desde o início (por volta da v0.29), então obviamente sou tendencioso, mas as empresas nas quais trabalhei desde então estão se beneficiando do meu entusiasmo, porque incentivei e apoiei seu uso. Eu suspeito que é assim que acontece com a maioria das empresas de software. Com tantos programadores pulando na onda do git, imagino quantas empresas perderão os benefícios de usar o controle de versão fora do código-fonte? Mesmo que você tenha sistemas separados para equipes diferentes, está perdendo alguns dos benefícios, como a integração de rastreamento de problemas (unificada), enquanto aumenta os requisitos de manutenção, hardware e treinamento.


IMHO, este é o único motivo válido para favorecer o SVN. Em resumo, é mais fácil explicar para um não programador, ou seja, alguém que esperava usá-lo de maneira linear e evitar cenários complexos (= reais) de VC: conflitos, mesclas de 3 vias, ramificações. nunca quer deixar os VCS mesclar um arquivo de apresentação powerpoint qualquer forma ..
inger

2
"A maioria dos programadores não trabalha isoladamente" parece sugerir que os contadores / profissionais de marketing precisariam usar o mesmo repositório onde o código-fonte é mantido. Não vejo os benefícios disso; algumas das minhas ex-empresas queriam padronizar coisas assim, mas isso inevitavelmente falhou. Eu acho que a abordagem simplista pode ser ótima para o gerente, mas uma simplificação excessiva para as equipes de programadores - portanto, unificar isso leva a um comprometimento ruim.
27410

Para documentos que acompanham o software, você está certo - eles devem ser versionados juntos. Descobri que muito menos do que as pessoas pensam inicialmente (acabamos lançando uma enorme documentação de árvore do repositório de origem). Além disso, há muito o que você pode fazer para simplificar os fluxos de trabalho de redatores de tecnologia etc., caso isso seja um problema (não deveria).
27510

2
@inger Eu não acho que você possa dizer "esse é o único motivo válido", o suporte de ferramentas do AFAIK para o Subversion é muito superior ao Git, por exemplo, TortoiseSVN e integração com o Visual Studio e o Java IDE como o Eclipse. Isso pode não ser um problema para você, mas certamente é para nós. Eu não mencionei isso na minha resposta porque é uma questão separada.
si618

11
@Keyo, sim, é verdade que os não programadores levarão tempo para obter o Subversion, mas acho que eles levarão mais tempo com o git ou o Hg. Os wiki são ótimos se mantidos, mas, na minha experiência, é mais provável que os desenvolvedores mantenham documentos relacionados ao código-fonte se estiverem próximos desse código-fonte. Concordo com o inger por não haver muitos documentos que se encaixem nessa categoria, mas eles certamente existem. É interessante que você diga que o git / Hg é a melhor ferramenta para o trabalho, essa é uma afirmação geral que provavelmente não é verdadeira em todas as circunstâncias. O git e o Hg têm uma integração tão boa quanto o SVN?
si618

9

O Subversion ainda é um sistema de controle de versão muito mais usado, o que significa que ele possui melhor suporte a ferramentas. Você encontrará plug-ins SVN maduros para quase qualquer IDE , e existem boas extensões do explorer disponíveis (como o TurtoiseSVN). Fora isso, terei que concordar com Michael : o Git não é melhor ou pior que o Subversion, é diferente.


Mas agora, depois de usar o git extensivamente por alguns anos, preciso discordar de mim: o Git é muito melhor que o Subversion. Pelo menos uma vez que você supera a sintaxe hostil do Git.
N

8

Uma das coisas sobre o SubVersion que me irrita é que ele coloca sua própria pasta em cada diretório de um projeto, enquanto o git coloca apenas uma no diretório raiz. Não é que de um grande negócio, mas pequenas coisas como que se somam.

Obviamente, o SubVersion possui o Tortoise, o que geralmente é muito bom.


5
os diretórios .svn será ido em breve, provavelmente com v1.7
gbjbaanb

8

David Richards Blog da WANdisco sobre Subversion / GIT

O surgimento do GIT trouxe consigo uma raça de fundamentalistas do DVCS - os 'Gitterons' - que pensam que qualquer coisa que não seja o GIT é uma porcaria. Os Gitterons parecem pensar que a engenharia de software acontece em sua própria ilha e geralmente esquecem que a maioria das organizações não emprega exclusivamente engenheiros de software seniores. Tudo bem, mas não é assim que o resto do mercado pensa, e estou feliz em provar isso: o GIT, no último olhar, ocupava menos de três por cento do mercado, enquanto o Subversion possui cerca de cinco milhões de usuários e cerca de metade dos o mercado em geral.

O problema que vimos foi que os Gitterons estavam disparando tiros baratos no Subversion. Tweets como “O Subversion é tão [lento / ruim / restritivo / não cheira bem / olha para mim de uma maneira engraçada] e agora eu tenho GIT e [tudo funciona na minha vida / minha esposa ficou grávida / eu tenho uma namorada depois] 30 anos de tentativas / ganhei seis vezes consecutivas na mesa de blackjack]. Você entendeu a foto.


11
Note que David Richards pode ser imparcial: o produto que ele fabrica é baseado no Subversion (ou nas idéias do Subversion), então é claro que ele seria pró-Subversion e anti-Git.
Jakub Narębski

2
Ironicamente, o Git foi criado especificamente porque a engenharia de software não acontece nas ilhas. Esta citação é idiota.
Ben Collins

Embora eu use o git, também ficaria muito feliz em trabalhar com qualquer DVCS decente como o Mercurial, por exemplo. Leva tempo para o conceito DVCS ganhar popularidade e agora vejo um grande número de projetos de código aberto migrando para o git.
Keyo 3/05/11

Ao pintar os detratores do svn como fundamentalistas, David está deixando de lado a questão fundamental: a arquitetura do subversion é um beco sem saída. Não é que o git seja o VCS de ponta a ponta, ele tem suas verrugas para ter certeza, mas git, mercurial, darcs e muitos outros VCS possuem modelos de repositório fundamentalmente mais elegantes. O Subversion nunca fará a fusão funcionar porque o modelo de diretório == branch impossibilita o progresso real. Empresas como a de David podem continuar usando mais e mais batons em porcos, mas o svn inevitavelmente ficará cada vez mais atrás do estado da arte.
gtd 25/05

7

O Git também facilita muito a ramificação e a fusão. O Subversion 1.5 acabou de adicionar o rastreamento de mesclagem, mas o Git ainda é melhor. Com o Git, a ramificação é muito rápida e barata. Isso torna a criação de uma ramificação para cada novo recurso mais viável. Os repositórios Oh e Git são muito eficientes com espaço de armazenamento em comparação com o Subversion.


6

É tudo sobre a facilidade de uso / etapas necessárias para fazer alguma coisa.

Se estou desenvolvendo um único projeto no meu PC / laptop, o git é melhor, porque é muito mais fácil de configurar e usar. Você não precisa de um servidor e não precisa continuar digitando os URLs do repositório quando faz a mesclagem.

Se fossem apenas 2 pessoas, eu diria que o git também é mais fácil, porque você pode simplesmente empurrar e puxar um do outro.

Uma vez que você supera isso, eu iria para o subversion, porque nesse momento você precisa configurar um servidor ou local 'dedicado'.

Você pode fazer isso tão bem com o git quanto com o SVN, mas os benefícios do git são superados pela necessidade de executar etapas adicionais para sincronizar com um servidor central. No SVN você apenas confirma. No git, você precisa git commit e git push. A etapa adicional fica irritante simplesmente porque você acaba fazendo isso demais.

O SVN também tem o benefício de melhores ferramentas da GUI, no entanto, o ecossistema git parece estar se recuperando rapidamente, então eu não me preocuparia com isso a longo prazo.


11
A separação entre confirmar e publicar no Git é mais uma vantagem do IMHO do que uma desvantagem.
Jakub Narębski

Ok, então como você classificaria a "facilidade de uso / etapas necessárias para fazer algo" para o SVN quando: - criando uma ramificação de tópico para experimentação - mesclando essa ramificação em outra ramificação - dividindo as coisas editadas em um arquivo em seus próprios commits menores - verificando rapidamente uma ramificação principal para fazer uma pequena correção IMHO Não vejo como configurar um servidor SVN é mais fácil do que configurar seu servidor git. E por que você deseja renunciar a todas as vantagens legais de galhos leves para não precisar "empurrar separadamente".
Sam

O argumento "ramificação de tópicos para experimentação" é frequentemente apresentado a favor do git, mas honestamente, nunca vi alguém fazer isso na subversão ou em outro sistema que não seja o DVCS. Talvez seja um grande negócio e todos nós estamos perdendo, mas pelo que eu vi 99% dos desenvolvedores (inclusive eu) não se importam com as ramificações de tópicos porque nunca as usam! - Você não pode perder o que você nunca teve :-). Eu acho que se as pessoas do DVCS apresentarem "tópicos" como um recurso, primeiro terão que convencer a todos de que essas coisas são realmente úteis.
Orion Edwards

A "divisão das coisas editadas em commits menores", novamente, é algo que soa legal na teoria. Mas, nos últimos 3 anos, eu não uma vez pensei "oh, eu gostaria de poder fazer isso", e eu ainda luta para chegar a uma situação hipotética em que eu poderia querer o recurso de ... Uma grande parte do git Os defensores do DVCS simplesmente dizem "nós temos X e X é incrível" e todo mundo está sentado ali se perguntando por que diabos eles precisariam do X
Orion Edwards

6

O Easy Git tem uma boa página comparando o uso real do Git e do SVN, o que lhe dará uma idéia do que o Git pode fazer (ou fazer mais facilmente) em comparação com o SVN. (Tecnicamente, isso se baseia no Easy Git, que é um invólucro leve sobre o Git.)


5

O Git e o DVCS em geral são ótimos para desenvolvedores que codificam bastante independentemente um do outro, porque todos têm sua própria ramificação. No entanto, se você precisar de uma alteração de outra pessoa, ela deverá se comprometer com o repo local e, em seguida, deverá enviar esse conjunto de alterações para você ou você deverá retirá-lo.

Meu próprio raciocínio também me faz pensar que o DVCS torna as coisas mais difíceis para o controle de qualidade e o gerenciamento de versões se você fizer coisas como versões centralizadas. Alguém tem que ser responsável por fazer esse push / pull do repositório de todos os outros, resolvendo quaisquer conflitos que teriam sido resolvidos no momento da consolidação inicial antes, depois fazendo a compilação e fazendo com que todos os outros desenvolvedores sincronizem novamente seus repositórios.

Tudo isso pode ser tratado com processos humanos, é claro; O DVCS acabou de quebrar algo que foi corrigido pelo controle de versão centralizado para fornecer algumas novas conveniências.


11
Na verdade, se você parece que o próprio kernel Linux ou o projeto git é gerenciado, verá que o Git é muito bom para o fluxo de trabalho de 'mantenedor único' (ou mantenedor + tenentes), com uma central do repositório consens. E facilita mudar temporariamente para outra pessoa como mantenedor.
Jakub Narębski 23/02/09

5

Eu gosto do Git porque ele realmente ajuda o desenvolvedor de comunicação para desenvolvedor em uma equipe de médio a grande porte. Como um sistema de controle de versão distribuído, por meio de seu sistema push / pull, ajuda os desenvolvedores a criar um ecossistema de código-fonte que ajuda a gerenciar um grande conjunto de desenvolvedores trabalhando em um único projeto.

Por exemplo, digamos que você confia em 5 desenvolvedores e apenas extrai códigos de seu repositório. Cada um desses desenvolvedores tem sua própria rede de confiança de onde eles extraem códigos. Assim, o desenvolvimento é baseado nessa estrutura de confiança dos desenvolvedores, onde a responsabilidade do código é compartilhada entre a comunidade de desenvolvimento.

Obviamente, existem outros benefícios mencionados em outras respostas aqui.


4

Algumas respostas aludiram a elas, mas quero deixar explícito 2 pontos:

1) A capacidade de realizar confirmações seletivas (por exemplo git add --patch). Se o seu diretório de trabalho contiver várias alterações que não fazem parte da mesma alteração lógica, o Git facilita muito a confirmação, que inclui apenas uma parte das alterações. Com o Subversion, é difícil.

2) A capacidade de se comprometer sem tornar a mudança pública. No Subversion, qualquer commit é imediatamente público e, portanto, irrevogável. Isso limita bastante a capacidade do desenvolvedor de "confirmar cedo, confirmar frequentemente".

Git é mais do que apenas um VCS; também é uma ferramenta para o desenvolvimento de patches. Subversion é apenas um VCS.


4
Re 1) Se você estiver usando TortoiseSVN, AnkhSVN, etc., é muito fácil (trivial) selecionar quais arquivos com alterações serão confirmadas. Re 2) Se você não quiser que outros desenvolvedores obtenham seu código, crie uma ramificação e mescle quando estiver pronto, não é difícil.
si618

irrevogável? Bem, você pode reverter a mesclagem do commit defeituoso e o repositório é como era antes. Mas você está certo, está documentado. Mas isso é bom ou ruim? Eu acho que isso depende ...
schoetbi 23/09

@schoetbi Não, o chefe do repositório é como era antes. O próprio repositório agora contém dois commits, enquanto que seria bom se nenhum deles estivesse lá. É uma bagunça extra que diminui a velocidade quando você está olhando através dos logs. Obviamente, isso também pode acontecer com o git, especialmente se alguns desenvolvedores costumam pressionar imediatamente após a confirmação. Mas é muito mais fácil evitar no git.
MatrixFrog

4

Eu acho que o Subversion está bem .. até você começar a mesclar .. ou fazer qualquer coisa complicada .. ou fazer qualquer coisa que o Subversion considere complicado (como fazer consultas para descobrir quais ramificações mexeram com um arquivo específico, de onde realmente vem uma mudança , detectar cópias e pastas etc) ...

Discordo da resposta vencedora, afirmando que o principal benefício do GIT é o trabalho offline - certamente é útil, mas é mais um extra para o meu caso de uso. O SVK também pode trabalhar off-line, mas ainda não há dúvida em qual investir meu tempo de aprendizado).

Só que é incrivelmente poderoso, rápido e, depois de se acostumar com os conceitos - muito útil (sim, nesse sentido: amigável).

Para mais detalhes sobre uma história mesclada, veja o seguinte: Usando git-svn (ou similar) * just * para ajudar com uma fusão svn?


3

Graças ao fato de ele não precisar se comunicar constantemente com um servidor central, praticamente todos os comandos são executados em menos de um segundo (obviamente o git push / pull / fetch é mais lento, simplesmente porque é necessário inicializar as conexões SSH). Ramificar é muito mais fácil (um comando simples para ramificar, um comando simples para mesclar)


3

Eu absolutamente amo poder gerenciar ramificações locais do meu código-fonte no Git sem atrapalhar a água do repositório central. Em muitos casos, consultarei o código do servidor Subversion e executarei um repositório Git local apenas para poder fazer isso. Também é ótimo que a inicialização de um repositório Git não polua o sistema de arquivos com várias pastas .svn irritantes em todos os lugares.

E no que diz respeito ao suporte à ferramenta Windows, o TortoiseGit lida muito bem com o básico, mas ainda prefiro a linha de comando, a menos que queira visualizar o log. Eu realmente gosto da maneira como o Tortoise {Git | SVN} ajuda ao ler logs de confirmação.


3

Esta é a pergunta errada a ser feita. É muito fácil se concentrar nas verrugas do git e formular um argumento sobre por que a subversão é ostensivamente melhor, pelo menos em alguns casos de uso. O fato de o git ter sido originalmente projetado como um conjunto de construção de controle de versão de baixo nível e ter uma interface barroca orientada ao desenvolvedor do linux torna mais fácil para as guerras sagradas ganhar tração e legitimidade percebida. Os proponentes do Git tocam o tambor com milhões de vantagens no fluxo de trabalho, que os caras do svn consideram desnecessários. Logo, todo o debate será enquadrado como centralizado versus distribuído, o que atende aos interesses da comunidade svn tool community. Essas empresas, que normalmente publicam os artigos mais convincentes sobre a superioridade do subversion na empresa,

Mas aqui está o problema: o Subversion é um beco sem saída da arquitetura .

Considerando que você pode pegar o git e criar uma substituição centralizada do subversion com bastante facilidade, apesar de estar por mais do que o dobro do tempo, o svn nunca foi capaz de fazer o rastreamento básico de mesclagem funcionar tão perto quanto no git. Uma razão básica para isso é a decisão de design de tornar as ramificações iguais aos diretórios. Não sei por que eles seguiram esse caminho originalmente, isso certamente torna as caixas parciais muito simples. Infelizmente, isso também torna impossível rastrear o histórico corretamente. Agora, obviamente, você deve usar as convenções de layout do repositório do subversion para separar as ramificações dos diretórios regulares, e o svn usa algumas heurísticas para fazer as coisas funcionarem nos casos de uso diários. Mas tudo isso está apenas encobrindo uma decisão de projeto de baixo nível muito pobre e limitadora. Ser capaz de fazer um diff em repositório (em vez de em diretório) é uma funcionalidade básica e crítica para um sistema de controle de versão e simplifica bastante os internos, possibilitando a criação de recursos mais inteligentes e úteis sobre ele. Você pode ver na quantidade de esforço que foi colocado em estender a subversão e, no entanto, a que distância está da atual safra de VCS modernos em termos de operações fundamentais, como resolução de mesclagem.

Agora, aqui está o meu conselho sincero e agnóstico para quem ainda acredita que o Subversion é bom o suficiente para o futuro próximo:

O Subversion nunca alcançará as novas raças de VCS que aprenderam com os erros do RCS e CVS; é uma impossibilidade técnica, a menos que eles reformulem o modelo de repositório desde o início, mas não seria realmente svn, seria? Independentemente de quanto você acha que não possui as capacidades de um VCS moderno, sua ignorância não o protegerá das armadilhas do Subversion, muitas das quais são situações impossíveis ou facilmente resolvidas em outros sistemas.

É extremamente raro que a inferioridade técnica de uma solução seja tão clara como é com svn, certamente eu nunca exporia uma opinião sobre win-vs-linux ou emacs-vs-vi, mas, neste caso, é tão clearcut, e controle de fonte é uma ferramenta tão fundamental no arsenal do desenvolvedor, que eu sinto que deve ser declarado inequivocamente. Independentemente do requisito de usar o svn por motivos organizacionais, imploro a todos os usuários do svn que não deixem sua mente lógica construir uma falsa crença de que VCSes mais modernos são úteis apenas para grandes projetos de código aberto. Independentemente da natureza do seu trabalho de desenvolvimento, se você é um programador, será um programador mais eficaz se aprender a usar VCSes mais bem projetados, seja Git, Mercurial, Darcs ou muitos outros.


2

O Subversion é muito fácil de usar. Eu nunca encontrei nos últimos anos um problema ou que algo não funcione conforme o esperado. Além disso, existem muitas ferramentas excelentes da GUI e o suporte à integração SVN é grande.

Com o Git, você obtém um VCS mais flexível. Você pode usá-lo da mesma maneira que o SVN com um repositório remoto em que você confirma todas as alterações. Mas você também pode usá-lo principalmente offline e enviar apenas as alterações periodicamente para o repositório remoto. Mas o Git é mais complexo e tem uma curva de aprendizado mais acentuada. Encontrei-me pela primeira vez cometendo ramificações erradas, criando ramificações indiretamente ou recebendo mensagens de erro com poucas informações sobre o erro e onde devo pesquisar no Google para obter melhores informações. Algumas coisas fáceis, como a substituição de marcadores ($ Id $), não funcionam, mas o GIT possui um mecanismo de filtragem e gancho muito flexível para mesclar scripts próprios e, assim, você obtém tudo o que precisa e mais, mas precisa de mais tempo e leitura da documentação ;)

Se você trabalha principalmente offline com seu repositório local, não possui backup se algo se perder na sua máquina local. Com o SVN, você trabalha principalmente com um repositório remoto, que também é ao mesmo tempo que seu backup em outro servidor ... O Git pode funcionar da mesma maneira, mas esse não era o objetivo principal do Linus de ter algo como o SVN2. Ele foi projetado para os desenvolvedores do kernel Linux e as necessidades de um sistema de controle de versão distribuído.

Git é melhor que SVN? Os desenvolvedores que precisam apenas de algum histórico de versão e um mecanismo de backup têm uma vida boa e fácil com o SVN. Os desenvolvedores que trabalham frequentemente com ramificações, testam mais versões ao mesmo tempo ou trabalham principalmente off-line podem se beneficiar dos recursos do Git. Existem alguns recursos muito úteis, como esconderijo não encontrado no SVN, que podem facilitar a vida. Mas, por outro lado, nem todas as pessoas precisarão de todos os recursos. Então, eu não consigo ver os mortos do SVN.

O Git precisa de uma documentação melhor e o relatório de erros deve ser mais útil. Além disso, as GUIs úteis existentes são raras. Desta vez, encontrei apenas 1 GUI para Linux com suporte para a maioria dos recursos do Git (git-cola). A integração do Eclipse está funcionando, mas não é liberada oficialmente e não há site de atualização oficial (apenas alguns sites de atualização externos com construções periódicas a partir do tronco http://www.jgit.org/updates ) Portanto, a maneira mais preferida de usar o Git atualmente é a linha de comando.


2

Eric Sink, da SourceGear, escreveu uma série de artigos sobre diferenças entre sistemas de controle de versão distribuídos e não distribuídos. Ele compara prós e contras dos sistemas de controle de versão mais populares. Leitura muito interessante.
Os artigos podem ser encontrados em seu blog, www.ericsink.com :


2

Para quem procura uma boa interface gráfica do Git, o Syntevo SmartGit pode ser uma boa solução. Seu proprietário, mas gratuito para uso não comercial, roda em Windows / Mac / Linux e até suporta SVN usando algum tipo de ponte git-svn, eu acho.


1

http://subversion.wandisco.com/component/content/article/1/40.html

Eu acho que é bastante seguro dizer que, entre os desenvolvedores, o SVN vs. O argumento Git já existe há algum tempo, com todos tendo sua própria opinião sobre o que é melhor. Isso foi abordado nas perguntas durante o nosso Webinar sobre Subversion em 2010 e além.

Hyrum Wright, nosso diretor de código aberto e presidente da Subversion Corporation fala sobre as diferenças entre o Subversion e o Git, juntamente com outros sistemas de controle de versão distribuídos (DVCS).

Ele também fala sobre as próximas mudanças no Subversion, como a Working Copy Next Generation (WC-NG), que ele acredita que fará com que vários usuários do Git se convertam novamente no Subversion.

Assista ao vídeo dele e deixe-nos saber o que você pensa comentando neste blog ou postando em nossos fóruns. O registro é simples e leva apenas um momento!


Obviamente tendencioso, pois sua ferramenta é baseada no Subversion. Apenas dizendo.
Jakub Narębski


1

Ultimamente, tenho residido na terra do Git, e gosto de projetos pessoais, mas ainda não seria capaz de mudar os projetos de trabalho do Subversion, dada a mudança no pensamento de exigido da equipe, sem benefícios prementes. Além disso, o maior projeto que executamos internamente é extremamente dependente do svn: externals que, pelo que vi até agora, não funciona tão bem e perfeitamente no Git.


1

Primeiro, o controle de versão simultâneo parece ser um problema fácil de resolver. Não é de todo. De qualquer forma...

SVN é bastante intuitivo. Git é ainda pior. [especulação sarcástica] Isso pode ocorrer porque os desenvolvedores, que gostam de problemas difíceis como o controle de versão simultâneo, não têm muito interesse em criar uma boa interface do usuário. [/ especulação sarcástica]

Os apoiadores do SVN acham que não precisam de um sistema de controle de versão distribuído. Eu também pensei nisso. Mas agora que usamos exclusivamente o Git, eu acredito. Agora o controle de versão funciona para mim e para a equipe / projeto, em vez de apenas trabalhar para o projeto. Quando eu preciso de uma ramificação, eu ramifico. Às vezes, é uma ramificação que possui uma ramificação correspondente no servidor e, às vezes, não. Sem mencionar todas as outras vantagens que terei que estudar (graças em parte à arcana e absurda falta de interface do usuário que é um sistema de controle de versão moderno).


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.