Bruno Orlandi
Git e contribuição para
projetos Open Source
2ª Edição
Bruno Orlandi
●
5º Ano BCC – ICMC USP
●
P&D – Ícaro Technologies
●
Desenvolvimento Web
●
Gosta de compartilhar 
conhecimento
●
@BrOrlandi
Instalando
●
Instalar o Git:
sudo apt­get install git
●
Escolha sua interface gráfica:
– https://git­scm.com/downloads/guis 
●
Recomendado: GitEye
– http://www.collab.net/downloads/giteye 
Sobre o Minicurso
●
Não será abordado a parte técnica do Git.
●
Objetivo aprender Git e sua utilidade na 
prática!
●
Dúvidas e correções a qualquer momento!
Conteúdo
●
Controle de Versão
●
Comandos Básicos
●
Ramificações
●
Publicando e Colaborando
●
Exercícios
O que é Git-SCM
●
Sistema de Controle de Versão Distribuído
●
SCM   Source Control Management→
●
Criado por Linus Torvalds (2005)
●
Auxiliar no Desenvolvimento do Linux
Gerência de Configuração de
Software
Gerência de Configuração de Software
●
Durante o desenvolvimento do software 
queremos saber:
– O que mudou e quando?
– Por que mudou?
– Quem fez a mudança?
– Podemos reproduzir esta mudança?
Gerência de Configuração de Software
●
Identificação
●
Documentação
●
Controle
●
Auditoria
Gerência de Configuração de Software
●
Artefatos:
– Código fonte
– Documentação do Software
– Manual de Usuário
Problema exemplo
●
Você precisa editar um código que está no seu 
Dropbox
●
Você faz o download do arquivo
●
Faz as alterações necessárias
●
Salva o arquivo no Dropbox
Problema exemplo
●
Seu colega também quer editar o código
●
Vocês baixam o mesmo arquivo junto
●
Você edita e salva no Dropbox
●
Seu colega edita e salva no Dropbox e acaba 
sobrescrevendo seu código
Controle de Versão resolve
●
Controle de versão faz o 'merge' entre as 
alterações.
Git é Distribuído
Controle de Versão
O que é GitHub
●
Servidor de repositórios Git
●
Surgiu em 2008
●
+10 milhões de repositórios
●
+10 milhões de usuários
Estão no GitHub
Usam Git
Alternativas
●
Subversion (SVN)
●
Mercurial
●
CVS ­ Concurrent Versioning System
●
Bazaar
●
Git é o mais rápido e eficiente
Servidores
Servidores/Suporte git Mercurial SVN
GitHub V
GitLab V
Bitbucket V V
SourceForge V V V
Google Code V V V
Vamos começar na prática!
Instalando
●
Instalar o Git:
sudo apt­get install git
●
Escolha sua interface gráfica:
– https://git­scm.com/downloads/guis 
●
Recomendado: GitEye
– http://www.collab.net/downloads/giteye 
Criar conta no Github
●
Acessem https://github.com/
●
Criem sua conta.
●
Lembre­se, através dessa conta você poderá 
contribuir com milhões de projetos open 
source.
Ajuda
●
Quando precisar de ajuda:
git help <command>
●
Site oficial:
– https://git­scm.com/ 
Criando o Primeiro Repositório
git init PrimeiroRepo
●
Será criado o diretório configurado como um 
repositório Git
●
Todas as configurações do repositório ficam 
na pasta .git
Crie seu primeiro arquivo
●
Crie um arquivo, edite e adicione ao 
repositório:
gedit PrimeiroArquivo
git add PrimeiroArquivo
git commit ­m “Criado o primeiro arquivo.”
Configurando
●
Configure seu nome e e­mail:
git config ­­global user.name 
“MeuUserName”
git config ­­global user.email 
“meuemail@email.com”
●
Configure cores no terminal:
git config ­­global color.ui 
auto
Git Status e Log
●
Comando para ver o status do repositório
git status
●
Ver últimos commits no repositório:
git log
Criar um repositório remoto
●
Crie um repositório no Github.
●
Configure o repositório remoto.
●
Crie um arquivo README.md
●
Faça o upload das alterações.
git remote add <remote> <url>
Git Push
●
Enviar alterações (commits) de uma branch 
para o repositório remoto.
●
A primeira vez:
git push ­u origin master
●
O envio é rejeitado se o repositório local não 
estiver sincronizado.
git push <remote> <branch>
git push
Git Add
git add <lista de arquivos>
●
Adiciona os arquivos novos e modificados para 
o próximo commit
git add .
Git Commit
git commit [­m “Message”]
●
Registra o commit com todos os arquivos que 
usou “git add”
●
Se o parametro de mensagem não for passado 
abrirá um editor de texto para escrever a 
mensagem
● git config ­­global core.editor 
gedit
Git Workflow
●
Basicamente a maior parte do trabalho com o 
git consiste nestas tarefas:
– Editar
– Commitar
– Sincronizar com o repositório remoto
●
Exercite estes comandos!
Revisão dos comandos
● git status
● git log
● git add
● git commit
● git push
Status dos arquivos
●
Edite o arquivo criado anteriormente
●
Crie um novo arquivo e veja o seu status no 
repositório
Estados dos arquivos
●
Não monitorado (untracked)
●
Modificado (modified)
●
Preparado (staged)
●
Consolidado (commited)
Estados dos arquivos
Dif
git diff
●
Exibir diferenças entre commits e branchs
git diff [path]
●
Diferença no diretório
git diff HEAD~1
●
Mostra o que foi alterado no último commit
●
Ver diff no GitHub
Ferramenta externa Dif
git config ­­global diff.tool 
diffmerge
●
Permite usar uma ferramenta externa para 
usar no Diff e também no Merge.
git difftool HEAD~1
Exercício 1
●
Remova uma linha de um arquivo
●
Adicione uma nova linha no mesmo arquivo
●
Adicione um novo arquivo com pelo menos 
uma linha
●
Faça o commit e o push das alterações
●
Veja as diferenças do commit pelo GitHub
Git Clone
git clone <URL>
●
Baixa o repositório remoto.
●
Outra forma de criar um repositório local.
●
Já vem com o remote configurado.
Git Pull
git pull 
●
Baixa as alterações do repositório remoto.
●
Mantém o repositório sincronizado com os 
últimos commits de uma branch.
Exercício 2
●
Configure um colaborador para seu 
repositório.
●
Ele deve clonar seu repositório e fazer um 
commit nele.
●
Você deve atualizar seu repositório com o 
novo commit.
●
Invertam os papéis.
Navegar no histórico
git checkout <commit> <file>
●
Permite ver como um arquivo ou todo o 
repositório estava em um determinado 
commit.
Git checkout
git checkout <commit>
●
Altera o repositório para o estado daquele 
commit.
●
Útil para fazer testes antes e depois de 
alterações.
git checkout master
●
Para voltar o repositório no último commit.
Desfazendo alterações
git checkout ­­ <path_or_file>
●
Irá desfazer todas as alterações que não 
estejam no Stage desde o último commit.
git checkout HEAD ­­ <path_file>
●
Desfazer as alterações desde o último commit 
incluindo o Stage.
Git Revert
git revert <commit>
●
Irá criar um novo commit que desfaz as 
alterações do commit especificado.
●
Útil para desfazer um commit antigo.
Git reset
git reset <commit>
●
Resetar o repositório para um determinado 
commit.
git reset ­­hard <commit>
●
Resetar e remover todas as alterações.
– Cuidado ao usar! Não usar se já estiver 
publicado.
●
Útil para desfazer últimos commits.
Conflitos
●
Conflitos podem acontecer ao unirmos 
alterações.
●
Acontecem quando versões diferentes 
possuem as mesmas linhas nos mesmos 
arquivos editadas diferentes.
●
O Git identifica os conflitos e fica aguardando 
a solução deles.
●
Ao resolver os conflitos deve ser feito um 
commit.
Conflitos
Linha 1
Linha 2
Linha 3
Linha 1
Linha 2
Linha 3
Nova linha
Linha 1
Linha 2
Linha 3
Quarta linha
?
Exercício 3
●
Crie um conflito no repositório do seu par.
●
Seu par deve editar o mesmo arquivo que 
você.
●
Você deve fazer o pull, resolver o conflito e 
fazer o push das suas alterações.
●
Seu par deve ver que a sua alteração foi 
adicionada junto à alteração dele.
●
Invertam os papéis.
Branching
Criando ramificações do repositório
Branch
●
É uma lista de commits.
●
Representa ramificações no repositório.
●
Muito útil para trabalhos colaborativos.
●
Branchs de desenvolvimento facilitam o 
controle.
●
Branch master é a padrão.
git branch
Branching
git branch <nova_branch>
●
Cria uma nova branch.
git branch ­d <branch>
●
Excluir uma branch.
Git Checkout Branch
git checkout <branch>
●
Muda para a branch.
●
Seu repositório passa a ter os commits que a 
branch possui e novos commits serão 
adicionados à ela.
Exercício 4
●
Crie uma nova branch no seu repositório.
●
Mude para esta branch e faça pelo menos 2 
commits.
●
Faça o upload e veja sua nova branch no 
GitHub.
●
Faça um commit na master que altere as 
mesmas linhas.
●
Veja como as branchs divergem no GitHub.
Git Merge
git merge <branch>
●
Aplicar os commits de uma branch na branch 
atual.
●
Encontra um commit comum(base) entre as 
branchs e aplica todos os commits que a 
branch atual não possui.
●
Caso existam commits na branch atual que 
não estão na outra, será criado um commit de 
merge.
Exercício 5
●
Fazer o merge da nova branch na master.
●
Resolver o conflito e visualizar no GitHub o 
gráfico das branchs.
Git Rebase
git rebase <branch>
●
Semelhante ao Merge porém é diferente na 
ordem de aplicar os commits.
●
No Rebase, os seus commits na frente da base 
são removidos temporariamente, os commits 
de outra branch são aplicados na sua branch e 
por fim seus commits são aplicados um a um.
●
Pode acontecer conflitos que serão resolvidos 
para cada commit.
Exercício 6
●
Faça um commit na master e outro em outra 
branch.
●
Faça o rebase da branch com a master.
●
Veja a ordem dos commits.
●
Mesmo que tenha conflitos o histórico de 
commits é preservado.
Git Fetch
git fetch
●
Baixa as atualizações do remote porém não 
aplica elas no repositório.
●
Permite fazer o rebase de uma branch em vez 
de fazer o merge.
●
Pull = Fetch + Merge
●
Fetch e Rebase é melhor para manter histórico 
do desenvolvimento.
Exercício 7
●
Com a branch master sincronizadas você e seu 
par devem fazer commits na master.
●
Seu par deve fazer o push dos commits dele.
●
Antes de você fazer o push dos seus commits 
você deve fazer o rebase com os commits do 
seu par.
Tag
●
Útil para definir versões estáveis do projeto.
●
Semelhante a Branch porém não recebe mais 
commits.
●
Guarda um estado do repositório.
git tag [nome da tag]
git push <remote> <tag>
Interfaces Gráficas GUI
●
Pelo terminal se faz tudo.
●
Interfaces gráficas ajudam na visualização e 
auxiliam em algumas tarefas.
●
Recomendadas:
– Egit – Plugin para Eclipse
– GitEye – Linux, Windows e Mac
– SourceTree – Para Windows
●
Não Recomendado: GitHub for Windows
GitHub e colaboração com
Open Source
Fork no GitHub
●
Copia um repositório de outro usuário para o 
seu usuário no GitHub.
●
É assim que começa a contribuição para 
outros projetos.
●
Você teria uma cópia independente do 
repositório original, podendo fazer quaisquer 
alterações.
Issues no GitHub
●
Tradução: Questões.
●
Reportar bugs.
●
Organizar tarefas a serem feitas.
●
Permite discussão entre os usuários.
●
Pode ser referenciado por commits.
– Commit: “Closes #3”
Pull Request
●
O grande simbolo de colaboração.
●
É quando você solicita que sua alterações 
sejam unidas a uma branch no mesmo 
repositório ou a um repositório que sofreu o 
fork.
●
Igual uma Issue porém com uma branch 
associada.
●
Muito útil para o trabalho colaborativo.
Fluxo do GitHub
●
https://guides.github.com/introduction/flow/ 
Exercício Final
●
Faça um fork deste repositório:
https://github.com/BrOrlandi/GitTrainingWall 
●
Rode o projeto.
●
Sua tarefa é criar um template com informações 
do seu usuário no GitHub.
●
Faça o trabalho em um branch separada e depois 
crie um Pull Request para o repositório original.
Caso de Exemplo
●
Extensão para GNOME: Desktop Scroller.
●
Cria uma borda de rolagem entre os Desktops.
●
Permite configurar onde a borda é ativa.
●
Hoje mantido por outros usuários.
Extras
●
.gitignore
●
Git commit ­­ammend
●
Git Stash
●
GitHub pages
●
Milestones
●
Hooks
Dúvidas?
@BrOrlandi
brorlandi@gmail.com
www.slideshare.net/BrunoOrlandi
Obrigado!
Termos
●
Repositório: onde são armazenados todos os 
arquivos do projeto.
●
Commit: registro de alterações realizadas. 
Como se fosse um “checkpoint”.
●
Branch: ramificação do projeto, uma linha de 
desenvolvimento diferente
Termos
●
Merge: incorporar alterações realizadas ou 
unir branchs.
●
Fork: bifurcação, uma cópia do projeto. 
Ubuntu é um fork do Debian.
●
Push: enviar as alterações para um repositório 
remoto.
●
Pull e Fetch: baixar as alterações feitas de um 
repositório remoto. Pull realiza o merge.

Git e contibuição com projetos open source usando GitHub