O documento descreve as principais diferenças entre SVN e Git, ferramentas de controle de versão. SVN é centralizado enquanto Git é descentralizado. Git permite trabalhar offline e sincronizar mudanças posteriormente, ao contrário do SVN. O documento também fornece exemplos passo a passo de como usar comandos básicos como commit, branch, merge em Git.
1. Git a partir do SVN
Michael Schuenck dos Santos
http://twitter.com/michaelss
http://delicious.com/michaelss
2. Introdução
• Desenvolvimento sem versionamento:
• Dificuldade para integrar os trabalhos da equipe
• Alguém imagina como integrar?
• Perda de trabalho com as integrações
• Atrasos
• Sistemas com falhas
• Exemplo: diferentes linhas alteradas em um arquivo por
diferentes membros.
• Impossibilidade de retornar o código a um estado
anterior
• Risco de perda pela inexistência de backup
• Especialmente quando o projeto é desenvolvido por uma só
pessoa
4. SVN
• Modelo centralizado
• Um servidor
• Um ou mais desenvolvedores
• Considerado uma evolução do CVS.
5. SVN - Principais Operações
• Checkout: baixar a versão atual para a máquina.
• Update: recuperar as alterações feitas pelos demais membros
da equipe.
• Pode ser preciso resolver conflitos.
• Princípio: o código no servidor não pode estar com problemas - eles
precisam ser resolvidos localmente.
• Commit: envio das alterações locais para o servidor.
• É esta operação que determina que uma nova versão foi criada.
• Tag: cópia de um projeto de forma que possa servir como
baseline.
• Branch: ramificação de um projeto.
• Usado normalmente quando serão feitas modificações de grande
impacto.
7. Git
• Primeira versão desenvolvida em 2005 por Linus Torvalds para
auxiliar nas tarefas de desenvolvimento do kernel do Linux.
• Atualmente é mantido por Junio Hamano.
• Modelo descentralizado
• Qualquer estação pode ser servidor e cliente.
• Possível manter um projeto local versionado.
• Metadados ficam no diretório .git, na raiz do projeto.
8. Git - Principais Operações
• Init: inicia um repositório.
• Add: adiciona diretórios e arquivos ao controle de versões.
• Commit: submete as alterações locais ao controle de versões.
• Branch: cria (ou apaga) um nova ramificação no código.
• Checkout: muda de branch.
• Todas as alterações no branch anterior serão mantidas se o usuário
retornar a ele depois.
• Merge: une dois branchs pela aplicação das alterações de um
no outro.
9. Git - Principais Operações
• Init: inicia um repositório.
• Add: adiciona diretórios e arquivos ao controle de versões.
• Commit: submete as alterações locais ao controle de versões.
• Branch: cria (ou apaga) um nova ramificação no código.
• Checkout: muda de branch.
• Todas as alterações no branch anterior serão mantidas se o usuário
retornar a ele depois.
• Merge: une dois branchs pela aplicação das alterações de um
no outro.
Todas estas operações podem ser locais. No SVN, apenas a
criação do repositório deve ser feita na máquina que será o
servidor de versionamento.
11. Git - Obtendo um repositório
• Init: inicia um novo repositório a partir de um diretório existente.
• Ele irá criar um diretório .git
# git init
• Clone: obtém uma cópia de um repositório existente.
• Sobre os protocolos http(s), ssh e git.
• O comando abaixo resultará na criação de um diretório local chamado
proj.
# git clone ssh://sesawserver/sesawgit/proj.git
12. Git - Utilitários
• Status: utilizado para verificar o que foi alterado.
• Arquivos alterados, adicionados e excluídos.
# git status
• Log: apresenta o histórico de commits no projeto.
• Inúmeras opções de visualização do histórico.
• Completo
• De uma versão específica
• Em um ou mais branches
# git log
13. Git - Fluxo de trabalho
• Add: adiciona conteúdos de arquivos a uma área temporária
para posterior commit.
• Obrigatório quando os arquivos são novos.
• Desnecessário se for utilizada a opção -a no commit.
# git add arquivo1 arquivo2 arquivo3
• Commit: grava uma nova versão (local) do projeto.
• Snapshot do projeto.
• Opção -m: permite especificar a mensagem diretamente.
• Opção -a: permite adicionar alterações automaticamente (exceto
quando forem adicionados novos arquivos).
# git commit -a -m “Implementado o login.”
14. Git - Branches e Merges
• Branch: Cria um novo branch (linha de trabalho) ou consulta o
branch atual.
• Não muda para o branch automaticamente.
# git branch nome_do_branch
# git branch
• Checkout: muda de branch.
• Mudanças em um branch não interferem em outro.
# git checkout nome_do_branch
15. Git - Branches e Merges
• Merge: aplica mudanças de um branch em outro.
• Podem ocorrer conflitos.
• Mudanças feitas nos dois branches.
• As mudanças no branch informado serão aplicadas no branch atual.
# git merge nome_do_outro_branch
• Branch (de novo, mas para apagar branches):
• Para apagar um branch que foi incorporado a outro (com o merge),
deve-se utilizar a opção “-d”.
• Para apagar um branch cujas mudanças não serão aproveitadas,
deve-se utilizar a opção “-D”.
# git branch -d nome_do_branch
# git branch -D branch_inútil
16. Git - Quando ocorrem conflitos
• Conflito ocorre quando a mesma linha de um mesmo arquivo é
alterada em dois branches diferentes.
• Podem ser mais de uma linha.
• Forma de um arquivo com conflito:
<<<<<<< HEAD:file.txt
Hello world
=======
Goodbye
>>>>>>> 77976da35a11db4580b80ae27e8d65caf5208086:file.txt
• Para resolver, basta editar o arquivo mantendo a parte que será
mantida e realizar o commit.
17. Git - Integrando remotamente
• Remote: lista, adiciona e remove apelidos (aliases) de
repositórios remotos.
• Facilidade ao se trabalhar com mais de um repositório.
• Por projeto.
• Listar e listar com detalhes:
# git remote
# git remote -v
• Adicionar:
# git remote add apelido ssh://server/dir/proj.git
• Remover:
# git remote rm apelido
18. Git - Repositório público
• Geralmente ficará remoto.
• Opção --bare para os comandos clone e init
• Convenção: o nome do diretório será o nome do projeto seguido de
“.git”
# mkdir proj.git
# cd proj.git
# git --bare init
ou
# git clone --bare ~/proj proj.git
19. Git - Integrando remotamente - cont.
• Fetch: recupera as mudanças enviadas para o servidor remoto
por outras pessoas.
• Para aplicar as mudanças remotas, é necessário executar o comando
merge.
# git fetch apelido_remoto
# git merge apelido_remoto/branch_remoto
• Pull: basicamente faz o mesmo que um fetch seguido de merge.
# git pull apelido_remoto branch
20. Git - Integrando remotamente - cont.
• Push: envia os commits locais para o servidor remoto.
• Não é possível executar este comando se alguém o executou no
meio-tempo.
• Tal como no SVN, será necessário “atualizar” a versão local.
# git push apelido_remoto branch
23. Git - Exercício Local
1. Criar projeto e iniciá-lo
2. Incluir arquivos e verificar o status
24. Git - Exercício Local
1. Criar projeto e iniciá-lo
2. Incluir arquivos e verificar o status
3. Adicionar os arquivos criados e realizar commit
25. Git - Exercício Local
1. Criar projeto e iniciá-lo
2. Incluir arquivos e verificar o status
3. Adicionar os arquivos criados e realizar commit
4. Criar um branch e ir para ele
26. Git - Exercício Local
1. Criar projeto e iniciá-lo
2. Incluir arquivos e verificar o status
3. Adicionar os arquivos criados e realizar commit
4. Criar um branch e ir para ele
5. Adicionar arquivos e realizar commit no novo branch
27. Git - Exercício Local
1. Criar projeto e iniciá-lo
2. Incluir arquivos e verificar o status
3. Adicionar os arquivos criados e realizar commit
4. Criar um branch e ir para ele
5. Adicionar arquivos e realizar commit no novo branch
6. Voltar para o branch master e ver os arquivos
28. Git - Exercício Local
1. Criar projeto e iniciá-lo
2. Incluir arquivos e verificar o status
3. Adicionar os arquivos criados e realizar commit
4. Criar um branch e ir para ele
5. Adicionar arquivos e realizar commit no novo branch
6. Voltar para o branch master e ver os arquivos
7. Aplicar as mudanças do novo branch no branch master
31. Git - Exercício Remoto
1. [servidor] Criar projeto vazio
2. [cliente1] Enviar os arquivos para o servidor (fazer commit antes)
32. Git - Exercício Remoto
1. [servidor] Criar projeto vazio
2. [cliente1] Enviar os arquivos para o servidor (fazer commit antes)
3. [cliente1] Criar um apelido para o servidor
33. Git - Exercício Remoto
1. [servidor] Criar projeto vazio
2. [cliente1] Enviar os arquivos para o servidor (fazer commit antes)
3. [cliente1] Criar um apelido para o servidor
4. [cliente2] Baixar os arquivos do servidor
34. Git - Exercício Remoto
1. [servidor] Criar projeto vazio
2. [cliente1] Enviar os arquivos para o servidor (fazer commit antes)
3. [cliente1] Criar um apelido para o servidor
4. [cliente2] Baixar os arquivos do servidor
5. [cliente2] Fazer mudanças, commit e enviar p/ servidor
35. Git - Exercício Remoto
1. [servidor] Criar projeto vazio
2. [cliente1] Enviar os arquivos para o servidor (fazer commit antes)
3. [cliente1] Criar um apelido para o servidor
4. [cliente2] Baixar os arquivos do servidor
5. [cliente2] Fazer mudanças, commit e enviar p/ servidor
6. [cliente1] Fazer mudanças, commit e enviar p/ servidor
36. Git - Exercício Remoto
1. [servidor] Criar projeto vazio
2. [cliente1] Enviar os arquivos para o servidor (fazer commit antes)
3. [cliente1] Criar um apelido para o servidor
4. [cliente2] Baixar os arquivos do servidor
5. [cliente2] Fazer mudanças, commit e enviar p/ servidor
6. [cliente1] Fazer mudanças, commit e enviar p/ servidor
7. [cliente1] Criar branch, entrar nele, fazer mudanças, dar commit
e enviar para servidor
37. Git - Exercício Remoto
1. [servidor] Criar projeto vazio
2. [cliente1] Enviar os arquivos para o servidor (fazer commit antes)
3. [cliente1] Criar um apelido para o servidor
4. [cliente2] Baixar os arquivos do servidor
5. [cliente2] Fazer mudanças, commit e enviar p/ servidor
6. [cliente1] Fazer mudanças, commit e enviar p/ servidor
7. [cliente1] Criar branch, entrar nele, fazer mudanças, dar commit
e enviar para servidor
8. [cliente2] Baixar as mudanças feitas do servidor