Escolar Documentos
Profissional Documentos
Cultura Documentos
Github
Github
Rapidez e Segurana
Autor: Lucas Medeiros de Freitas
Verso 1.12.4.6
ndice
1 - Sistema de Controle de Verso, uma breve explicao
1.1 Controle de Verso
1
1
2 - Introduo ao Git
10
10
11
11
12
12
12
14
14
14
14
4 - Trabalhando em Equipe
4.1. Hospedando nosso projeto no GitHub
14
17
17
17
18
18
20
22
22
22
24
26
4.1.4. Exerccio
27
27
27
28
30
30
31
33
4.2.7. Exerccio
33
34
34
34
34
ii
35
39
40
44
45
5.1.8. Exerccio
45
47
47
5.2.2. Exerccio
48
49
49
49
50
5.3.4. Exerccio
50
50
51
52
52
53
53
54
54
55
56
58
iii
59
60
61
61
6.1.1. GitX
61
6.1.2. SmartGit
62
6.1.3. Tower
62
63
64
6.2.2. GitK
64
7 - Apndice
7.1. Montando um repositrio centralizado
65
67
67
67
68
iv
Em um esquema lgico, um desenvolvedor realiza as alteraes nos arquivos de cdigo fonte diretamente na rea de
trabalho e, quando estas alteraes esto maduras o suficiente, o desenvolvedor envia tais alteraes para o repositrio,
criando assim uma nova reviso.
Cada reviso armazenada no repositrio contm a parte sinttica do projeto, ou seja, as alteraes realizadas nos
arquivos, e o histrico dessa reviso, com informaes de quem fez tais alteraes, quando foram feitas e o que foi feito.
Existem basicamente dois tipos de Sistemas de Controle de Verso: os centralizados e os distribudos. Veremos nos
prximos tpicos as diferenas entre os dois.
Para obter uma cpia do projeto em um SCM centralizado, os desenvolvedores precisam realizar um checkout, como
ilustra a Figura 4. Neste exemplo, os desenvolvedores Aline e roberto obtm uma cpia do projeto e partem do mesmo
ponto.
Figura 4. Desenvolvedores obtendo uma cpia do projeto atrves de um checkout no repositrio central.
Fonte: Pronus Engenharia de Software
Aps obterem uma cpia do projeto, Aline e Roberto trabalham em suas alteraes. Ento Aline finaliza suas alterae e as
envia ao repositrio central atravs de um commit, como ilustra a Figura 5.
Figura 5. Ambos os desenvolvedores trabalham em modificaes no projeto, mas Aline publica suas alteraes primeiro.
Fonte: Pronus Engenharia de Software
Quando Roberto tenta enviar suas modificaes, o servidor as recusa e informa que seus arquivos esto desatualizados,
como ilustra a Figura 6.
Figura 6. Roberto envia suas modificaes logo aps Aline ter feito um commit, e ento o servidor recusa suas modificaes.
Fonte: Pronus Engenharia de Software
Roberto precisa atualizar seu cdigo para receber as atualizaes de Aline, atravs de um update. Desta forma as
atualizaes de Aline so mescladas com o cdigo que est em sua rea de trabalho. Este processo de mesclagem
conhecido como merge.
Figura 8. Aps ter feito um update, Roberto estar apto a enviar suas modificaes atravs de um commit.
Fonte: Pronus Engenharia de Software
Enquanto Roberto est atualizando seu cdigo e enviando suas alteraes para o repositrio central, Aline trabalha em
novas modificaes no projeto, podendo envi-las normalmente, caso no tenha alterado o mesmo arquivo que Roberto.
Figura 9. Aline envia suas alteraes normalmente ao repositrio central, j que estas no foram feitas no mesmo arquivo que Roberto modificou.
Fonte: Pronus Engenharia de Software
Figura 10. Funcionamento de um SCM distribudo. Neste modelo cada desenvolvedor possui um repositrio independente e uma rea de trabalho.
Fonte: Pronus Engenharia de Software
Mesmo sendo local o repositrio em um SCM distribudo, podemos sincronizar facilmente com outros repositrios
remotos na rede atravs dos comandos pull e push.
Figura 11. Podemos sincronizar nosso repositrio com o de outros desenvolvedores em um SCM distribudo, ou at mesmo simular um repositrio central.
Fonte: Pronus Engenharia de Software
Seguindo nosso exemplo, mas agora trabalhando em um SCM distribudo, o desenvolvedor Roberto realiza um clone do
repositrio de Aline e, a partir de ento, ambos partem do mesmo ponto.
Figura 12. Roberto realiza um clone do repositorio de Aline, obtendo uma copia fiel de todo o contedo sintrico e todo o histrico do projeto.
Fonte: Pronus Engenharia de Software
Figura 13. Aline e Roberto trabalham em novas modificaes em seus repositrios locais, sem interferir no repositrio um do outro.
Fonte: Pronus Engenharia de Software
Mesmo possuindo um repositrio local, Roberto poder sincronizar seu repositrio com o de Aline, obtendo todas as
modificaes realizadas por ela, atravs de um comando pull.
Figura 14. Roberto baixa as atualizaes feitas por Aline, atravs de um comando pull.
Fonte: Pronus Engenharia de Software
Ao baixar as atualizaes de Aline, estas sero mescladas no repositrio local de Roberto atravs de um merge.
Figura 15. Um merge feito no repositrio local de Roberto, aps baixar as atualizaes do repositrio da Aline.
Fonte: Pronus Engenharia de Software
Depois de ter baixado as atualizaes de Aline, Roberto publica suas modificaes em seu repositrio local. Enquanto isso,
Aline trabalha normalmente e publica novas alteraes no repositrio local dela.
Figura 17. Roberto envia suas alteraes para o repositrio local de Aline, atravs de um push.
Fonte: Pronus Engenharia de Software
Como vimos, o Sistema de Controle de Verso distribudo tem uma vantagem muito grande por trabalhar desconectado,
sem a necessidade de um servidor central. O Git um SCM distribudo e iremos aprender mais sobre ele nos prximos
tpicos.
2 - Introduo ao Git
Figura 18. Todo o processo de versionamento feito localmente com o Git, podendo sincronizar com repositrios remotos apenas quando necessrio.
Fonte: whygitisbetterthanx.com
10
Figura 19. O Git possui um tempo de resposta muito menor em diversas tarefas, comparado com outros SCMs distribudos.
Fonte: whygitisbetterthanx.com
Figura 20. Exemplo de um fluxo de trabalho usando um repositrio central com o Git.
Fonte: whygitisbetterthanx.com
Figura 21. rea intermediria do Git, uma grande vantagem em relao a outros SCMs.
Fonte: whygitisbetterthanx.com
11
Figura 22. Selecione a ltima verso da instalao do Git para download, de acordo com a verso do seu OSX.
Figura 23. Clique no link contendo o arquivo de instalao para baixar o instalador do Git.
12
13
3.1.2.3 Instalando o Git a partir do source
Outra opo para instalar o Git no Linux a partir do source. Baixe o source do Git no link:
http://git-scm.com/download
Aps baixar o source do Git, basta descompact-lo e, em seu diretrio, executar os seguintes comandos (como root) para
instalar:
14
15
Na prxima tela, devemos definir como devemos usar o Git no Windows. Marque a opo Run Git from de Windows
Command Prompt e clique em Next, conforme imagem a seguir.
Na prxima tela, deixe marcado a primeira opo e clique em Next, conforme imagem a seguir.
16
3.2.1. Exerccio
Vamos configurar as variveis globais de usurio e e-mail para utilizar o Git:
1. Abra o terminal em seu Sistema Operacional e digite o comando:
substituindo <NOME DO SEU USURIO> pelo nome de usurio que deseja utilizar.
2. Aps definir o usurio, ainda no terminal, defina o seu e-mail digitando o comando:
17
3.3.1. Exerccio
Agora que voc aprendeu a criar um repositrio do Git, vamos criar um repositrio chamado curso-git, que ser usado
no decorrer do nosso curso.
1. Crie um diretrio chamado curso-git em seu sistema de arquivos local;
2. Abra o terminal do seu Sistema Operacional e entre no diretrio curso-git que foi criado;
3. Execute o comando: git init;
4. Liste os arquivos deste diretrio e perceba o diretrio .git que foi criado.
Aps criar o arquivo pagina.html (nosso primeiro arquivo do projeto) e salv-lo, executamos o comando git status e
percebemos a seguinte sada:
18
A sada do comando git status nos informou que existe um novo arquivo no repositrio (pagina.html), porm este arquivo
ainda no est trackeado pelo Git. Um arquivo no trackeado (untracked) um arquivo que est apenas na rea de trabalho
(working directory), onde trabalhamos diretamente com o arquivo. Precisamos ento adicionar este arquivo na rea
intermediria (staging area ou Index) antes de fazer um commit.
#Fica a dica
O comando git status muito til para verificarmos o estado dos nossos arquivos na branch atual. Ele nos
informa se h alteraes a serem inseridas na staging area ou se h arquivos na staging area prontos para serem
commitados.
Para adicionar nosso arquivo pagina.html na rea intermediria, usamos o comando git add:
Ao executar o comando git add pagina.html adicionamos o arquivo pagina.html na rea intermediria. Com o comando
git status, logo em seguida, podemos verificar que agora nosso arquivo pagina.html est trackeado, ou seja, ele est no
Index (staging area) e pronto para ser adicionado definitivamente no repositrio, em nossa branch master.
#Fica a dica
Uma branch uma ramificao do projeto, um espao contendo uma cpia dos arquivos do repositrio. Ao criar
um repositrio com o Git, automaticamente uma branch chamada master criada e esta ser a branch principal
do projeto. Com o Git podemos ter quantas branches desejarmos. Aprenderemos mais sobre branch em outro
captulo.
Agora que nosso arquivo pagina.html est trackeado (adicionado ao Index), podemos realizar o commit, usando o
comando git commit.
19
Perceba que ao executarmos o comando git commit, o Git emite uma sada nos informando que o arquivo pagina.html
foi adicionado ao repositrio, criando uma nova reviso. Aps realizar o commit, o git status informa que nosso working
directory est limpo, sem nenhum commit a ser feito.
Podemos verificar o Log de commits com o comando git log:
#Fica a dica
O comando git log mostra o Log de todos os commits realizados na branch atual. O Log informa o autor do
commit, a data e hora em que o commit foi realizado e a mensagem do commit. Perceba no Log que cada
commit identificado por uma hash SHA-1 de 40 caracteres hexadecimais. Diferente de SCMs centralizados,
onde cada commit recebe um nmero como identificador (sendo que o commit mais recente sempre ter um
nmero maior que os anteriores), em SCMs distribudos, como o Git, cada commit identificado por uma hash
nica.
Sempre que executamos um commit, uma mensagem deve ser informada identificando-o. Veja na Figura 39 onde
executamos o comando git commit -m Criando nossa primeira pagina. A flag -m indica que o contedo em seguida
a mensagem do commit. Caso a flag -m seja omitida, o prprio Git ir abrir um editor de texto pedindo-o para digitar uma
mensagem para o commit a ser realizado. Informar uma mensagem/comentrio em cada commit muito importante para
manter um histrico de evoluo do cdigo e facilita a leitura do que foi alterado naquele commit para todos os
colaboradores do projeto.
3.4.1. Exerccio
Agora que voc aprendeu a fazer um commit, vamos colocar em prtica.
1. Crie um arquivo chamado pagina.html no diretrio curso-git (onde foi criado o repositrio) com o seguinte contedo:
20
21
4 - Trabalhando em Equipe
Agora que j sabemos criar um repositrio do Git e realizar commit, iremos trabalhar de forma colaborativa. Apesar de ser
um SCM distribudo, com o Git podemos facilmente disponibilizar nosso repositrio em um servidor central para que outros
desenvolvedores possam colaborar com nosso projeto.
Em nosso curso iremos utilizar o GitHub para armazenar nosso repositrio do Git. O GitHub uma ferramenta na Web que
nos possibilita compartilhar nosso projeto de forma rpida e possui muitos recursos que facilitam a utilizao do Git. GitHub
praticamente uma rede social de desenvolvedores para projetos que usam o Git, permitindo que usurios do mundo
inteiro possam ter acesso aos repositrios publicados.
O cadastro no GitHub gratuito e voc pode armazenar seus repositrios sem nenhum custo, desde que eles sejam open
source. No GitHub possvel ter repositrios privados tambm. Os repositrios privados so pagos, porm seu custo
baixo: possvel ter repositrios privados a partir de 7 dlares por ms.
Utilizaremos ento um repositrio open source, sem custo mensal.
Figura 41. Clique no link Create a free account para criar uma conta gratuita no GitHub.
22
Precisamos agora gerar uma chave de segurana e cadastr-la no GitHub para que ele autorize nossa mquina a gerenciar
nossos repositrios remotos. Para isto, basta entrar no terminal (para usurios Windows basta abrir o Git Bash) e digitar o
seguinte comando:
Figura 43. Gerando uma chave de segurana RSA para cadastrarmos no GitHub.com.
23
Figura 45. Pgina inicial da conta cadastrada no GitHub.com. Para criar um novo repositrio, basta clicar no link New Repository.
24
Nosso novo repositrio remoto est criado e pronto para ser usado. Agora precisamos configurar nosso repositrio remoto
curso-git em nosso repositrio local de mesmo nome para que seja feita a sincronizao entre os dois.
Para configurar um repositrio remoto do GitHub em um repositrio local, basta usar o seguinte comando:
Substituindo <NOME DO REPOSITRIO> por um nome que ser usado para identific-lo (por conveno, o Git
recomenda utilizar o nome origin), <USUARIO> pelo nome do usurio cadastrado no GitHub e <NOME DO
REPOSITRIO> pelo nome do repositrio cadastrado no GitHub. Em nosso exemplo usaremos o comando:
#Fica a dica
O comando git remote add adiciona um repositrio remoto para sincronizarmos com o repositrio local. Aps
cadastrar um repositrio remoto podemos enviar todas as nossas alteraes para ele e tambm baixar dele todas
as alteraes feitas por outros desenvolvedores. Quando sincronizamos com um repositrio remoto, tanto nosso
repositrio local como o remoto conter toda a parte sinttica do projeto (cdigo fonte) bem como todo o histrico
de alteraes realizados.
Agora que adicionamos um repositrio remoto, podemos enviar a ele todas as nossas alteraes realizadas no repositrio
local, para que outros desenvolvedores possam contribuir com o projeto.
Para enviar nossas alteraes para o repositrio remoto basta utilizar o comando:
2012 Hachi Tecnologia | treinamento@hachitecnologia.com.br
25
Substituindo <ALIAS DO REPOSITORIO> pelo nome que desejamos utilizar para nosso repositrio remoto e <NOME DA
BRANCH LOCAL> pelo nome da branch que desejamos sincronizar com o repositrio remoto. No nosso caso, usaremos
o seguinte comando:
Ao visualizar nosso repositrio remoto no site GitHub.com podemos ver claramente os arquivos enviados, juntamente com
todo o histrico do projeto. Veja:
26
4.1.4. Exerccio
Agora que voc j sabe como criar um repositrio remoto no GitHub.com e sincronizar com seu repositrio local, vamos
colocar em prtica.
1. Crie uma conta no site GitHub.com.
2. Gere uma chave de segurana RSA em seu computador e cadastre-a em sua conta do site GitHub.com.
3. Crie um repositrio remoto chamado curso-git em sua conta no site GitHub.com.
4. Adicione o repositrio remoto curso-git criado no site GitHub.com ao seu repositrio curso-git local.
5. Sincronize seu repositrio local com o repositrio remoto enviando todas suas revises a ele.
6. Abra a pgina do seu repositrio remoto no GitHub.com e perceba as revises enviadas.
27
No nosso caso, iremos utilizar o comando abaixo para clonar o repositrio curso-git:
Aps fazer o clone, o usurio Dick Vigarista poder trabalhar no projeto fazendo suas alteraes e sincronizando-as com o
repositrio remoto.
#Fica a dica
Quando efetuamos o clone de um repositrio, o Git comprime todos os dados que sero trafegados, usando a
biblioteca zlib. Isto otimiza o trfego de dados na rede, e uma vantagem do Git, tornando o processo de
sincronizao mais rpido que outros SCMs.
O usurio Dick Vigarista resolve ento alterar o arquivo pagina.html adicionando um novo pargrafo, conforme podemos
ver na Figura 52.
Figura 52. O usurio Dick Vigarista adiciona um novo pargrafo no arquivo pagina.html
28
Figura 53. A sada do comando git status informa que existem novas alteraes a serem publicadas no repositrio.
Para publicar suas alteraes no repositrio local, Dick Vigarista precisa executar a sequncia de comandos:
Figura 54. Dick Vigarista commita suas alteraes no repositrio local e verifica o status logo em seguida.
As alteraes foram commitadas no repositrio local de Dick Vigarista. Podemos ver o Log dos commits com o comando
git log.
Figura 55. Log de commits mostrando todos os commits existentes no repositrio de Dick Vigarista.
Agora Dick Vigarista possui dois commits em seu repositrio: um commit realizado pelo usurio Lucas Freitas, que criou o
arquivo pagina.html, e seu prprio commit.
2012 Hachi Tecnologia | treinamento@hachitecnologia.com.br
29
Figura 56. Enviando as alteraes para o repositrio remoto com git push.
Agora nosso repositrio remoto j possui as alteraes feitas por Dick Vigarista, permitindo que outros desenvolvedores
possam baixar essas alteraes. Veja na pgina do repositrio a reviso enviada por Dick Vigarista, na Figura 57.
#Fica a dica
Quando efetuamos o clone de um repositrio remoto o Git automaticamente o adiciona em nosso repositrio
local, com o alias origin, para realizarmos as sincronizaes posteriores.
30
Figura 58. Usurio Lucas Freitas baixando as atualizaes do repositrio remoto enviadas por Dick Vigarista.
Veja, na Figura 58, que o usurio Lucas Freitas executou um pull, baixando todas as atualizaes existentes no repositrio
remoto. Agora o usurio Lucas Freitas possui as alteraes realizadas pelo usurio Dick Vigarista.
...
...
Aps realizar a alterao, Lucas Freitas faz o commit e a envia para o repositrio remoto.
Enquanto isso, o usurio Dick Vigarista decide tambm alterar o ttulo da pgina em seu repositrio local, deixando-o com o
seguinte contedo:
...
...
Dick Vigarista realiza o commit em seu repositrio local mas, quando tenta enviar suas alteraes para o repositrio remoto,
o push rejeitado e o Git emite um erro informando que sua base de commits est desatualizada, sendo necessrio baixar
do repositrio remoto todos os commits que seu repositrio local ainda no possui
31
Figura 59. Dick Vigarista tenta enviar suas alteraes mas o repositrio remoto as rejeita, devido sua base de commits estar desatualizada.
Para resolver este problema, Dick Vigarista dever realizar um pull para baixar as novas alteraes do repositrio remoto.
Ao realizar o pull, o Git ir informar que um problema ocorreu ao fazer o merge automtico devido ao usurio Lucas Freitas
tambm ter alterado a mesma linha do arquivo pagina.html.
Figura 60. Dick Vigarista executa o pull para baixar as novas alteraes do repositrio remoto, mas o merge automtico falha.
Quando o merge automtico falha, o Git cria uma branch temporria para que o conflito seja resolvido. Veja como ficou o
arquivo aps o conflito:
Figura 61. Contedo do arquivo pagina.html aps o conflito ocorrido ao executar o merge automtico.
Agora Dick Vigarista precisa resolver o conflito manualmente, decidindo qual contedo ir permanecer no ttulo da pgina.
Dick Vigarista resolve o conflito, deixando o ttulo com o seguinte contedo:
...
...
Agora que Dick Vigarista editou o arquivo para resolver o conflito manualmente, basta adicionar o arquivo no Index (staging
area) e realizar o commit com a nova alterao.
2012 Hachi Tecnologia | treinamento@hachitecnologia.com.br
32
4.2.7. Exerccio
Agora que voc j sabe contribuir com um repositrio remoto, vamos colocar em prtica:
1. Crie outro usurio no GitHub.com (no esquea de cadastrar sua chave de segurana).
2. Adicione o novo usurio como colaborador do repositrio curso-git.
3. Faa um clone do repositrio a partir do novo usurio.
4. Modifique o arquivo pagina.html adicionando um novo pargrafo, deixando-o com o seguinte contedo:
<html>
<head>
<title>Curso de Git</title>
</head>
<body>
<h1>Git - Um SCM rapido e seguro!</h1>
<p>O Git foi criado por Linus Torvalds</p>
</body>
</html>
5. Salve o arquivo e faa o commit no repositrio local.
6. Envie as alteraes para o repositrio remoto do GitHub.com.
7. Baixe as alteraes do repositrio remoto com o primeiro usurio que voc cadastrou no GitHub.com.
33
#Fica a dica
Podemos visualizar as branches do nosso repositrio local apenas digitando o comando: git branch.
#Fica a dica
Podemos criar uma branch e alternar para ela utilizando um nico comando: git checkout -b desenvolvimento.
34
Definimos a cor vermelha para o cabealho e a cor azul para os pargrafos. Precisamos agora aplicar a folha de estilo em
nossa pgina, no arquivo pagina.html, conforme Figura 65.
Aps criar a folha de estilo e aplic-la em nossa pgina, vamos realizar um commit das alteraes feitas na branch
desenvolvimento.
35
Realizamos as alteraes na branch desenvolvimento e fizemos o commit destas alteraes. Perceba que as alteraes
foram commitadas apenas na branch desenvolvimento. Podemos verificar isso claramente quando comparamos o Log de
commits da branch desenvolvimento com os da branch master.
Figura 68. Log da branch master. Perceba que as alteraes realizadas na branch desenvolvimento no refletiram na branch master.
Se uma nova prioridade no projeto for solicitada, como a correo de um bug por exemplo, e nossas alteraes no
estiverem maduras o suficiente para irem para a produo, podemos voltar para a branch master e realizar as novas
solicitaes, sem perdermos o nosso trabalho.
Imagine que seu chefe tenha pedido para adicionar um novo pargrafo pgina, mas ele no quer que a folha de estilo que
aplicamos entre em produo, pois ela ainda no est completa. Como as modificaes que fizemos no foram feitas na
branch master, ficar fcil atender a essa nova solicitao.
Voltaremos para a branch master com o comando:
36
Aps a alterao, realizamos um commit na branch master e a verso est pronta para ser usada em produo.
Porm, ao abrir a pgina, seu chefe percebe que existe um bug causado pelo mal fechamento da tag de pargrafo, onde
adicionamos <\p> ao invs de </p>, acarretando no mal funcionamento do site.
Devemos ento corrigir o bug causado, trocando o pargrafo bugado de
para
Realizamos ento um commit com a correo do bug, gerando uma nova reviso.
37
Agora iremos dar continuidade ao nosso trabalho na branch desenvolvimento. Para isto, executamos novamente o
comando:
38
Agora que temos todos os commits da branch master podemos enviar as alteraes feitas na branch desenvolvimento
para ela. Para isto, precisamos alternar para a branch master, com o comando:
Estando na branch master, podemos puxar as alteraes da branch desenvolvimento com o comando:
39
<p>O Git foi criado por Linus Torvalds para desenvolver o Kernel do Linux.</p>
Aps realizar suas alteraes, Dick Vigarista realiza um commit na branch master e envia sua reviso para o repositrio
remoto.
Figura 75. Dick Vigarista commita suas alteraes e as envia para o repositrio remoto.
Mas o usurio Lucas Freitas tambm decide alterar o mesmo pargrafo, deixando-o com o seguinte contedo:
Figura 76. Lucas Freitas faz suas alteraes e as commita na branch desenvolvimento.
40
Figura 77. Lucas Freitas baixa as alteraes do repositrio remoto para a branch master local.
Agora Lucas Freitas possui em sua branch master local todas as alteraes existentes no repositrio remoto, enviada por
outros usurios. Porm, sua branch local desenvolvimento ainda no possui essas alteraes. O usurio Lucas Freitas
dever agora fazer o rebase na branch desenvolvimento para atualizar a base de commits de acordo com a branch
master.
Ao realizar o rebase, um conflito ocorre, gerando a seguinte sada:
Figura 78. Lucas Freitas realiza o rebase na branch master e percebe que ocorreram conflitos.
O Git informou que foi encontrado um conflito no arquivo pagina.html, ocorrido durante o merge automtico no arquivo,
devido s alteraes realizadas pelos dois usurios na mesma linha do cdigo. Quando um conflito ocorre durante o
rebase, o Git cria uma branch temporria para que o conflito seja resolvido. Isto ocorrer em todos os commits que gerarem
41
Figura 79. O Git informa que estamos em uma branch temporria, chamada de (no branch), para resolver os conflitos do rebase.
No aviso do conflito, na Figura 78, o prprio Git nos informa trs possveis solues para resolv-lo:
1. Usar o comando git rebase --skip para descartar o nosso commit, substituindo-o pelo commit feito por Dick Vigarista;
2. Usar o comando git rebase --abort para cancelar o rebase e descartar as atualizaes vindas do branch master;
3. Ou resolver os conflitos manualmente, decidindo qual o contedo que dever ficar no arquivo pagina.html, e usar o
comando git rebase --continue aps resolver estes conflitos para dar continuidade ao rebase.
O comando git status nos informa a mensagem both modified: pagina.html indicando que ambos os desenvolvedores
alteraram o mesmo arquivo, gerando um conflito. Devemos resolver o conflito para que esta mensagem desaparea.
Figura 81. Sada do comando git status informando que existe um conflito no arquivo pagina.html.
42
Figura 82. Contedo do arquivo pagina.html aps resoluo do conflito gerado pelo rebase.
Aps resolver os conflitos manualmente, adicionamos o arquivo pagina.html ao Index, com o comando:
Verificando o status, percebemos que agora a mensagem both modified desapareceu, conforme Figura 83.
Aps ter resolvido todos os conflitos, podemos dar continuidade ao rebase com o comando:
43
Pronto! Nossas alteraes esto na branch master e prontas para serem enviadas para o repositrio remoto, usando o
comando:
git push origin master
Figura 86. Enviando as alteraes da branch master local para o repositrio remoto.
#Fica a dica
Para listarmos as branches existentes no repositrio remoto, usamos o comando
git branch -r
44
Pronto! Nossa branch desenvolvimento foi enviada para o repositrio remoto. Agora outros desenvolvedores podem
contribuir com alteraes nesta branch. Perceba na Figura 87 a sada do comando git branch -r, listando as branches
remotas, mostrando que a branch desenvolvimento agora existe no repositrio remoto.
Figura 88. Usurio Dick Vigarista baixando a branch desenvolvimento do repositrio remoto para o repositrio local.
5.1.8. Exerccio
Agora que voc aprendeu a trabalhar com branch, vamos colocar em prtica:
1. Crie uma branch chamada desenvolvimento.
2. Adicione um arquivo chamado estilo.css na nova branch com o seguinte contedo:
h1 {
color: red;
}
p{
color: blue;
}
45
para
...
...
46
substituindo <MENSAGEM> por uma mensagem sobre a verso que est sendo etiquetada, e <NOME DA TAG> pelo
nome que deseja atribuir tag.
#Fica a dica
Para listar as tags do nosso repositrio, usamos o comando:
git tag
Vamos criar uma tag para etiquetar a verso 1.0 do nosso projeto, usando o comando:
Figura 89. Criando uma tag para identificar a Verso 1.0 do nosso projeto.
Para mostrar melhor o uso de uma tag, vamos realizar uma alterao na branch master e chamar o novo estado do projeto
de Verso 2.0. Para isto, iremos adicionar mais um pargrafo em nosso arquivo pagina.html, com o seguinte contedo:
...
...
Realizamos o commit com a nova alterao e criamos uma tag com a etiqueta v2.0.
47
Figura 90. Criando uma tag para identificar a Verso 2.0 do nosso projeto.
Agora temos duas tags em nosso repositrio. Uma identificando a Verso 1.0 e outra identificando a Verso 2.0 do nosso
projeto. Caso seja necessrio voltar Verso 1.0, para verificar como estava o cdigo nessa verso ou mesmo para gerar
novamente uma release com essa verso, basta realizar um checkout para a tag v1.0, usando o comando:
Podemos tambm verificar a diferena entre uma tag e outra, usando o comando:
Veja a sada do di mostrando a diferena entre as Verses 1.0 e 2.0 do nosso sistema:
Figura 91. Verificando a diferena entre as Verses 1.0 e 2.0 do nosso projeto, com o comando git diff.
Verifique a sada do di mostrando que a diferena entre as duas verses exatamente a linha:
que adicionamos na Verso 2.0 da nossa pgina. O + significa que a linha foi adicionada. Caso a linha tivesse sido
removida da Verso 1.0 pra 2.0 o smbolo seria -.
5.2.2. Exerccio
Agora que aprendemos a trabalhar com tags, vamos colocar em prtica:
1. Crie uma tag na branch master com a etiqueta v1.0.
2. Faa uma alterao no arquivo pagina.html, adicionando um novo pargrafo com o contedo:
...
...
48
git di
Veja a sada do comando git di aps inserirmos um novo pargrafo em nosso arquivo pagina.html:
Figura 92. Comando git diff mostrando as alteraes realizadas em nosso working directory que ainda no foram commitadas.
Figura 93. Comando git diff mostrando diferena entre dois commits realizados em nosso repositrio.
49
git di HEAD~3
Figura 94. Comando git diff mostrando diferena entre dois commits realizados em nosso repositrio.
#Fica a dica
A palavra HEAD utilizada no Git como um ponteiro para a branch atual. Portanto lembre-se: HEAD no uma
branch, mas apenas um ponteiro para a branch atual.
5.3.4. Exerccio
Agora que voc aprendeu a trabalhar com o diff, vamos colocar em prtica.
1. Realize uma alterao no arquivo pagina.html, na branch master, adicionando um pargrafo com o seguinte contedo:
...
...
50
Para ver seu funcionamento, vamos alterar o arquivo pagina.html adicionando o seguinte pargrafo:
...
...
Aps ter alterado o arquivo pagina.html podemos desfazer suas alteraes e voltar ao estado do ltimo commit, usando o
comando:
git checkout pagina.html
Figura 95. Desfazendo as alteraes realizadas no arquivo pagina.html em nosso working directory.
Perceba, no exemplo, que usamos o di para verificar as alteraes realizadas no arquivo pagina.html, no working
directory, antes de descartar as alteraes. Logo em seguida, aps o descarte, usamos o di novamente e verificamos que
realmente as alteraes do arquivo pagina.html foram descartadas.
#Fica a dica
Lembre-se que j usamos o comando git checkout anteriormente, mas para alternar entre branches e entre tags.
O git checkout tem vrias utilidades, e pode ser usado para:
Alternar entre branches, usando a sintaxe:
git checkout <NOME DA BRANCH>
51
Aps salvar o arquivo com a alterao e adicion-lo ao Index (usando o comando git add pagina.html), ele est pronto
para ser commitado. Porm, em alguns casos,
Mesmo tendo adicionado nossas alteraes ao Index, decidimos ento desfaz-la, usando o comando:
Perceba, no exemplo da Figura 96, que adicionamos nossa alterao feita no arquivo pagina.html e a adicionamos ao
Index. Logo em seguida, a sada do comando git status nos informa que o arquivo foi modificado e j est no Index,
pronto para ser commitado. Porm mudamos de idia e desfazemos a alterao com o comando git reset HEAD
pagina.html. Logo em seguida a sada do git status nos mostra que as alteraes j NO esto mais no Index, e sim no
working directory.
2012 Hachi Tecnologia | treinamento@hachitecnologia.com.br
52
Seguindo nosso projeto, vamos novamente adicionar em nosso arquivo pagina.html o pargrafo:
...
...
Mas desta vez adicionamos as alteraes no working directory e a commitamos. Logo em seguida, por algum motivo,
mudamos de idia e queremos desfazer o commit realizado. Veja o processo sendo realizado na Figura 97.
53
5.4.3.1. Exerccio
Agora que voc aprendeu a descartar alteraes do ltimo commit, vamos colocar em prtica.
1. Altere o arquivo pagina.html, adicionando o seguinte pargrafo:
...
...
e faa o commit.
Aps alterar o cabealho e fazer o commit, vamos adicionar os seguintes pargrafos no arquivo pagina.html:
...
!
...
Agora iremos adicionar mais um paragrafo no arquivo pagina.html com um link para a pgina oficial do Git, com o seguinte
contedo:
54
Depois de realizar estes trs commits, mudamos de idia e percebemos que no queriamos alterar o cabealho, como
fizemos h trs commits atrs. Se utilizarmos o git reset nesta situao, perderamos todos os commits realizados aps a
alterao do cabealho, pois o git reset usado para descartar apenas o ltimo commit, como vimos anteriormente.
Para solucionar nosso caso, de desfazer a alterao do cabealho que fizemos h trs commits atrs, usaremos o
comando git revert, com a seguinte sintaxe:
Quando usamos o git revert, o Git abre um editor de texto para informarmos a mensagem que ser usada para o commit
automtico que ser feito desfazendo as alteraes. Veja o processo de revert na Figura 98.
Perceba, na Figura 98, que revertemos o commit com a alterao do cabealho sem afetarmos os commits posteriores.
No log podemos ver a mensagem que foi inserida no commit do revert: Revertendo a alterao de cabealho. Essa
mensagem foi inserida manualmente no editor de texto aberto pelo Git (apenas no mostramos esse passo).
Agora nosso cabealho ficou exatamente como estava no incio do projeto, com o seguinte contedo:
...
...
5.4.4.1. Exerccio
Agora que voc aprendeu a descartar alteraes em um commit antigo, vamos colocar em prtica:
1. Altere cabealho do arquivo pagina.html, deixando-o com o seguinte contedo:
...
...
e faa o commit.
55
!
...
e faa o commit.
3. Faa mais uma alterao no arquivo pagina.html, adicionando mais o seguinte pargrafo:
...
...
e faa o commit.
4. Agora reverta (desfaa) a alterao de cabealho realizada no tem de nmero 1 deste exerccio.
Realizamos o commit e logo em seguida adicionamos outro pargrafo em nossa pgina, com o seguinte contedo:
...
...
Realizamos novamente o commit e decidimos adicionar mais um pargrafo, com o seguinte contedo:
...
...
Finalmente, realizamos mais uma alterao na pgina, adicionando o pargrafo abaixo e realizando o commit:
...
...
Aps realizar essas alteraes, um usurio telefonou para o suporte e informou que a pgina est com um bug, mas que
esse bug no existia h 4 dias atrs. Trata-se de um bug inserido na tag do cabealho, quando o alteramos, fechando a tag
incorretamente com a barra invertida, ficando: <\h1>.
56
Quando executamos o comando acima, o Git inicia o bisect para procurarmos o bug. Como o bug existe de 4 dias pra c,
ento a nossa branch atual, a branch master, est com o bug e devemos marc-la como ruim, ou seja, bugada. Para isto,
usamos o seguinte comando:
O comando git bisect bad marca um commit como sendo ruim, ou seja, bugado.
Conforme nosso usurio havia dito, h 4 dias atrs o bug no existia na pgina. Imagine que o commit com a hash
<290fdfa9935512c0a945c72b50ed2925de66d0d6> tenha sido realizado h 4 dias atrs, ento pela lgica iremos marclo como bom, ou seja, no bugado, e fazemos isso com o comando:
Quando executamos o comando acima, estamos dizendo ao Git que o commit com a hash informada est bom, ou seja,
no est bugado. O Git, ento, ir automaticamente fazer o checkout de uma verso intermediria, entre a que marcamos
como ruim e a que marcamos como bom, para testarmos. Se a verso que o Git fez o checkout automaticamente estiver
com o bug, devemos marc-la como ruim, com o comando git bisect bad. Mas se a verso estiver sem o bug, devemos
marc-la como boa, usando o comando git bisect good. O Git ir fazer chackouts automaticamente para testarmos at
encontrar o commit em que o bug foi inserido.
Veja, na Figura 99, todo o processo de busca do bug, usando o bisect:
Todo checkout que o bisect nos retorna para testar, devemos marcar se ele est bom (good) ou ruim (bad), at o Git achar
qual o commit em que foi inserido o bug. Fizemos isto no exemplo da Figura 99, e ao final o Git nos informou exatamente o
commit em que foi inserido o bug.
Aps o Git nos informar em qual commit foi inserido o bug, devemos sair do modo bisect e usar o revert para corrigir este
commit. Seguindo nosso exemplo, vamos ento sair do bisect com o comando:
57
Figura 100. Saindo do modo bisect aps encontrado o commit com bug.
Veja, na Figura 100, que realmente o Git nos informou corretamente o commit que estava com bug. O fato comprovado
na sada do git show, mostrando a tag do cabealho que foi invertida por um descuido do nosso programador.
Agora que sabemos o commit em que foi inserido o bug, podemos iniciar o processo de revert do commit, conforme
aprendemos anteriormente neste curso.
#Fica a dica
Para visualizarmos todas as alteraes realizadas em um commit, podemos usar o comando:
5.5.1. Exerccio
Agora que voc aprendeu a procurar um bug, usando o git bisect, vamos colocar em prtica.
1. Altere o cabealho do arquivo pagina.html, deixando-o com o seguinte contedo:
...
...
e faa o commit. (A tag de fechamento do cabealho deve ficar invertida, conforme escrito acima).
e faa o commit.
58
e faa o commit.
e faa o commit.
5. Aps realizar estas 4 alteraes, devemos procurar o bug que fez a pgina ficar desformatada, deixando todos os
pargrafos com o mesmo estilo de um cabealho. Procure o bug na tag de cabecalho (<h1>) usando o git bisect.
6. Aps encontrar o bug, reverta o commit para corrig-lo.
Aps realizar as alteraes no working directory, uma nova prioridade surge, solicitando uma simples alterao no
cabealho da pgina para o seguinte contedo:
...
...
A alterao solicitada dever ser feita urgentemente, mas as alteraes que estvamos trabalhando no podero ainda
entrar em produo, pois no foram homologadas ou esto incompletas. Para realizar a alterao do cabealho sem perder
nosso trabalho, usamos o seguinte comando:
git stash
Aps executar o stash, nossas alteraes sero guardadas para recuperarmos mais tarde. Agora podemos trabalhar
normalmente na nova solicitao.
Realizamos a alterao do cabealho, conforme solicitado, e efetuamos o commit. Agora que atendemos nova solicitao
e realizamos o commit, podemos recuperar as alteraes que estvamos trabalhando, usando o comando:
59
Por padro o comando git stash pop recupera o ltimo stash salvo, mas podemos recuperar algum outro stash
salvo usando o nmero do stash conforme aparece na sada do comando git stash list.
5.6.1. Exerccio
Agora que voc aprendeu a usar o git stash para guardar alteraes para mais tarde, vamos colocar em prtica.
1. Altere o arquivo pagina.html, inserindo os seguintes pargrafos:
...
...
e faa o commit.
60
Durante o curso, aprendemos como trabalhar com o Git atravs da linha de comando, que a forma padro, independente
do Sistema Operacional. A vantagem de se trabalhar com a linha de comando que podemos usufruir de todos os
recursos do Git. Mesmo assim, existem ferramentas grficas que facilitam o uso do Git, deixando sua usabilidade muito
mais amigvel para aqueles que no gostam muito de trabalhar em linha de comando. Vamos indicar algumas destas
ferramentas.
6.1.1. GitX
Uma das opes o GitX, uma interface gratuita e bastante simples que facilita o uso das funcionalidades bsicas do Git.
Para baix-lo, basta acessar o link: http://gitx.frim.nl/index.html
Veja algumas imagens do GitX em ao:
61
6.1.2. SmartGit
Outra ferramenta muito interessante para trabalhar com o Git em modo grfico, no Mac, o SmartGit. Esta ferramenta vai
alm do bsico do Git, oferecendo funcionalidades avanadas, como fazer um revert de um commit, sincronizar com
repositrios remotos e inclusive interagir com o GitHub.com. O SmartGit, apesar de ser pago, possui uma verso gratuita
para fins no comerciais. Para baix-lo, basta acessar o link: http://www.syntevo.com/smartgit/index.html
Veja algumas imagens do SmartGit em ao:
6.1.3. Tower
O Tower uma das ferramentas grficas mais poderosas para usar o Git no Mac. Possui suporte a diversas
funcionalidades avanadas do Git, como fazer o revert de um commit, sincronizar com repositrios remotos, sincronizar
com o GitHub.com, trabalhar com stash, e muitas outras opes. O Tower uma ferramenta paga e possui uma verso
trial para 30 dias de avaliao. Para baix-lo, basta acessar o link: http://www.git-tower.com
2012 Hachi Tecnologia | treinamento@hachitecnologia.com.br
62
Figura 105. Visualizando o status da branch master em um repositrio do Git, atravs do Tower.
63
6.2.2. GitK
Outra opo para usar algumas funcionalidades bsicas do Git, em modo grfico, o GitK.
Veja uma imagem do GitK em ao:
64
http://code.google.com/p/tortoisegit/downloads/list
65
66
7 - Apndice
O Git no possui sistema de autenticao prprio, deixando esta competncia a cargo do protocolo de comunicao
escolhido.Veremos como montar um repositrio centralizado com o Git no Mac, Linux e Windows.
67
Figura 113. Adicionando o repositrio remoto centralizado em nosso repositrio local e fazendo a sincronizao entre os dois.
#Fica a dica
Quando criamos um repositrio do Git que servir apenas de repositrio centralizado, iniciamos este repositrio
com a flash --bare ao executar o git init:
git init --bare
Pronto! Agora nosso servidor centralizado est pronto e podemos sincronizar nosso repositrio local com ele atravs da
rede, realizando push e pull.
c:\git;
cd c:\git
Pronto! Nosso repositrio remoto est criado. Para us-lo em outras mquinas Windows, basta montar o compartilhamento
nestas mquinas e usar o repositrio localmente no diretrio que voc montou pela rede.
68
www.hachitecnologia.com.br