Controle de Versão com GIT€¦ · Usando o GIT remotamente • Criar uma réplica de um...
Transcript of Controle de Versão com GIT€¦ · Usando o GIT remotamente • Criar uma réplica de um...
![Page 1: Controle de Versão com GIT€¦ · Usando o GIT remotamente • Criar uma réplica de um repositório: • git clone • Pegar modificações feitas em um repositório • git fetch](https://reader033.fdocuments.net/reader033/viewer/2022060802/60863e21bb208c7ca521f43e/html5/thumbnails/1.jpg)
Controle de Versão com GIT Túlio Toffolo – [email protected] http://www.toffolo.com.br
Conteúdo Extra
Algoritmos e Estruturas de Dados
![Page 2: Controle de Versão com GIT€¦ · Usando o GIT remotamente • Criar uma réplica de um repositório: • git clone • Pegar modificações feitas em um repositório • git fetch](https://reader033.fdocuments.net/reader033/viewer/2022060802/60863e21bb208c7ca521f43e/html5/thumbnails/2.jpg)
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
![Page 3: Controle de Versão com GIT€¦ · Usando o GIT remotamente • Criar uma réplica de um repositório: • git clone • Pegar modificações feitas em um repositório • git fetch](https://reader033.fdocuments.net/reader033/viewer/2022060802/60863e21bb208c7ca521f43e/html5/thumbnails/3.jpg)
Quem está usando GIT?
• Android
• Gnome
• Kernel do Linux
• Qt (toolkit)
• Ruby on Rails
• PostgreSQL
• KDE
• X.Org
• Debian
• Perl
• GCC
• Samba
• phpMyAdmin
e muitos outros
3
![Page 4: Controle de Versão com GIT€¦ · Usando o GIT remotamente • Criar uma réplica de um repositório: • git clone • Pegar modificações feitas em um repositório • git fetch](https://reader033.fdocuments.net/reader033/viewer/2022060802/60863e21bb208c7ca521f43e/html5/thumbnails/4.jpg)
Controle de versão centralizada
4
• Nomes utilizados:
• VCS – Version Control System
• SCM – Source Code Management
• Commit
• Update
![Page 5: Controle de Versão com GIT€¦ · Usando o GIT remotamente • Criar uma réplica de um repositório: • git clone • Pegar modificações feitas em um repositório • git fetch](https://reader033.fdocuments.net/reader033/viewer/2022060802/60863e21bb208c7ca521f43e/html5/thumbnails/5.jpg)
Controle de versão centralizada
5
![Page 6: Controle de Versão com GIT€¦ · Usando o GIT remotamente • Criar uma réplica de um repositório: • git clone • Pegar modificações feitas em um repositório • git fetch](https://reader033.fdocuments.net/reader033/viewer/2022060802/60863e21bb208c7ca521f43e/html5/thumbnails/6.jpg)
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?
![Page 7: Controle de Versão com GIT€¦ · Usando o GIT remotamente • Criar uma réplica de um repositório: • git clone • Pegar modificações feitas em um repositório • git fetch](https://reader033.fdocuments.net/reader033/viewer/2022060802/60863e21bb208c7ca521f43e/html5/thumbnails/7.jpg)
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
![Page 8: Controle de Versão com GIT€¦ · Usando o GIT remotamente • Criar uma réplica de um repositório: • git clone • Pegar modificações feitas em um repositório • git fetch](https://reader033.fdocuments.net/reader033/viewer/2022060802/60863e21bb208c7ca521f43e/html5/thumbnails/8.jpg)
Controle de versão distribuída
8
![Page 9: Controle de Versão com GIT€¦ · Usando o GIT remotamente • Criar uma réplica de um repositório: • git clone • Pegar modificações feitas em um repositório • git fetch](https://reader033.fdocuments.net/reader033/viewer/2022060802/60863e21bb208c7ca521f43e/html5/thumbnails/9.jpg)
Controle de versão distribuída
9
![Page 10: Controle de Versão com GIT€¦ · Usando o GIT remotamente • Criar uma réplica de um repositório: • git clone • Pegar modificações feitas em um repositório • git fetch](https://reader033.fdocuments.net/reader033/viewer/2022060802/60863e21bb208c7ca521f43e/html5/thumbnails/10.jpg)
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
![Page 11: Controle de Versão com GIT€¦ · Usando o GIT remotamente • Criar uma réplica de um repositório: • git clone • Pegar modificações feitas em um repositório • git fetch](https://reader033.fdocuments.net/reader033/viewer/2022060802/60863e21bb208c7ca521f43e/html5/thumbnails/11.jpg)
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 !
![Page 12: Controle de Versão com GIT€¦ · Usando o GIT remotamente • Criar uma réplica de um repositório: • git clone • Pegar modificações feitas em um repositório • git fetch](https://reader033.fdocuments.net/reader033/viewer/2022060802/60863e21bb208c7ca521f43e/html5/thumbnails/12.jpg)
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
![Page 13: Controle de Versão com GIT€¦ · Usando o GIT remotamente • Criar uma réplica de um repositório: • git clone • Pegar modificações feitas em um repositório • git fetch](https://reader033.fdocuments.net/reader033/viewer/2022060802/60863e21bb208c7ca521f43e/html5/thumbnails/13.jpg)
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
![Page 14: Controle de Versão com GIT€¦ · Usando o GIT remotamente • Criar uma réplica de um repositório: • git clone • Pegar modificações feitas em um repositório • git fetch](https://reader033.fdocuments.net/reader033/viewer/2022060802/60863e21bb208c7ca521f43e/html5/thumbnails/14.jpg)
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, ~*
![Page 15: Controle de Versão com GIT€¦ · Usando o GIT remotamente • Criar uma réplica de um repositório: • git clone • Pegar modificações feitas em um repositório • git fetch](https://reader033.fdocuments.net/reader033/viewer/2022060802/60863e21bb208c7ca521f43e/html5/thumbnails/15.jpg)
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
![Page 16: Controle de Versão com GIT€¦ · Usando o GIT remotamente • Criar uma réplica de um repositório: • git clone • Pegar modificações feitas em um repositório • git fetch](https://reader033.fdocuments.net/reader033/viewer/2022060802/60863e21bb208c7ca521f43e/html5/thumbnails/16.jpg)
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
![Page 17: Controle de Versão com GIT€¦ · Usando o GIT remotamente • Criar uma réplica de um repositório: • git clone • Pegar modificações feitas em um repositório • git fetch](https://reader033.fdocuments.net/reader033/viewer/2022060802/60863e21bb208c7ca521f43e/html5/thumbnails/17.jpg)
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
![Page 18: Controle de Versão com GIT€¦ · Usando o GIT remotamente • Criar uma réplica de um repositório: • git clone • Pegar modificações feitas em um repositório • git fetch](https://reader033.fdocuments.net/reader033/viewer/2022060802/60863e21bb208c7ca521f43e/html5/thumbnails/18.jpg)
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
![Page 19: Controle de Versão com GIT€¦ · Usando o GIT remotamente • Criar uma réplica de um repositório: • git clone • Pegar modificações feitas em um repositório • git fetch](https://reader033.fdocuments.net/reader033/viewer/2022060802/60863e21bb208c7ca521f43e/html5/thumbnails/19.jpg)
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
![Page 20: Controle de Versão com GIT€¦ · Usando o GIT remotamente • Criar uma réplica de um repositório: • git clone • Pegar modificações feitas em um repositório • git fetch](https://reader033.fdocuments.net/reader033/viewer/2022060802/60863e21bb208c7ca521f43e/html5/thumbnails/20.jpg)
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
![Page 21: Controle de Versão com GIT€¦ · Usando o GIT remotamente • Criar uma réplica de um repositório: • git clone • Pegar modificações feitas em um repositório • git fetch](https://reader033.fdocuments.net/reader033/viewer/2022060802/60863e21bb208c7ca521f43e/html5/thumbnails/21.jpg)
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
![Page 22: Controle de Versão com GIT€¦ · Usando o GIT remotamente • Criar uma réplica de um repositório: • git clone • Pegar modificações feitas em um repositório • git fetch](https://reader033.fdocuments.net/reader033/viewer/2022060802/60863e21bb208c7ca521f43e/html5/thumbnails/22.jpg)
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
![Page 23: Controle de Versão com GIT€¦ · Usando o GIT remotamente • Criar uma réplica de um repositório: • git clone • Pegar modificações feitas em um repositório • git fetch](https://reader033.fdocuments.net/reader033/viewer/2022060802/60863e21bb208c7ca521f43e/html5/thumbnails/23.jpg)
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
![Page 24: Controle de Versão com GIT€¦ · Usando o GIT remotamente • Criar uma réplica de um repositório: • git clone • Pegar modificações feitas em um repositório • git fetch](https://reader033.fdocuments.net/reader033/viewer/2022060802/60863e21bb208c7ca521f43e/html5/thumbnails/24.jpg)
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
![Page 25: Controle de Versão com GIT€¦ · Usando o GIT remotamente • Criar uma réplica de um repositório: • git clone • Pegar modificações feitas em um repositório • git fetch](https://reader033.fdocuments.net/reader033/viewer/2022060802/60863e21bb208c7ca521f43e/html5/thumbnails/25.jpg)
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
![Page 26: Controle de Versão com GIT€¦ · Usando o GIT remotamente • Criar uma réplica de um repositório: • git clone • Pegar modificações feitas em um repositório • git fetch](https://reader033.fdocuments.net/reader033/viewer/2022060802/60863e21bb208c7ca521f43e/html5/thumbnails/26.jpg)
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
![Page 27: Controle de Versão com GIT€¦ · Usando o GIT remotamente • Criar uma réplica de um repositório: • git clone • Pegar modificações feitas em um repositório • git fetch](https://reader033.fdocuments.net/reader033/viewer/2022060802/60863e21bb208c7ca521f43e/html5/thumbnails/27.jpg)
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!
![Page 28: Controle de Versão com GIT€¦ · Usando o GIT remotamente • Criar uma réplica de um repositório: • git clone • Pegar modificações feitas em um repositório • git fetch](https://reader033.fdocuments.net/reader033/viewer/2022060802/60863e21bb208c7ca521f43e/html5/thumbnails/28.jpg)
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