Git a partir do SVN

              Michael Schuenck dos Santos
                   http://twitter.com/michaelss
                http://delicious.com/michaelss
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
Ferramentas

•   CVS
•   SVN (Subversion)
•   Mercurial
•   Git
•   MS Visual SourceSafe
•   Rational ClearCase
SVN

• Modelo centralizado
    • Um servidor
    • Um ou mais desenvolvedores
• Considerado uma evolução do CVS.
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.
SVN - Exemplo de Histórico
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.
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.
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.
Git - Configuração básica

 • Config: define a configuração básica da instalação.
       • Criará um arquivo ~/.gitconfig


# git config --global user.name “Michael Schuenck”
# git config --global user.email “michael@tre-to.jus.br”
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
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
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.”
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
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
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.
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
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
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
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
Git - Exercício Local
Git - Exercício Local
1. Criar projeto e iniciá-lo
Git - Exercício Local
1. Criar projeto e iniciá-lo
2. Incluir arquivos e verificar o status
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
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
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
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
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
Git - Exercício Remoto
Git - Exercício Remoto
1. [servidor] Criar projeto vazio
Git - Exercício Remoto
1. [servidor] Criar projeto vazio
2. [cliente1] Enviar os arquivos para o servidor (fazer commit antes)
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
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
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
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
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
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
Git - Referências
Git - Referências
• http://gitref.org
Git - Referências
• http://gitref.org
• http://book.git-scm.com

Git para quem vem do SVN

  • 1.
    Git a partirdo SVN Michael Schuenck dos Santos http://twitter.com/michaelss http://delicious.com/michaelss
  • 2.
    Introdução • Desenvolvimento semversionamento: • 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
  • 3.
    Ferramentas • CVS • SVN (Subversion) • Mercurial • Git • MS Visual SourceSafe • Rational ClearCase
  • 4.
    SVN • Modelo centralizado • Um servidor • Um ou mais desenvolvedores • Considerado uma evolução do CVS.
  • 5.
    SVN - PrincipaisOperaçõ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.
  • 6.
    SVN - Exemplode Histórico
  • 7.
    Git • Primeira versãodesenvolvida 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 - PrincipaisOperaçõ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 - PrincipaisOperaçõ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.
  • 10.
    Git - Configuraçãobásica • Config: define a configuração básica da instalação. • Criará um arquivo ~/.gitconfig # git config --global user.name “Michael Schuenck” # git config --global user.email “michael@tre-to.jus.br”
  • 11.
    Git - Obtendoum 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 - Fluxode 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 - Branchese 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 - Branchese 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 - Quandoocorrem 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 - Integrandoremotamente • 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óriopú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 - Integrandoremotamente - 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 - Integrandoremotamente - 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
  • 21.
  • 22.
    Git - ExercícioLocal 1. Criar projeto e iniciá-lo
  • 23.
    Git - ExercícioLocal 1. Criar projeto e iniciá-lo 2. Incluir arquivos e verificar o status
  • 24.
    Git - ExercícioLocal 1. Criar projeto e iniciá-lo 2. Incluir arquivos e verificar o status 3. Adicionar os arquivos criados e realizar commit
  • 25.
    Git - ExercícioLocal 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ícioLocal 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ícioLocal 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ícioLocal 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
  • 29.
  • 30.
    Git - ExercícioRemoto 1. [servidor] Criar projeto vazio
  • 31.
    Git - ExercícioRemoto 1. [servidor] Criar projeto vazio 2. [cliente1] Enviar os arquivos para o servidor (fazer commit antes)
  • 32.
    Git - ExercícioRemoto 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ícioRemoto 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ícioRemoto 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ícioRemoto 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ícioRemoto 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ícioRemoto 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
  • 38.
  • 39.
    Git - Referências •http://gitref.org
  • 40.
    Git - Referências •http://gitref.org • http://book.git-scm.com