Apostila Git
Apostila Git
Apostila Git
João Pessoa - PB
2017 - V1.0.0
Angelo Medeiros Nóbrega
João Pessoa - PB
2017 - V1.0.0
Lista de ilustrações
2 A ESTRATÉGIA DE RAMIFICAÇÃO . . . . . . . . . . . . . . . . . 7
2.1 Os branches . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.1.1 O branch master . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.1.2 O branch develop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.1.3 O branch feature . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2.1.4 O branch release . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
2.1.5 Os branches hotfixes e bugfixes . . . . . . . . . . . . . . . . . . . . . . . 11
4 OS 3 ESTÁGIOS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
4.1 Criando um repositório . . . . . . . . . . . . . . . . . . . . . . . . . . 15
4.2 O primeiro estágio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
4.3 O segundo estágio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
4.4 O terceiro estágio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
Finalizando . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
REFERÊNCIAS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
5
Capítulo 1
Antes de começar a utilizar o git para versionar seus trabalhos (códigos, imagens,
layouts...) você deve entender o que é controle de versão. Após entender esse conceito você
estará apto a usar todo o poder que o git proporciona.
O controle de versão(CV) é um sistema usado para ter controle sobre todas(isso se
for usada corretamente) as mudanças feitas em um determinado arquivo. O CV permite
você reverter sua aplicação que se encontra em um estado que está apresentando um bug,
para um estado anterior onde o bug não havia se manifestado. Permite você também
descobrir quem introduziu um problema, quando foi introduzido e onde foi introduzido.
Se estiver usando um repositório remoto, você não correrá o risco de perder seu arquivos e
melhor ainda, você também não perderá o controle sobre as mudanças feitas localmente.
O controle de versão ajudará na organização, facilitará na hora de trabalhar em
equipe, sem aquela história de dois desenvolvedores alterarem o mesmo arquivo ao mesmo
tempo por estarem desenvolvendo um mesmo projeto. Segurança, vocês desenvolverão
todos os projetos sem medo de perder algum código ou acabar errando alguma atualização
sem ter como voltar. Você verá que existem muitas outras razões para usar um sistema
para controle de versão.
Muitas vezes o controle de versão é confundido com backup, lembre-se que no
controle de versão você terá acesso ao arquivo atual e todas alterações ligadas ao arquivo
e, no backup você terá acesso apenas a última versão do arquivo.
Lembre-se também que todas essas features que o controle de versão oferece só
existirão se forem usadas corretamente.
1.1 O Git
O Git é a ferramenta que você utilizará para fazer todo o controle de versão. O Git
surgiu quando Linus Torvalds, o criador do Linux, começou a enfrentar problemas quando
desenvolvia o kernel do linux (projeto open source, ou seja, o Linus trabalhava com apoio
de uma comunidade para seu desenvolvimento) com as ferramentas de versionamento da
época havendo a necessidade da criação de uma nova ferramenta. A proposta para o Git
era aprensentar algumas features que o sistema antigo não oferecia:
Capítulo 1. Antes de tudo, o que é controle de versão? 6
1. Velocidade;
2. Projeto simples;
4. Completamente distribuído;
5. Capaz de lidar com projetos grandes como o núcleo o Linux com eficiência (velocidade
e tamanho dos dados).
Desde 2005 quando o Git foi criado ele passou por um longo período de evolução e
ainda continua. Hoje ele está em uma versão estável oferecendo todas as features citadas
acima.
1.2 O GitLab
O GitLab nada mais é que um gerenciador de repositório git remoto. O Gitlab
apresenta algumas vantagens em relação ao Github:
2. Espaço ilimitado (futuramente será cobrado por projetos maiores que 5Gb), atual-
mente o GitHub limita em 1GB por projeto;
1.3 O Git-flow
O git-flow é uma extensão do git para auxiliar o controle de versão usando comandos
pré-definidos como boas práticas nesse quesito. Na minha opinião o git-flow é muito mais
do que uma simples extensão, é uma filosofia, é uma nova maneira de pensar sobre o
controle de versão.
Você pode aplicar a metodologia do git-flow sem a necessidade de ter ele instalado,
usando apenas comandos nativos do git.
7
Capítulo 2
A estratégia de ramificação
2.1 Os branches
Na estratégia que iremos adotar vamos trabalhar com seis tipos de ramos, são eles,
dois ramos principais e quatro tipos de ramos de apoio.
Os ramos principais são os ramos master e o develop. Os ramos de apoio serão os
branches feature, release, hotfix e buxfix. A seguir irei descrever cada um desses ramos.
Fonte: (http://nvie.com/posts/a-successful-git-branching-model/)
um bug for encontrado no processo de testes, esse processo está representado na figura 2.
Se o código aprensentar bug, será criado outro branch a partir do branch develop para a
correção dos bugs e posteriormente mesclado com o branch master.
Os branches master e develop possuem “vida infinita”, ou seja, eles sempre estarão
presentes durante o desenvolvimento, e sempre serão criados quando o repositório for
Capítulo 2. A estratégia de ramificação 9
Fonte: (http://nvie.com/posts/a-successful-git-branching-model/)
inicializado(isso se você estiver usando o git-flow, por padrão o git cria apenas o master).
Os branches a seguir terão vida curta, eles serão criados durante a evolução do projeto e,
após suas utlizações eles serão finalizados e excluídos, esse processo firará mais claro na
prática.
Ao contrário do ramo master e develop, o ramo feature pode ser criado múltiplas
vezes, uma para cada nova funcionalidade. Esse branch possui como prefixo feature/*,
onde o asterisco(*) será substituido pelo nome do “sub-ramo” digamos assim, por exemplo,
feature/cadastrodeclientes, feature/teladelogin.
Fonte: (http://nvie.com/posts/a-successful-git-branching-model/)
Fonte: (http://nvie.com/posts/a-successful-git-branching-model/)
deve está se perguntando porquê um branch que inicia-se no develop tem que terminar no
develop. Isso acontece porquê o branch develop tem que ter a mesma tag do branch master.
O prefixo usado pelo branch release é release/* onde o asterisco(*) deve ser
substituido pela tag da realese, por exemplo, release/0.1.0. Mais na frente iremos aprender
um conjunto de regras para a criação dessas tags, conhecido como versionamento semântico.
Sempre quando falo que um branch “termina” ou “finaliza”, me refiro a mesclagem
de um branch em outro usado por padrão pelo git-flow.
versões.
Análogo ao branch release o prefixo do branch hotfix é hotfix/*, onde o asterisco(*)
deve ser substituido pela nova tag, por exemplo, hotfix/0.1.1.
Fonte: (http://nvie.com/posts/a-successful-git-branching-model/)
O branch bugfix deve ser criado quando um bug é encontrado durante o desenvolvi-
mento. Ele é iniciado e finalizado no branch develop. Seu prefixo é semelhante ao do branch
feature, por exemplo, bugfix/erro-cadastramento.
13
Capítulo 3
Nessa etapa vamos supor que todos estejam com o Git e o Git-flow instalados, caso
haja a necessidade de um guia para as instalações, esse será adicionado como apêncide no
final livro em futuras versões.
Fonte: (http://cmder.net/)
Capítulo 3. Primeiros passos com o Git 14
Com o seu console aberto digite git e aperte enter, isso irá verificar se o git foi
instaldo corretamente. Se ele tiver sido instalado corretamente irá aparecer algo semelhante
a figura 7.
Com o git devidamente instalado vamos começar a configuração. Para isso insira
os seguintes comandos, o primeiro será para o git identificar seu nome, e o segundo seu
email(figura 8):
Capítulo 4
Os 3 estágios
Nesse capítulo ensinarei a criar seu primeiro repositório git e, quais são os três
principais estágios do processo para o versionamento usado pelo git.
O processo de verificação da pasta foi feito apenas para mostrar que quando o
repositório é inicializado o git cria uma pasta oculta. Nessa pasta oculta estão todos os
arquivos necessário para o git gerenciar seu repositório. Na prática você usará apenas o
comando git init.
Capítulo 4. Os 3 estágios 16
Como mostra a figura 11, no segundo estágio encontra-se apenas o primeiro hel-
loWorld. Peço desculpas pela falta de criatividade ao nomear os elementos.
Na maioria das vezes é necessário adicionar mais de uma arquivo ao terceiro estágio
e não é viável adicionar um por um. Uma alternativa mais eficiente para essa situação é
usar o comando “git add .”, ele irá adicionar todos os arquivos ao terceiro estágio. Preste
atenção no ponto seguido do add, ele também faz parte do comando.
A primeira maneira deve ser usada quando você fez poucas alterações, e você
consegue descrever todas esses mudanças em apenas uma linha usado o commando git
commit -m "comentario". A segunda maneira deve ser usada quando for preciso descrever
diversas alterações e apenas uma linha não basta. Uma dica é, evite usar acentuação
dentro dos comentários, quando a acentuação é usada, algumas vezes quando você for
visualizar os commits a acentuação poderá não ser reconhecida pelo console.
19
Capítulo 5
Nesse capítulo irei apresentar os principais comandos usados pelo git e sempre
estarei dando algumas dicas.
• git log --pretty=oneline -2, o parâmetro -2, faz com que o comando exiba
apenas os dois últimos commits(você pode alterar o parâmetro por qualquer outro
valor).
• git log --stat -2, exibe um resumo das alterações dos últimos dois commits;
Na figura 16 as linhas que começam com um símbolo de mais(+) indica algo que
foi adicionado. Se começar com o símbolo de menos(−) significa que algo foi retirado. Os
números entre os símbolos de (@) indicam as posições das linhas onde houveram alterações.
Quando vocês estiverem praticando isso ficará mais claro.
Observe que quando você cria um branch o git já inicia dentro do novo branch. Irei
listar abaixo os principais comandos relacionados a manipulação dos branches.
Capítulo 5. Comandos mais usados no git 22
• git branch -a, exibe os branches locais e os remotos(se você tiver trabalhano com
branches remotos);
Fonte: (https://stackoverflow.com/questions/16666089)
figura 19 quando o elemento E foi mesclado com o elemento D dando origem ao elemento
R, o elemento E foi reescrito com outro commit, isto é, com outro hash. Então para alguém
de fora que tenha o elemento E vai ter um commit diferente do seu, apesar de ser o mesmo
elemento, tornando algo confuso.
Fonte: (https://stackoverflow.com/questions/16666089)
O rebase é aconselhado apenas quando você está trabalhando localmente, a não ser
que você saiba o que está fazendo. Caso contrário, use sempre o merge. A documentação
do git descreve diversos parâmetros que podem e devem ser usados, tanto para o rebase e
para o merge.
• git reset HEAD~2 --hard, desfaz todas as alterações dos dois últimos commits;
Entendendo a figura 20. Veja que antes do reset existia o arquivo helloWorld2. No
final do processo além de apagar o arquivo helloWorld2, as alterações feitas no arquivo
helloWorld também foram desfeitas apesar de não mostrar na figura. Essas mudanças
Capítulo 5. Comandos mais usados no git 24
aconteceram porquê o arquivo heloWorld2 foi criado no commit eddcb203a como pode ser
observado nos comentários do commit mostrado no log e, o conteudo do arquivo helloWorld
ocorreu no commit 2bf2040e30. Por isso a importância de documentar corretamente os
commits.
Você pode combinar diversas técnicas para voltar versões usando o git. Quando
forem ganhando mais segurança no que estão fazendo, o processo de voltar versões irá se
tornar algo natural. Por exemplo, você pode criar um novo branch a partir do qual queira
voltar uma versão, e depois mesclar esse novo branch com o branch principal. Depende
apenas da sua engenhosidade, então façam diversos testes usando o git para adquirir
experiência.
irá retirar o arquivo do segundo estágio, ou seja, do monitoramento e a partir disso ele
passará a ser ignorado normalmente, caso queira retirar uma pasta completa use o comando
• git config --global http.proxy "", altera o proxy de manual para nenhum
• git config --global --unset http.proxy, outra maneira para desativar o proxy
27
Capítulo 6
Na seção 1.2 falei brevemente sobre o gitLab. Nesse capítulo iremos estudar como
o git se comporta trabalhando com repositórios remotos e faleremos sobre algumas
características do gitLab.
Antes de começar a usar os comandos das próximas seções será necessário a criação
de uma conta no gitLab.
você vem seguindo a apostila desde os primeiros capítulos, esse processo de configuração
já foi realizado na seção 3.1. As etapas 2, 3 e 4, serão casos situacionais.
A etapa 2 deve ser usada quando não existe um repositório local. A primeira linha
da etapa 2 irá criar um repositório local, a partir do repositório remoto, na pasta atual em
que seu console se encontra. A segunda linha serve para acessar a pasta do repositório. A
terceira linha (opcional) criará um arquivo em branco com o nome README.md. A quarta
linha como já devem saber, adiciona o arquivo README.md para o terceiro estágio. A
quinta linha realizará o commit. E a última linha irá adicionar o arquivo README.md
que foi criado localmente para o repositório remoto, ao branch master remoto.
A etapa 3 deve ser utilizada quando você quer iniciar um repositório local e, em
seguida fazer a conexão do repositório criado localmente com o repositório remoto. A
primeira linha serve para acessar a pasta do repositório. A segunda é utlizada para criar
o repositório local. A terceira linha será responsável em estabelecer a conexão entre o
repositório local e o remoto. As linhas seguintes vocês já sabem suas devidas aplicações.
A etapa 4 deve ser usada quando já existe um repositório criado localmente.
Novamente, a segunda linha irá estabelecer a conexão entre os repositórios. A terceira
linha adionará todos os branches locais ao repositório remoto. A quarta linha (opcional)
irá adiconar todas as tags criadas, caso existam.
Lembre-se de verificar os tipos de protocolos que estão utilizando. Se tiver em
Capítulo 6. Trabalhando com repositório remoto 30
dúvida em qual utilizar opte pelo protocolo HTTPS. Lembre-se também de configurar o
proxy do seu local de trabalho caso seja necessário.
• git push -u origin master, sobe o branch master para o repositório remoto, usei
como exemplo o master, mas você pode usar qualquer outro branch que tenha criado;
• git push -u origin --tags, sobe as tags criadas (haverá uma seção apenas para
tags).
Capítulo 6. Trabalhando com repositório remoto 31
• git pull origin master, desce os arquivos do branch master localizado remota-
mente para o branch local atual;
• git pull, esse comando é usado quando para atualizar a lista de branches, por
exemplo, vamos supor que você tenha criado um branch remotamente, esse novo
branch criado não será exibido na sua máquina local até você atualizar a lista (o
comando para visualizar os branches está descrito na seção 5.2).
A versão MINOR tem que garantir compatibilidade apenas com a versão MAJOR. A
versão de correção (PATCH) tem que garantir compatibilidade com todas as versões acima
dela. Se por exemplo, ocorrer quebra de compatibilidade quando a correção de um bug for
feita, deve ser criada uma nova versão MINOR. Esses e outros detalhes estão especificados
na documentação.
Rótulos adicionais para pré-lançamento(pre-release) e metadados de construção(build)
estão disponíveis como extensão ao formato MAJOR.MINOR.PATCH.
Capítulo 6. Trabalhando com repositório remoto 33
onde as letras X, Y e Z devem ser substituídas pelo número da versão seguindo as regras
do versionamento semântico visto na seção 6.6.1.
A seguir estão descritos outros comandos relacionados com as tags:
Agora existem dois branches com o mesmo arquivo, mas com conteúdos diferentes
(ver figura 26) e, em commits distintos.
Capítulo 7
• git flow feature start nomeDaFuncionalidade, esse comando irá criar um novo
branch chamado nomeDaFuncionalidade;
Diferente do git, independente de qual branch você esteja, o branch feature sempre
será iniciado do branch develop.
Para fazer um push de um branch feature você usará o seguinte comando:
• git flow feature publish nomeDaFuncionalidade, esse comando irá fazer o push
do branch chamado nomeDaFuncionalidade;
Para fazer o pull aconselho usar o git de maneira usual. Mas pode ser feito usando
o git-flow com o comando:
• git flow feature pull origin nomeDaFuncionalidade, esse comando irá fazer
o pull do branch chamado nomeDaFuncionalidade;
• git flow feature pull origin telaDeLogin, faz o pull do branch telaDeLogin;
Perceba que as únicas coisas que mudaram nos comandos foram as partes centrais,
start, publish e finish. Esse padrão irá se repetir para os outros tipos de branches.
Capítulo 7. Trabalhando com o Git-flow 38
• git flow release start X.Y.Z, esse comando irá criar um novo branch chamado
X.Y.Z ;
• git flow hotfix start X.Y.W, esse comando irá criar um novo branch chamado
X.Y.W ;
• git flow bugfix start erroCarrinhoCompras, esse comando irá criar um novo
branch chamado X.Y.W ;
Fonte: (https://danielkummer.github.io/git-flow-cheatsheet/index.html)
40
Finalizando
Essa apostila teve como objetivo plantar uma sementinha na mente de vocês sobre
o controle de versão, suas vantagens e como ele tornará seu desenvolvimento mais ágil e
seguro.
Existem diversas outras questões a serem abordadas e outras ferramentas. Agora
depende apenas de você, pesquisar mais sobre o assunto e praticar.
41
Referências
MOTA, F. J. Git Flow – Uma forma legal de organizar repositórios git. Disponível
em: <https://fjorgemota.com/git-flow-uma-forma-legal-de-organizar-repositorios-git/>.
Acesso em: 29 ago. 2017.
WHAT’S the difference between ’git merge’ and ’git rebase’?: stack-
overflow. Disponível em: <https://stackoverflow.com/questions/16666089/
whats-the-difference-between-git-merge-and-git-rebase/16666418#16666418>.
Acesso em: 25 ago. 2017.