Controle de Versão com GIT Túlio Toffolo tulio@toffolo.com.br 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 Gnome Google Kernel do Linux Qt (toolkit) Ruby on Rails PostgreSQL KDE X.Org Debian Perl GCC Samba phpmyadmin 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 git init git clone Commits git add git commit Informações git help git status git diff 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 tulio@toffolo.com.br" 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