Controle de Versão com GIT Túlio Toffolo –
[email protected] http://www.toffolo.com.br
Conteúdo Extra Algoritmos e Estruturas de Dados
História do GIT • Linus usa BitKeeper para gerenciar o código de suas versões do Linux • Um belo dia ocorre um problema com a licença do BitKeeper • Linus gostava das funcionalidades • E não aceitava outras ferramentas como CVS e SVN
• 05/04/2005 – Surge a primeira versão do GIT • 15/06/2005 – Git é usado para no controle de versão do kernel do Linux
Quem está usando GIT? • Android
• X.Org
• Gnome
• Debian
• Google
• Perl
• Kernel do Linux
• GCC
• Qt (toolkit)
• Samba
• Ruby on Rails
• phpMyAdmin
• PostgreSQL • KDE
e muitos outros 3
Controle de versão centralizada
• Nomes utilizados: • VCS – Version Control System • SCM – Source Code Management • Commit • Update
4
Controle de versão centralizada
5
Controle de versão centralizada • Sistemas de controle de versão tradicionais • Trabalham com um banco de dados central • Clientes possuem apenas a versão mais atual
• Exemplos • CVS • Subversion (SVN) • Visual Source Safe
• Desafios • Conflitos no desenvolvimento com muitos usuários • Comunicação servidor/cliente • Backup?
Controle de versão distribuída
• Não existe servidor real (apenas por convenção) • Todo cliente possui o repositório • O controle de versão funciona mesmo offline • Fazer backups é trivial
• Outros sistemas de controle de versão distribuídos • Mercurial • BitKeeper • Darcs • Bazaar
Controle de versão distribuída
8
Controle de versão distribuída
9
Vantagens do GIT • Consistência • Nenhum repositório deve possui mais data que qualquer outro
• Velocidade • Muito mais rápidos que sistemas de controle de versão convencionais (estou falando de CVS e Subversion)
• Espaço • Algoritmos de compressão eficientes que analisam “o todo” • Reduz o tamanho local, assim como as transferências em operações de push/pull
• Simplicidade • Modelo de uso é muito simples
• Open Source
Desvantagens do GIT • Documentado quase exclusivamente através de páginas geradas via “man” • Maior massa de dados em operações push/pull do que em commits/updates de versões centralizadas e… que eu saiba nenhuma outra !
Arquitetura do GIT • Indíces • Armazenam informação sobre a versão atual e as mudanças feitas nela
• Banco de Dados de Objetos • Blobs (arquivos) • Armazenados na pasta .git/objects • Indexados por um único hash • Todos os arquivos são armazenados em blobs
• Trees (diretórios) • Commits • Cada commit gera um novo objeto • Informações do commit: hash do pai, nome do autor, data/hora do commit e o hash da estrutura corrente
Instalando o GIT • Windows: • msysgit: http://code.google.com/p/msysgit/ • Git Extensions: interface gráfica de fácil uso
• Ubuntu: • sudo apt-get install git-core gitk
• Mac (com MacPorts instado): • sudo port install git-core gitk
13
Armazenamento do GIT • A pasta .git • Apenas no diretório raiz do projeto • Contem todos os objetos, commits e configurações do projeto • .git/config: arquivo com configurações específicas do repositório
• .gitignore • Arquivo texto que indica os arquivos que devem ser ignorados • Exemplo: *.exe, *.dll, *.o, ~*
Alguns comandos
• Pegar ou iniciar um repositório
• Informações • git help
• git init
• git status
• git clone
• git diff
• Commits • git add • git commit
• git log • git show
Usando o GIT • Iniciando seu repositório: • git init
• Configurando seus dados: • git config --global user.name ”Túlio Toffolo” • git config --global user.email ”
[email protected]"
• Adicionando arquivos à lista de commit • git add arquivo.c • git add . 16
Usando o GIT • Fazendo o commit • git commit –m “Mensagem de commit” • git commit –a –m “Mensagem de commit”
• Verificando as alterações: • git status • git log • git reflog
• Removendo arquivo do repositorio: • git rm arquivo.c 17
Usando o GIT • Desfazendo as alterações desde algum commit • gitk checkout .
• Movendo para uma versão antiga do repositório: • git reset • git reset --force (força a barra e volta sem fazer commit)
• Revertendo para uma versão antiga do repositório: • git revert
(nao remove nada, apenas aplica um patch) 18
Usando o GIT • GIT nunca deleta um commit • Assim, é difícil demais perder dados usando GIT Ø Muito difícil dar um tiro no pé • Criando TAGs • git tag <nome_da_tag>
19
Usando branches • O sistema de branches é a parte mais interessanto no uso do GIT • Você sempre está trabalhando em algum BRANCH • Um BRANCH pode ser local ou remoto • Visualizando os branches • git branch
• Criando um branch: • git branch <nome_do_branch> 20
Merge • Como funciona o branching? o--o--o <-- origin \ a--b--c <-- mywork \ x--y--z <-- teste • O que é um merge? o--o--o--a--b--c--x--y--z
Rebase • Como funciona o branching? o--o--o--o--o <-- origin \ a--b--c <-- mywork • O que é um rebase? o--o--o--o--o <-- origin \ a--b--c <-- mywork
Merge (exemplo 2) • Como funciona o branching? o--o--o--o--o--o <-- origin \ a--b--c <-- mywork • O que é um rebase? o--o--o--o--o--o <-- origin \
\ a--b--c--m <-- mywork
Otimizando a base GIT • git gc • Limpa o repositório e compacta a base • Utilize de tempos em tempos em projetos grandes!!! • Aumenta a performance consideravelmente
• git fsck • Confere a base de objetos • Pode mostrar informações de erros
Usando o GIT remotamente • Criar uma réplica de um repositório: • git clone
• Pegar modificações feitas em um repositório • git fetch (pega as atualizações e coloca em outro branch) • git pull (pega as atualizações e já faz merge)
• Enviar modificações • git push nome_remoto
25
Usando o GIT remotamente • Protocolos • Pasta no seu computador (!!!) • SSH • Rsync • HTTP • Protocolo próprio do Git
• Criar apontamento remoto: • git remote add /temp/repositorio_local/.git
26
Git para Backups • Exemplo: Um diretório precisa de backup!!! • Rsync é uma ferramenta adequada? • Usa espaço em excesso
• Solução: crie um repositório GIT no diretório • Faça commits regulares • Faça push para o local do backup
• Mais que backup: backup versionado e usando menos espaço!
Outras ferramentas bacanas do GIT • bash/zsh completion • Gitk • GUI para visualizar os commits
• git instaweb • Usado para gerar páginas web com o repositório