Git - COntrole de 

versão distribuído


  

Instalação


  • Instalação
    • Ubuntu
      • sudo apt-get install git-core

CONFIGURAÇÃO - Basica



  • Configuração
        • Usuário
          • git config --global user.name "John Doe"
          • git config --global user.email johndoe@example.com
        • Colors
          • git config --global color.ui auto
          • git config -- global color.interactive auto

    CONFIGURAção - aliases


      • nano $HOME/.gitconfig
        • [alias]
            s = status  a = add  aa = !add -A && status  c = commit  cm = commit -m  co = checkout  f = fetch  p = pull  m = merge

    CONFIGURAÇÃO - diff


    • Sem linha pela metade

    git config --global core.pager less -r

    se isso nao funcionar
    git config --global core.pager 'less -+$LESS -FXR' --replace-all

    • Diff por palavra

    git config --global alias.d diff --color-words

    configuração - DIFF T00l

      • Meld
        • Install
          • sudo apt-get update && sudo apt-get install meld
        • Executable
          • touch git-diff.sh
            • #!/bin/bash meld "$2" "$5" > /dev/null 2>&1
          • sudo mv git-diff.sh /usr/local/bin/ sudo chmod +x /usr/local/bin/git-diff.sh
          • git config --global diff.external "/usr/local/bin/git-diff.sh"

    configuração - LOG


    • Resumo do histórico, "git l"
    • git config --global alias.l "log --graph --pretty=format:'%C(yellow)%h%C(cyan)%d%Creset %s %C(white)- %an, %ar%Creset'"
    • Histórico detalhado, "git ll"
    • git config --global alias.ll "log --stat --abbrev-commit"

    Criação de repositórios


    • "git init" dentro da pasta do projeto

    Conceitos

    repositórios


    • Repositório Remoto
      • Base de código central
      • Código dos contribuidores é integrado aqui
    • Repositório Local
      • git clone
      • Cria uma cópia fiel e independente
      • Origin: representa o repositório remoto
    • Natureza Distribuída - DCVS

    Mudanças

    Processo com vários passos

      1. Add/Stage (Index)
      2. Commit
      3. Push

    mudanças - Add/stage


    O Git "comita" - persiste mudanças - que foram "staged" - adiciondas ao Index

    • git add
      • Adiciona mudanças ao Index
    • git stage
      • mostra o estado do Index

    MUDANÇAS - Commit


    O Git persiste mudanças que são "comitadas"

    • Commits são "snapshots" do estado dos arquivos do projeto
    • git commit -m "Breve explicação das mudanças efetuadas."





    MUDANÇAS - Push


    • Compartilhe e integre suas mudanças no repositório central
    • git push [remote (provavelmente "origin")] [branch]

    branches


    • Um "branch" representa uma linha independente de desenvolvimento
    • Toda vez que voce cria um branch, voce "forka" - copia - a árvore do histórico

    Crtl + z no git - desfazendo mudanças


    As vezes, nós precisamos remover:
    • mudanças normais 
    • mudanças adicionadas
    •  mudanças persistidas

    dEsFANZENDO MUDANÇAS normais


    Mudanças que não foram adicionadas (staged) ainda

    • git checkout -- [file] 
      • reverte para ultima versão staged ou comitada
    • git checkout HEAD [file]
      •  reverte para ultima versão comitada

    defanzendo mudanças adicionadas


    Mudanças staged

    • Desfazer mudanças em arquivo específico
      • git reset [commit] [file]
    • Desfazer todas mudanças em stage
      • git reset

    DEFANZENDO MUDANÇAS persistidas


    git reset [commit] [file]

    • git reset HEADˆ 
      • reverte todas mudanças do último commit e coloca no file system
    • git reset HEADˆ [file]
      • Reverte mudanças do ultimo em um único arquvio e coloca no file system
    • --soft
      • mudanças revertidas ficam no filesytem, presuposto
    • --hard 
      • mudanças revertidas são descartadas

    ignorando arquivos


    Git permite que arquivos e diretórios existam dentro da estrutura do repositório, porém sem versionamento

    .gitignore

    • 1 ignore statement por linha
    • Suporte a wildcard *
    • Utilize ! (exclamação) para negação

    organização 


    Precisamos organizar o código para:

    • Ter uma separação clara entre código estável e código instável 
    • Gerenciar o código durante workflow de desenvolvimento, representando código em:
      • Desenvolvimento
      • Testes
      • Homologação
      • Produção
    • Minimizar problemas entre desenvolvedores trabalhando em funcionalidades diferentes e independentes - desenvolvimento modular

    Branches


    • [feature]: código de uma funcionalidade independente em desenvolvimento
    • [fix]: codigo de um bug fix
    • dev: integração em desenvolvimento
    • qa: código pronto para ser testado
    • homolog: código pronto para homologação
    • master: código pronto para produção

    BRANCHES


    • Criar nova branch
      • git checkout -b [branch-name]
        • Cria um novo branch a partir da branch ATUAL
    • Listar branches
      • git branch -a
    • Trocar para uma branch existente
      • git checkout [branch-name]
    • Deletar uma branch
      • Local
        • git branch -D [branch-name]
          • Voce não pode deletar a branch atual
      • Remota
        • git push [remote]   :[branch-name]

    tags


    • Tagueamento de versões específicas
      • Bom para releases
    • Criar nova tag
      • git tag -a [versão] -m "Mensagem sobre esta versão"
    • Listar
      • Com commit hash
        • git show-ref --tags
      • Com tag message
        • git tag -l -n1
    • Enviar para o remote
      • git push --tags
        • Envia SOMENTE tags

    integração


    Como transicionamos codigo entre branches, respeitando nosso workflow?


    Merges


    • Integração de código de duas branches diferentes é chamado de "merge"
      • git merge [branch]
          • Integra "branch" na branch atual
    • Integrando feature branch (fs/[component]) no dev branch
      • git checkout dev
      • git merge fs/[component]

      conflitos

      As vezes, commits nas branches sendo integradas pode entrar em conflito:
          • O git não sabe qual como montar um arquivo único com commits integrados:
          • "Deu merge capitão!"
               

      resolvendo conflitos


      • edite o arquivo retirando conflict tags
        • git checkout  --theirs
          • conserva a versão da branch sendo integrada
        • git checkout  --ours
          • conserva versão da branch atual
      • comite as edições
        • git add .
        • git commit -m "Merged branch1 into branch2, resolving conflict tal"

      comparação


      Podemos comparar

      • Versões de Arquivos
      • Branches

      Versões de arquivos


      git d [file]

      git dh [file]

      Branches


      git diff [branch1] [branch2]

      gitflow 

       agilize organização e integração


      • Modelo
      http://nvie.com/posts/a-successful-git-branching-model/

      • Comandos
                http://danielkummer.github.io/git-flow-cheatsheet/


      instalação e inicialização


      sudo apt-get install git-flow


      git flow init
      dentro do repositorio

      features

      Código de uma funcionalidade independente em desenvolvimento

      • crie uma feature branch a partir do dev
      git flow feature start MYFEATURE

      • integre uma feature branch no dev
       git flow feature finish MYFEATURE

      • publique uma feature para outros colaboradores
      git flow feature publish MYFEATURE

                  • Pegue uma feature publicada
      git flow feature pull origin MYFEATURE

      hotfixes

      Hotfixes são para bug fixes críticos, eles são criados a partir do master

      • Crie um novo hotfix
      git flow hotfix start VERSION [BASENAME]
      opcionalmente voce pode criar a partir de uma tag

                      • Termine um hotfix
      git flow hotfix finish VERSION

      • Voce também pode publicar e pegar hotfixes publicados, do mesmo modo que se faz com features

      comandos


      Obrigado!


      Vinicius Freitas
      vinicius@taller.net.br

      Git - COntrole de versão distribuído

      By Vinicius Freitas

      Git - COntrole de versão distribuído

      • 1,544